一個(gè)小問題引發(fā)的思考

          Posted on 2006-10-11 20:17 久城 閱讀(263) 評論(0)  編輯  收藏 所屬分類: JavaTest

          曾經(jīng)遇到過這樣一個(gè)小問題:

          class?A {
          private int i=1;
          public int getI(){
          return i;
          }
          public void setI(int i){
          this.i=i;
          }
          }

          public class?B extends?A {
          int i=2;
          public static void main (String [] args) {
          B?b = new B();
          System.out.println(b.getI());
          }
          }

          結(jié)果是1,而不是2.
          這個(gè)問題感覺還不錯(cuò)。

          1.并不是private成員不會(huì)被繼承.事實(shí)上子類可以繼承父類的任何變量和方法。private、protected只是訪問權(quán)限而已。即使i是public的
          輸出結(jié)果也肯定是1.

          2.方法可以覆蓋,成員變量并沒有覆蓋一說,也就是子類的i和父類的i是共存在子類體內(nèi)的。父類對象中有i變量、set get兩個(gè)方法。子類class中應(yīng)有i【繼承于父類對象】、i【子類對象】兩個(gè)變量、set get兩個(gè)方法【繼承于父類對象】。

          3.java中的原則是調(diào)用的是哪個(gè)類的方法,那么這個(gè)方法訪問的就是這個(gè)類中的成員。子類中沒有覆蓋public int getI()這個(gè)方法的話,那么子類調(diào)用的其實(shí)是父類的getI()方法.所以返回的是父類中的i.

          所以如果子類覆蓋了getI()方法,那么就會(huì)輸出的是子類中的i了,因?yàn)檎{(diào)用的是子類中的方法。

          以上是我曾經(jīng)遇到的一個(gè)問題,今天遇到另一個(gè)例子,進(jìn)而進(jìn)行思考!

          class A{
          ?public int m = 1;
          ?A(){
          ??System.out.println("A have construct");
          ??System.out.println(m);
          ??tt();//因?yàn)閠t()方法已經(jīng)被覆蓋,所以此處調(diào)用的是子類的tt()方法;
          //子類的數(shù)據(jù)成員此時(shí)還未顯式的初始化,所以返回值為默認(rèn)的0;
          }
          ?public void tt(){
          ??System.out.println(m);
          ?}
          }
          public class B extends A{
          ?public int n = 2;
          ?B(){
          ??System.out.println("B have construct");
          ??System.out.println(n);
          ??tt();
          }
          ?public void tt(){
          ??System.out.println(n);
          ?}
          ?public static void main(String args[]){
          ??B b = new B();
          ?}
          }?

          輸出結(jié)果是:
          A have construct
          1
          0
          B have construct
          2
          2

          如注釋部分的解說!
          這個(gè)例子中,B中的tt()方法已經(jīng)覆蓋了父類中的tt()方法.所以在執(zhí)行父類的構(gòu)造方法時(shí),調(diào)用的是子類的tt()方法;

          PS:
          構(gòu)造一個(gè)對象的過程是:
          先父類,后子類;
          先成員變量初始化,后構(gòu)造函數(shù).



          歡迎來訪!^.^!
          本BLOG僅用于個(gè)人學(xué)習(xí)交流!
          目的在于記錄個(gè)人成長.
          所有文字均屬于個(gè)人理解.
          如有錯(cuò)誤,望多多指教!不勝感激!

          Copyright © 久城

          主站蜘蛛池模板: 商城县| 平舆县| 冀州市| 苏尼特右旗| 博野县| 广南县| 安乡县| 惠水县| 梅河口市| 洪湖市| 玉溪市| 皋兰县| 平安县| 三江| 连江县| 修武县| 九龙坡区| 自贡市| 福建省| 健康| 永年县| 当雄县| 商河县| 台南市| 谢通门县| 灌南县| 黑龙江省| 广河县| 宣城市| 五华县| 营口市| 新郑市| 察哈| 宿州市| 琼结县| 泾川县| 台南市| 石柱| 花莲县| 三都| 山丹县|