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

当子类对象具有父类型的引用并且父类不具有相同的子类方法[重复]时,无法访问子类方法

邓昀
2023-03-14

无法使用下面的行从子类访问方法,

Parent p = new Child(); p.print();

假设我在子类中有一个方法print(),而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。

可能没有这样的现实生活场景,但试图理解为什么我无法访问子类print()使用类型为父的子对象,如果我们没有在父类中定义相同的方法。

示例代码如下:

public class Main {

    public static void main(String[] args)
    {

        Parent p = new Child();
        p.print(); //Compiler throws an error saying "cannot resolve print method".


    }

}

class Parent {
    int x = 10;


}

class Child extends Parent {

    void print(){
        System.out.println("Child");
    }

    int x = 20;
}

更多解释——如果我在父类中定义了print()方法,那么我可以使用父类型的对象访问子类print()方法。所以我假设我们不能说父类型的对象只能访问父类中定义的成员/方法。

此外,我知道我们可以通过将父类型强制转换为子类型来访问子方法。我想知道为什么我们不能在不强制转换的情况下访问子类方法,如果我们不在父类中定义相同的方法。

我编辑了这个问题,以确保这与另一个问题没有关系——从超类调用子类方法

共有2个答案

通京
2023-03-14
Parent p = new Child();

您正在创建具有子类的父对象。因此,很简单,父对象p没有print()方法。但是子对象具有方法print(),因此如果创建子对象,则可以从子类访问方法print()。

这里方法的优先级开始发挥作用。如果您在两个类中都有print()方法,那么子类方法优先于父类方法。

注意:继承是单向的,而不是双向的。

太叔岳
2023-03-14

当父级没有声明方法(作为具体或抽象方法)时,当在父变量内实例化时,子级将无法使用该方法。您可以使用以下代码示例来使用它

Parent p = new Child(); 
if(p instanceof Child){
    ((Child) p).print();
}

这背后的解释是,变量p实际上不知道在运行时存储在其中的子实例是什么(可能有几个子实例,只有一个子实例具有print()方法)。在编译时,您可能知道存储在父p中的对象的真实类型,但执行是另一个世界。因此,如果p对象是Child的实例,这意味着p被类型化为Child或其子对象之一,则可以将其强制转换为((Child)p),所有方法都将被识别为子对象(因为它是)。

注意,您可以强制转换一个不是Casteable的类,并且您将拥有一个ClassCastException。在这个具体的示例中,编写if句子是没有必要的,因为我们对p类型很确定,但是在运行时的某些时候事情会变得混乱,我们不知道什么存储在哪里,因此确保您的强制转换的健全性变得至关重要。谈到强制转换变量,如果您只希望孩子类访问方法print,而不是它的子类,您可以使用

Parent p = new Child(); 
if(p.getClass() == Child.class){
    ((Child) p).print();
}

如果你不想强制转换子类,并且你的父类适合让方法print(并不总是一个选项),正如你所说,你可以在父类中声明它为一个具体的方法,并覆盖子类中的方法)

class Parent {
    int x = 10;
    void print(){
        System.out.println("Parent");
    }
}

或者您可以在父级中声明该方法为抽象,所有子级都必须实现它,但这样您就无法创建父级的对象,只要它必须是抽象的。

abstract class Parent {
    int x = 10;
    abstract void print();
}

恢复,如果父级有一个子级,则子级将拥有父级的所有方法,但只要是父级,就不会拥有子级的任何方法。将需要强制转换。如果方法print在子级和父级中写入,则最低的覆盖方法将是执行的方法(在本例中为子级)。作为额外的,您可以使用在父级中使用“超级”实现的方法(与在构造函数中相同)

class Child extends Parent {

    void print(){
        super.print("Child");
    }

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

  • 我是java初学者,我不理解这行代码是什么意思 平均值。为什么不能访问自己的方法。请详细解释如果类A正在实例化,那么为什么它的方法不可访问。

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

  • 为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会

  • 问题内容: 从子类对象调用该方法时,是否有任何优雅的方法可以使位于父类中的Java方法返回子类的对象? 我想在不使用其他接口和方法的情况下实现此功能,并在没有类强制转换,辅助参数等的情况下使用此功能。 更新: 抱歉,我不太清楚。 我想实现方法链,但是父类的方法存在问题:调用父类方法时,我无法访问子类方法… 我想我已经提出了我的想法的核心。 因此,方法应返回类的对象。 问题答案: 如果您只是在寻找针

  • 问题内容: 我有下表: 我想让Folder类具有父子关系。 问题答案: 我相信正确的映射将是: 该会的工作只有当每个家长有最多一个孩子,上面的代码适用于更一般的情况下,父母可以有许多儿童。另外,为简单起见,我省略了get / set方法。