有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我能够访问父类中的子方法?

我在理解Java中的继承时遇到了一个问题:当我将子类转换回父类时,我能够访问子类的重写方法

例如,给出了以下两类:

父对象:

public class Parent {
    public void whatAreYou() {
        System.out.println("parent");
    }
}

和子类:

public class Child extends Parent {
    @Override
    public void whatAreYou() {
        System.out.println("child");
    }

    public void onlyChildrenCanDoThis() {
        //...
    }

}

当我现在执行以下操作时:

        Child c = new Child();
        Parent p = c;
        p.whatAreYou();

我得到这个输出:

child

这对于我理解Java中的继承是非常奇怪的。我希望得到parent输出,因为我将子类缩小到父类,这样我就可以访问父类的变量和方法

这是使用p.onlyChildrenCanDoThis(),因为我无法访问它,因为它没有在父类中实现

。。。但是对于被覆盖的方法,Java的行为不是这样的为什么


共 (3) 个答案

  1. # 1 楼答案

    以下是你所做的

    child c = new child();

    您创建了子类的对象,并将其引用指定给c

    parent p = c;

    在这里,您已将子对象的引用复制到p。请记住,该对象仍然是子对象,而不是父对象

    p.whatAreYou();

    这里你称之为whatAreYou方法。您正在使用指向子对象的引用变量p调用它。因此将调用child的方法。 enter image description here

    另一种解释

    enter image description here

  2. # 2 楼答案

    你要处理的是polymorphismc被实例化为new child(),这就是为什么child作为输出。p属于parent类型的事实并没有改变这个事实,它仍然指向child的实例

  3. # 3 楼答案

    由于行parent p = c;的缘故,输出保持原样

    想象一下:

    class Car {
        public void whatAreYou() {
            System.out.println("Car");
        }
    }
    
    class Cadillac extends Car {
        public void whatAreYou() {
            System.out.println("Caddillac");
        }
    }
    

    如果你现在说

    Cadillac coolCar = new Cadillac();
    Car testCar = coolCar;
    testCar.whatAreYou();
    

    很明显,输出是“凯迪拉克”,不是吗?以下是您看待继承的方式:

    凯迪拉克的物体总是汽车。汽车对象可以是凯迪拉克

    由于我显式地将凯迪拉克引用coolCar设置为指向凯迪拉克的一个对象,将汽车引用testCar设置为指向同一个对象,因此我们得到了输出“凯迪拉克”

    更明显的是,你甚至可以说

    Car coolCar = new Cadillac();
    Car testCar = coolCar;
    testCar.whatAreYou();