class SuperClass{
public void print(){
System.out.println("I'm super class...");
}
public void someMethod(){
System.out.println("any thing");
}
}
class SubClass extends SuperClass{
@Override
public void print(){
System.out.println("I'm sub class...");
}
public static void main(String args[]){
SuperClass a=new SubClass();
a.print();
a.someMethod();
}
}
a.print()
称为动态绑定,它知道在运行时调用哪个方法并选择SubClass的方法,因为该对象是SubClass它是真的吗?
a.someMethod()
JVM如何处理这个方法,它不是在子类中而是来自子类的对象?
答案 0 :(得分:0)
当你这样做时:
SuperClass a = new SubClass();
您说要创建SubClass
的实例,您只希望SuperClass
中声明的方法可见。如果您在SubClass
中声明了任何新方法,则它们将不可见。
该对象仍然可以使用SubClass
实现(即当你覆盖它们时)。尚未被覆盖的方法将使用继承的实现。
答案 1 :(得分:0)
SubClass
是method overriding的一个示例runtime polymorphism。也就是说,在运行时它决定是调用子类方法还是超类方法(这里调用someMethod()
方法,因为它被覆盖并匹配参数签名。)
如果SubClass
调用,您尚未在子类中定义它。这意味着,当您从someMethod()
继承Superclass
public
时,someMethod()
会自动获得SuperClass a
。用简单的话来说,SubClass也有SubClass
的定义。这就是JVM如何知道要调用哪种方法。
同样在SubClass
中,变量'a'将存储在堆栈中,而引用将存储在堆中。您已使用someMethod
的构造函数构造了引用。意味着堆栈中的变量“a”指的是堆中的“{{1}}”对象。这就是'a'能够调用{{1}}
答案 2 :(得分:0)
“使用子类对象在超类中调用方法”是Polymorphism in Java的场景之一。
如果子类实现的方法与超类的定义相同,则使用子类的对象调用方法将使用子类的方法覆盖超类的方法。 / p>
因此,如果要使用子类的对象调用超类的方法,请不要覆盖该方法。
SuperClass a=new SubClass();
这个定义使得“a”能够引用类型SuperClass或任何扩展SuperClass的子类。对象“a”是从SubClass创建的,根据定义,该对象可以访问SubClass和SuperClass的方法。这个解释应该解决你的两个问题。
请参阅java文档here。