在超类中调用方法使用子类的对象如何工作?

时间:2016-10-15 20:17:48

标签: java inheritance casting polymorphism dynamic-binding

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如何处理这个方法,它不是在子类中而是来自子类的对象?

3 个答案:

答案 0 :(得分:0)

当你这样做时:

SuperClass a = new SubClass();

您说要创建SubClass的实例,您只希望SuperClass中声明的方法可见。如果您在SubClass中声明了任何新方法,则它们将不可见。

该对象仍然可以使用SubClass实现(即当你覆盖它们时)。尚未被覆盖的方法将使用继承的实现。

答案 1 :(得分:0)

SubClassmethod 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