当前位置: 首页 > 知识库问答 >
问题:

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

长孙德惠
2023-03-14

这是我的代码想要使用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
    }
}

}

共有3个答案

齐俊贤
2023-03-14

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

if(adapter instanceof Adapterver1) {
    ((AdapterVer1)adpater).getAdaptObj1();
}

这样,如果您的代码尝试处理未声明此类方法的新子类,则您的代码将更加安全。

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

燕鸿文
2023-03-14

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

益泰平
2023-03-14

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

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

记住:-

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

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

 类似资料:
  • 问题内容: 我有以下课程 这只是我实际架构的简化版本。最初,我不知道需要创建的人员类型,因此处理这些对象创建的函数将常规对象作为参数。 现在,我想使用此父类对象访问子类的方法。我还需要不时访问父类方法,所以 我不能 使其 抽象 。 我想我在上面的示例中简化太多了,所以这是实际的结构。 if语句显示“无法为QuestionOption找到getMultiple”。OuestionOption具有更多

  • 这是一个与实现相关的问题,或者我可能想多了。假设我有一个子类继承了父类。根据我的理解,它将继承父类的方法定义,而不是构造函数。我们需要通过超级方法调用提供或编译器将提供构造函数。我们这样做的原因是,如果没有父类对象实例,我们从子类中的父类获得的方法定义将不存在。 这是否意味着,当我调用父类对象定义的方法(该方法尚未在子类中重写)时,将在父对象实例的子类内部调用?我在想,由于子类会调用父类构造函数并

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 问题内容: 我想要进行属性调用,例如返回某种方法的结果。我怎样才能做到这一点? 编辑:我很快问:看起来我可以用 这样行吗? 问题答案: 使用属性装饰器 使用__dict__进行处理很脏,尤其是在@property可用时。

  • 既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。

  • 我在学习Java,同时试图理解继承。我不明白为什么子类walk()中重写的方法执行了,而另一个xyz()方法却没有执行。 我的问题是,如果下面的方法调用工作正常,并调用士兵方法walk,