拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
執行順序是這樣的:
1. super(); 1.1. super.i = 7; 1.2. this.setI(20) => this.i = 60; 1.3. System.out.println("i from a is " + super.i) => 7; 2. this(); 2.1. this.i = 10; 2.2. System.out.println("i from b is " + this.i) => 10;
A.i 和 B.i 都是package-private的, B.i 没有Override A.i, 這兩者是獨立的;
A.i
B.i
A.setI 和 B.setI 都是public, B.setI Override A.setI, A在构造时调用的是B.setI;
A.setI
B.setI
B在構造函數之外的成員初始化是在super()之后执行的, B.i先是在super里被B.setI設為60, 再被B的成員初始化設為10;
super()
刪除B中的int i = 10;之后, 如果A和B处于同一个package, B.setI访问的就是A.i, super()時A.i被設為60之後就不會有變更, 兩次印刷都是60
int i = 10;
在子類別中再宣告一個父類別中已有的成員,不會報錯嗎?至少也應該是警告吧。
我只能說,題目出得太缺德了。實際開發中不可能這麼寫,自己給自己挖個坑啊。
7.101.到A的構造方法,執行完Object的空參構造。 2.int I=73.setI(20)呼叫的是子類別的setI() 此時子類別的I為60,父類別的仍為7.4.列印this.i 此時在父類別中.是7;(注意點:變數看實際呼叫者,this是當前父類別;方法因為被重寫,呼叫子類別)5.int I=10 覆寫了原先的60.6,列印this .i 此時為10.
60.60注意:你刪除了子類的I,預設調用的就是父類的I3.調用子類setI,賦值給了父類,此時父類改變為60.5.此時沒有覆蓋,this.i 預設呼叫父類別繼承下來的I. 為60.
論Degbug的重要性...
執行順序是這樣的:
A.i
和B.i
都是package-private的,B.i
没有OverrideA.i
, 這兩者是獨立的;A.setI
和B.setI
都是public,B.setI
OverrideA.setI
, A在构造时调用的是B.setI
;B在構造函數之外的成員初始化是在
super()
之后执行的,B.i
先是在super里被B.setI
設為60, 再被B的成員初始化設為10;刪除B中的
int i = 10;
之后, 如果A和B处于同一个package,B.setI
访问的就是A.i
, super()時A.i被設為60之後就不會有變更, 兩次印刷都是60在子類別中再宣告一個父類別中已有的成員,不會報錯嗎?至少也應該是警告吧。
我只能說,題目出得太缺德了。實際開發中不可能這麼寫,自己給自己挖個坑啊。
7.10
1.到A的構造方法,執行完Object的空參構造。
2.int I=7
3.setI(20)呼叫的是子類別的setI() 此時子類別的I為60,父類別的仍為7.
4.列印this.i 此時在父類別中.是7;(注意點:變數看實際呼叫者,this是當前父類別;方法因為被重寫,呼叫子類別)
5.int I=10 覆寫了原先的60.
6,列印this .i 此時為10.
60.60
注意:你刪除了子類的I,預設調用的就是父類的I
3.調用子類setI,賦值給了父類,此時父類改變為60.
5.此時沒有覆蓋,this.i 預設呼叫父類別繼承下來的I. 為60.
論Degbug的重要性...