JAVA父類子類轉化問題
阿新 • • 發佈:2018-11-11
1、可以用父類去宣告子類物件
2、可以將父類物件強轉為子類物件,前提是隻有父類物件本身就是用子類new出來的時候, 才可以在將來被強制轉換為子類物件
例項如下:
package hrx; public class TestExtends { static class A { private int x = 1; private int y = 2; } static class B extends A{ private int x = 2; private int y = 4; } public static void main(String[] args) { A a = new A(); B b = new B(); b = (B) a; System.out.println(b.x); } }
會出現如下報錯:
正確做法:
package hrx; public class TestExtends { static class A { private int x = 1; private int y = 2; } static class B extends A{ private int x = 2; private int y = 4; } public static void main(String[] args) { A a = new B(); B b = new B(); b = (B) a; System.out.println(b.x); } }
結果如下:
那麼再來考慮一下,用父類宣告的子類物件,到底是父類還是子類,看下邊例項:
package hrx; public class TestExtends { static class A { private int x = 1; private int y = 2; public void print(){ System.out.println("I am A"); } } static class B extends A{ private int x = 2; private int y = 4; public void print(){ System.out.println("I am B"); } } public static void main(String[] args) { A a = new B(); System.out.println(a.x); a.print(); } }
結果如下:
到這裡相比大家已經明白,用父類宣告的子類,變數不會被覆蓋,而方法會被覆蓋,這是因為,基本資料型別採用的是值傳遞,因而不會將父類的變數的值覆蓋,而方法採用的是引用傳遞,因此會覆蓋,java的引數傳遞詳見:java引數傳遞詳解