在这种情况下,我是否可以访问CarSubClass的重写/附加方法?
public Car getCar(){
CarSubClass carSub = new CarSubClass();
return carSub;
}
更新
Car有子类SubClass1,SubClass2,SubClass3。
getCar()可以返回SubClass1,SubClass2或SubClass3。
我可以这样做吗?:
Car car = getCar();
switch(car.getType()){//getType() returns a byte
case SubClass1:
SubClass1 car1 = (SubClass1)car;
break;
case SubClass2:
SubClass car2 = (SubClass2)car;
break;
case SubClass3:
SubClass3 car3 =(SubClass3)car;
break;
default: //don't do anything
}
答案 0 :(得分:1)
仅覆盖方法:
Car car = getCar();
car.method(); // here you can invoke only the overridden methods in CarSubClass
您无法调用引用类型CarSubClass
不知道的Car
的其他方法。 在编译过程中会失败。
可能这是可能的,但你必须确定你在这里做了什么:
CarSubClass c = (CarSubClass)getCar();
c.subClassSpecificMethod();
上述转换在您的情况下是安全的,因为该方法始终返回CarSubClass
的实例。不过最好还是进行检查。
Car c = getCar();
if(c instanceof CarSubClass){
((CarSubClass)c).subClassSpecificMethod();
}
switch(c.getType())
这不是有效的切换键。
Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。
答案 1 :(得分:1)
是的,通过动态输入/调用,它将可用。这是多态性的全部目的。
但是因为你要返回一个Car实例,无论哪个类调用'getCar()'
必须先将它转换为'CarSubClass'。 击>
public class Car {
public void a() {
System.out.println("In Car");
}
}
enter code herepublic class CarSubClass extends Car {
@Override
public void a() {
System.out.println("In CarSubClass");
}
public static void main(String[] args) {
Car c = new CarSubClass();
c.a();
}
}
将输出:
'In CarSubClass'
修改:我已编辑了我的答案。这整个概念称为多态。您不需要强制转换,因为在运行时,变量保持的动态类型将确保调用正确的方法。
答案 2 :(得分:0)
除非您将其投放到CarSubClass
。请参阅下面的示例(虽然非常糟糕):
public class Test {
public static Car getCar() {
return new SmallCar();
}
public static void main(String[] args) throws Exception {
((SmallCar) getCar()).getMake();
}
static class Car {
String model;
public String getModel() {
return this.model;
}
}
static class SmallCar extends Car {
String make;
public String getMake() {
return this.make;
}
}
}
祝您好运......