返回子类而不是类

时间:2013-08-01 13:48:30

标签: java subclass superclass

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

}

3 个答案:

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

这不是有效的切换键。

JLS§14.11

  

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

答案 1 :(得分:1)

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

但是因为你要返回一个Car实例,无论哪个类调用'getCar()' 必须先将它转换为'CarSubClass'。

Car.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'

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

答案 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;
        }
    }
}

祝您好运......