Kir*_*ill 8 java oop inheritance constructor this
为什么以下Java代码会产生:
10
superclass
Run Code Online (Sandbox Code Playgroud)
有问题的代码是:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
没有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()
Run Code Online (Sandbox Code Playgroud)
它按预期工作:
20
subclass
Run Code Online (Sandbox Code Playgroud)
我的同事(Python不喜欢Java人员)提出的唯一解释是:"Python不是真正的OOP语言".根本不是很有说服力.
更新:private void another_print()
是我的错误,我应该使用protected
.
在子类的打印中,您只需调用超类的打印方法.所以它当然是从超级类打印出来的.
这里有两个单独的字段.字段不受覆盖,只有方法.超类有一个领域,你有另外一个在子类字段.
如果另一种语言产生另一种结果,那不是一个大惊喜.此外,我不确定您的Python代码在逻辑上是否等同于/类似于您的Java代码.
它是用Java调用的构造函数的顺序.
在SubClass
实例化时c
,构造函数隐式调用SuperClass
(public SuperClass()
)的默认构造函数(必须这样做).然后a
设置为10 SuperClass
.
现在,我们正在与进行SuperClass
构造,我们回到的构造SubClass
,其分配a = 20
.但字段不受制于Java的重写,所以a
在SuperClass
仍是10.
在那之后很明显,我们调用c.print()
调用print
of SubClass
,调用print
of SuperClass
(by super.print()
),打印a
出你记忆中的10个.然后another_print
(因为它没有被覆盖private
)只是打印superclass
而且我们已经完成了.
归档时间: |
|
查看次数: |
371 次 |
最近记录: |