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();
}
}
当我创建具有不同类名和不同构造函数名的对象时,如何调用方法。与上面突出显示的语句一样,有一种不同的方式来调用构造函数
答案 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重写了它们。这是运行时多态性。