1
package override;

class Super
{
    public void dosomething()
    {
        System.out.println("hello Super");
    }
}

class sub 
    extends Super
{
    @Override
    public void dosomething()
    {
        System.out.println("hello sub");
    }
}

public class Main 
{
    public static void main(String[] args) 
    {
        Super p1=new Super();
        Super p2=new sub();  // Please explain why this line is correct as constructor and //class name should be same
        p1.dosomething();
        p2.dosomething();
    }
}

当我创建具有不同类名和不同构造函数名称的对象时,如何调用方法。就像上面突出显示的语句有不同的调用构造函数的方式

4

3 回答 3

1
 Super p2=new sub();
 p2.doSomething();

这称为运行时多态性(方法覆盖)。

编译器不调用由变量类型定义的方法(即本例中的 super)。这种行为被称为虚拟方法调用,并展示了 Java 语言中重要的多态特性的一个方面。

http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

对象 p2 是 Super 类型。但是 p2 指的是 sub。所以编译器在运行时运行子类中的 doSomething() 。超类有方法 doSomething()。

但是如果你在 sub 中说 eat()

Super p2=new sub();
p2.eat(); // not possible

超类没有方法eat()。

于 2013-04-19T04:51:29.063 回答
0

p2 只是引用对象 new sub() 对象。现在 p2 只能调用 Super 类中存在的那些方法,而 Sub 已经覆盖了它们。这是运行时多态性。

于 2013-04-19T05:05:20.347 回答
0

多态性是您正在使用的。

如果我们将 Super 更改为 Animal 并将 Sub 更改为 Cat 那么您有:

Animal p1 = new Cat();

你能把猫当作动物吗?当然,因为猫是动物(因为猫扩展了动物)。

当您调用doSomething方法时,VM 会查看您使用的类型并在new那里查找方法。如果找到它,那么它会调用那个,否则它会查看它的父类。这称为方法覆盖,这就是多态性的工作方式。

于 2013-04-19T04:41:46.270 回答