这是一个例子:
public abstract class Solid{
//code...//
public abstract double volume();
}
这是一个扩展 Solid 的类
public class Sphere extends Solid{
//code...//
public double volume(){
//implementation//
}
}
现在,如果我想做这样的事情,我是否必须沮丧?
public class SolidMain{
public static void main(String[] args){
Solid sol = new Sphere(//correct parameters...//);
System.out.println(sol.volume());
}
我知道当编译器找不到正确的方法时就会发生编译时错误。由于对象
Sol
是Solid
类型,只有abstract volume();
方法,那么编译器会报错吗?我是否必须将 Sol
向下转换为 Sphere
对象才能使用 volume()
方法?
我是否必须将 Sol 向下转换为 Sphere 对象才能使用 Volume() 方法?
不,
Solid
引用就可以正常工作,因为volume()
方法已在那里声明。
System.out.println(sol.volume());
会调用Sphere的volume(),sol只是一个对象(本例中为Sphere)的引用变量,不需要强制转换它。
如果您在 Sphere 类中定义了一些其他方法,但其父类(Solid)中不存在,例如
public class Sphere extends Solid{
//code...//
public double volume(){ //implementation// }
public void extraFeature(){ //something extra }
sol 对象可以使用 extraFeature 方法,因为它隐式地将自身从 Solid 类向下转换为 Sphere 类
但是,如果 Solid 类不是抽象类,则不会进行向下转换,您需要通过以下方式手动执行此操作:
public class SolidMain{
public static void main(String[] args){
Solid sol = new Sphere();
Sphere sol2 = (Sphere) sol; // you need to create another obj and store it there
System.out.println(sol2.extraFeature());
}