为什么以下Java代码会产生:
10
superclass
问题中的代码是:
class SuperClass {
int a;
public SuperClass() {
this.a = 10;
}
private void another_print() {
System.out.println("superclass");
}
public void print() {
System.out.println(this.a);
this.another_print();
}
}
class SubClass extends SuperClass {
int a;
public SubClass() {
this.a = 20;
}
private void another_print() {
System.out.println("subclass");
}
public void print() {
super.print();
}
}
public class Main {
public static void main (String[] args) {
SubClass c = new SubClass();
c.print();
}
}
没有创建SuperClass
的实例,是吗?
不仅如此,Java甚至从SuperClass
开始查找要调用的方法,它还以某种方式知道a = 10
!
让我们考虑类似的Python代码:
class SuperClass:
def __init__(self):
self.a = 10
def another_prn(self):
print('superclass')
def prn(self):
print(self.a)
self.another_prn()
class SubClass(SuperClass):
def __init__(self):
self.a = 20
def another_prn(self):
print('subclass')
def prn(self):
super().prn()
c = SubClass()
c.prn()
它的工作方式与我期望的相同:
20
subclass
我的同事(不喜欢Java的Python用户)唯一给出的解释是:“Python不是真正的面向对象语言”。这个解释并不令人信服。
更新: private void another_print()
是我的失误,我应该使用protected
。
@Override
注释的习惯,即使它不是必需的。这样,当某些内容没有正确覆盖时,编译器会发出警告。 - OneCricketeer