这是示例代码:
package com.ankur.javapractice;
public class SuperClass {
public void someMethod(int val) {
System.out.println("Public method in SuperClass");
}
}
class SubClass extends SuperClass {
public void someMethod() {
System.out.println("Public method in SubClass");
}
public static void main(String[] args) throws InterruptedException {
SuperClass superClassRef = new SubClass();
SubClass subClassRef = new SubClass();
//superClassRef.someMethod(); // (1)
subClassRef.someMethod(8); // (2)
}
}
我了解为什么(1)在编译时无法工作(这就是为什么我将其注释掉了)的原因。由于someMethod()
的类型为superClassRef
并且SuperClass
没有定义SuperClass
,someMethod()
不为someMethod(int)
所知。
我的问题是(2)为什么然后在编译时如何工作?使用与上述相同的解释,在编译时,subClassRef
也不知道SubClass
,因为它的类型为SubClass
,而someMethod(int)
没有定义SubClass
。
编辑和更新:
一些答案指出,someMethod(int)
从SuperClass
继承了candidates = {
"name": [
[
{"tag": "id", "pattern": "(.+)"},
],
],
}
。没错,我了解;我的后续问题是编译器如何能够考虑继承关系?
答案 0 :(得分:1)
是someMethod(int)
是在父类SuperClass
中定义的,但是当子类使用extends
关键字继承父类时,子类将继承其父类的所有公共成员和受保护成员,并且可以直接使用它们,称为Inheritance
子类继承其父级的所有公共成员和受保护成员,无论该子类位于哪个包中。如果该子类与其父级位于同一包中,则它还将继承父级的包私有成员。您可以按原样使用继承的成员,替换它们,隐藏它们,或用新成员补充它们:
答案 1 :(得分:1)
这是因为SubClass继承了someMethod(int)并具有someMethod(),因此它具有两种不同的方法。 SuperClass无法访问someMethod(),因为它没有扩展任何类。