使用 sub class 的对象在 super class 中调用方法它是如何工作的?

calling method in super class using object of sub class how it work?

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 如何处理这个方法它不在 sub class 和 sub class?

中的对象

当你这样做时:

SuperClass a = new SubClass();

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

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

a.print()method overriding which is runtime polymorphism 的一个例子。也就是说,在运行时它决定是调用 subclass 方法还是 super class 方法(这里调用你的 SubClass 方法,因为它被覆盖并匹配参数签名)。

在调用 someMethod() 的情况下,您尚未在子类中定义它。这意味着,当您从 Superclass 继承它时,您的 SubClass 会自动获得 someMethod(),因为它是 public。简单来说,SubClass也有someMethod()的定义。这就是 JVM 如何知道要调用哪个方法。

同样在 SuperClass a 中,变量 'a' 将存储在堆栈中,而引用将存储在堆中。您已经使用 SubClass 的构造函数构造了引用。这意味着堆栈中的变量 'a' 引用堆中的“SubClass”对象。这就是为什么 'a' 能够调用 someMethod

"calling method in super class using object of sub class"是Polymorphism in Java的场景之一。

如果sub-class实现了与super-class定义相同的方法,以sub-class的对象调用该方法将覆盖super-class 的方法与 sub-class.

的方法

因此,如果你想用sub-class的对象调用superclass的方法,请不要覆盖该方法。

SuperClass a=new SubClass();

此定义使 "a" 能够引用类型超类或任何扩展超类的子类class。由于对象 "a" 是从 SubClass 创建的,根据定义,该对象可以访问 SubClass 和 SuperClass 的方法。此解释应解决您的两个问题。

参考 java 文档 here