适用于初学者的Java继承

时间:2012-12-02 14:58:11

标签: java oop inheritance

我正试图在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()打印“我还是个孩子”。为什么不打印“我是父母”?

5 个答案:

答案 0 :(得分:4)

为避免混淆,请务必了解您创建的子类对象始终包含所有方法。倾斜是一种无操作;您只需将同一个对象视为子类型的实例。

推论:你永远不能通过向下转换来改变对象的行为。由此可以直接得出相同的重写方法,而不是超类中的方法。

这种行为允许您为同一声明的超类型替换不同的行为。它被称为多态,是Java编程的主力,也是OOP的主力。没有它,首先要有一个类层次结构是没有意义的。至少,这将是非常有用的。

答案 1 :(得分:1)

为什么这是一个难以回答的问题,这是Java团队很久以前做出的设计决定。

他们认为所有方法都是virtual,除非它们被明确标记为静态。在某些语言中,它是另一种方式(默认情况下方法是静态的,除非声明为虚拟),它没有真正的区别。

重要的是理解how static and virtual methods work。 (或者有时在Java中调用它们:实例和类/静态方法。)

答案 2 :(得分:1)

您可以将继承视为创建名为super的隐藏成员。

Java中的每个对象实例都有自己的常量类型。你不会在施法时改变它。在演示时,您只需对Java说,您确定此对象属于子类型。

覆盖的方法仍然被覆盖,这是Java的意识形态。如果你了解C ++,你可以说Java中的所有函数都是虚函数。

答案 3 :(得分:0)

class Person{

   public void run(){
       //running

   }

}

class OneLeggedPerson extends Person{
    @Override
    public void run(){
        //cant run have only one leg
   }
}


Person p = new OneLeggedPerson();
p.run();    //cannot as it is actually a one legged person


Hope that makes sense now..

答案 4 :(得分:0)

假设您是Apple,而且您正在销售iPod。

在一个工厂和另一个工厂之间建立iPod的方式可能存在细微差别,或者在iPod的第一个版本与最后一个版本之间建立,因为这个过程已经发生了变化。

你,Apple,知道你建立了什么样的iPod:

IPodWithFirstWayOfBuildingIt ipod = new IPodWithFirstWayOfBuildingIt();

IPodWithSecondWayOfBuildingIt ipod = new IPodWithSecondWayOfBuildingIt();

但是最终客户(即代码的其余部分)并没有对iPod的构建方式大加妄为。对他而言最重要的是iPod的工作和行为就像一个iPod(它在商业广告中,或在最终用户手册中,或在Ipod类的javadoc中显示)。他并没有要求商店“给我一个带有第一种方法来制作它的iPod”。但实际情况是,无论是第一种构建iPod的方式,还是构建它的第二种方式,他都能获得iPod。而他称之为“iPod”的事实并没有改变iPod的构建方式,因此:

IPod iPod = new IPodWithFirstWayOfBuildingIt();

就是这样说的。我用它的第一种方式构建了一个iPod,但我会像其他iPod一样使用它,而不关心它是如何构建的。