Java 如何使用父对象引用调用子类的非overide方法

Java 如何使用父对象引用调用子类的非overide方法,java,Java,下面是我希望使用AdapterVersion(父类)的对象引用访问Adapter1 getAdapterObj1()的子类方法(不带类型转换)的代码 你不能那样做。因为在编译时,编译器会检查您调用的方法在您使用的引用类中是否可访问或可见 因此,在这种情况下,由于引用是父类的,编译器将首先在父类中查找方法声明,以便成功编译代码 记住:- 编译器担心引用类型,在运行时会考虑实际的对象类型,以决定实际调用哪个方法 您唯一的选择是类型转换,在这种情况下,编译器现在查看您在其中类型转换引用的类。另一种选择

下面是我希望使用AdapterVersion(父类)的对象引用访问Adapter1 getAdapterObj1()的子类方法(不带类型转换)的代码


你不能那样做。因为在编译时,编译器会检查您调用的方法在您使用的引用类中是否可访问或可见

因此,在这种情况下,由于引用是父类的,编译器将首先在父类中查找方法声明,以便成功编译代码

记住:-

编译器担心引用类型,在运行时会考虑实际的对象类型,以决定实际调用哪个方法


您唯一的选择是类型转换,在这种情况下,编译器现在查看您在其中类型转换引用的类。另一种选择是,您可以在父类中声明一个具有该名称的抽象方法,但从您的问题来看,似乎您还没有明确地这样做。

您不能这样做。因为在编译时,编译器会检查您调用的方法在您使用的引用类中是否可访问或可见

因此,在这种情况下,由于引用是父类的,编译器将首先在父类中查找方法声明,以便成功编译代码

记住:-

编译器担心引用类型,在运行时会考虑实际的对象类型,以决定实际调用哪个方法


您唯一的选择是类型转换,在这种情况下,编译器现在查看您在其中类型转换引用的类。另一个选项是,您可以在父类中声明一个具有该名称的抽象方法,但是从您的问题来看,似乎您还没有明确地这样做。

您需要将方法声明移动到抽象类。

您需要将方法声明移动到抽象类。

Rohit已经很好地解释了这一点。只需添加我的2美分,您应该首先检查子类类型,然后检查typecast,例如:

if(adapter instanceof Adapterver1) {
    ((AdapterVer1)adpater).getAdaptObj1();
}
这样,如果您的代码试图处理一个未声明此类方法的新子类,那么它将更加安全


但您必须问的问题是,如果您已经知道要调用什么子类方法,为什么要从超类引用访问它?

Rohit已经很好地解释了这一点。只需添加我的2美分,您应该首先检查子类类型,然后检查typecast,例如:

if(adapter instanceof Adapterver1) {
    ((AdapterVer1)adpater).getAdaptObj1();
}
这样,如果您的代码试图处理一个未声明此类方法的新子类,那么它将更加安全

但您必须问的问题是,如果您已经知道要调用哪个子类方法,为什么要从超类引用访问它