使用 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。
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。