当我创建一个具有不同类名和不同构造函数名的对象时,如何调用方法

时间:2013-04-19 04:37:14

标签: java

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();
    }
}

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

3 个答案:

答案 0 :(得分:1)

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

这称为运行时多态(Method Overriding)。

编译器不会调用由变量类型定义的方法(在本例中为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()。

答案 1 :(得分:0)

Polymprphism是你正在使用的。

如果我们将Super改为Animal,Sub改为Cat,那么你有:

Animal p1 = new Cat();

你能把猫视为动物吗?当然,因为猫是动物(因为猫延伸动物)。

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

答案 2 :(得分:0)

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