我试图把头放在Java继承中。到目前为止,我了解如果我以以下方式声明对象:Superclass object = new Subclass(),则创建的子对象仅限于父对象的方法。如果我想访问孩子的其他方法,我将不得不转换为孩子。
但是为什么在子类中仍然重写方法。

这是我的例子

public class Parent {

    public Parent() {

    }

    public void whoAmI(){
        System.out.println("I'm a parent");
    }

}
public class Child extends Parent {

public Child() {

}

public void whoAmI(){
    System.out.println("I'm a child");
}

public void childMethode() {
    System.out.println("Foo");

}
}

public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<Parent> list = new ArrayList<>();

    Child c = new Child();
    Parent p = new Parent();
    Parent pc = new Child();

    c.whoAmI();
    p.whoAmI();
    pc.whoAmI();

    // Access child methodess
    ((Child) pc).childMethode();

    list.add(c);
    list.add(p);
    list.add(pc);

    System.out.println(list.size());

}

}
pc.whoAmI()打印“我是孩子”。为什么不显示“我是父母”?

最佳答案

为避免混淆,请务必了解您创建的子类对象始终包含所有方法。垂头丧气是不容小;的;您只需将同一对象视为子类型的实例即可。

结论:您永远不能通过向下转换来更改对象的行为。由此直接得出的结论是,您始终将访问相同的重写方法,而永远不会访问超类中的方法。

这种行为使您可以将不同的行为替换为相同的已声明超类型。它被称为多态,是Java编程(通常是OOP)的主力军。没有它,一开始就没有类层次结构的意义。至少,它会有用得多。

09-28 10:27