这是我的代码,想要使用 AdapterVersion(父类)的对象引用访问 AdapterVer1 getAdaptObj1() 的子类方法(不进行类型转换)
abstract class AdapterVersion {
public abstract void getMObject();
public abstract void getCObject();
}
public class AdapterVer1 extends AdapterVersion {
@Override
public void getMObject() {
System.out.println("AdapterVer1 Mont");
}
@Override
public void getCObject() {
System.out.println("AdapterVer1 Conf");
}
public void getAdaptObj1() {
}
}
public class AdapterFactory {
public static void main(String []a){
AdapterFactory adapterFactory= new AdapterFactory();
AdapterVersion adpater = adapterFactory.getMyObject("ver1");
adpater.getAdaptObj1(); // Unable to do that
((AdapterVer1)adpater).getAdaptObj1(); // Working but DONT WANT THIS
}
public AdapterVersion getMyObject(String version){
if(version.equals("ver1")){
return new AdapterVer1();
}else{
return new AdapterVer2(); // another declared class
}
}
}
最佳答案
你不能这么做。因为在编译时,编译器会检查您调用的方法在您正在使用的引用的类中是否可访问或可见。
因此,在这种情况下,由于引用的是 Parent
类,因此编译器将首先查找 Parent 类中的方法声明,以便成功编译代码。
记住:-
编译器担心Reference类型,并且在运行时,会考虑实际的对象类型,以决定实际调用哪个方法。
您唯一的选择是类型转换,在这种情况下,编译器现在会查找您在其中类型转换引用的类。另一种选择是,您可以在父类中声明一个具有该名称的抽象方法,但从您的问题来看,您似乎明确没有这样做。
关于java - 如何使用父对象引用调用子类的 npn 重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14313844/