項目開發(fā)遇到一個問題,稀里糊涂給實現(xiàn)了,現(xiàn)在重點討論一下這是個什么情況,大神們?nèi)绻吹较Mo點指點。
問題:子類與父類具有相同的屬性和方法,將子類實例化為父類,調(diào)用對應(yīng)屬性的get、set方法,打印出的信息顯示了,子類的屬性值,請問這是什么原因?
代碼如下--父類:
public class Freath { PRivate int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; }}
子類A:
public class A extends Freath{ private int a = 2; public int getA() { return a; } public void setA(int a) { this.a = a; } }
子類B:
public class B extends Freath{ private int a = 3; public int getA() { return a; } public void setA(int a) { this.a = a; }}
測試類:
public class Test { public static void main(String[] args) { Freath fa = new A(); Freath fb = new B(); System.out.println(fa.getA()+""); System.out.println(((A) fa).getA()+""); System.out.println(fb.getA()+""); System.out.println(((B) fb).getA()+""); } }
輸出結(jié)果:
首先這樣的結(jié)果,確實是我想要的,不過對于里面的具有邏輯,甚是不解,還望能得到指點。
對于上面的情況我又進行了一下修改,打印出的結(jié)果就完全變了:
父類:
public class Freath { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; }}
子類A:
public class A extends Freath{ private int a = 2;// public int getA() {// return a;// }//// public void setA(int a) {// this.a = a;// }}
子類B:
public class B extends Freath{ private int a = 3;// public int getA() {// return a;// }//// public void setA(int a) {// this.a = a;// }}
測試類:
public class Test { public static void main(String[] args) { Freath fa = new A(); Freath fb = new B(); System.out.println(fa.getA()+""); System.out.println(((A) fa).getA()+""); System.out.println(fb.getA()+""); System.out.println(((B) fb).getA()+""); } }
結(jié)果:
對于這兩種情況的產(chǎn)生,我的理解是,第一種情況屬于:父類的屬性是私有的,子類無法繼承,父類的屬性方法是公開的,子類可以進行繼承重寫,之所以出現(xiàn)上面的情況,就是父類進行相當于一個提供調(diào)用子類方法的入口,子類重寫這些方法后,當調(diào)用時,便打印出了子類的屬性值。第二種情況則是由于父類的屬性是私有的,子類無法進行繼承,子類繼承了父類的方法,但沒有進行重寫,所以調(diào)用時,便將父類的信息打印出來了。
|
新聞熱點
疑難解答