如果方法是抽象的,是否需要向下转换?

问题描述 投票:0回答:3

这是一个例子:

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()
方法?

java inheritance compiler-errors polymorphism downcast
3个回答
0
投票

我是否必须将 Sol 向下转换为 Sphere 对象才能使用 Volume() 方法?

不,

Solid
引用就可以正常工作,因为
volume()
方法已在那里声明。


0
投票
System.out.println(sol.volume());

会调用Sphere的volume(),sol只是一个对象(本例中为Sphere)的引用变量,不需要强制转换它。


0
投票

如果您在 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());
}
© www.soinside.com 2019 - 2024. All rights reserved.