0

在这种情况下,我是否可以访问 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

}
4

3 回答 3

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())

这不是一个有效的切换键。

JLS§14.11

表达式的类型必须是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚举类型(第 8.9 节),否则会发生编译时错误。

于 2013-08-01T13:53:00.937 回答
1

是的,通过动态输入/调用,它将可用。这就是多态性的全部目的。

但是由于您要返回一个 Car 实例,因此调用“getCar()”的任何类都必须首先将其转换为“CarSubClass”。

汽车.java

public class Car {

public void a() {
    System.out.println("In Car");
}

}

CarSubClass.java

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'

编辑:我已经编辑了我的答案。这整个概念称为多态性。您不需要强制转换,因为在运行时,变量持有的动态类型将确保调用正确的方法。

于 2013-08-01T13:53:09.327 回答
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;
        }
    }
}

祝你好运...

于 2013-08-01T14:02:26.897 回答