JAVA的多型----父類與子類轉換問題
阿新 • • 發佈:2018-11-01
JAVA語言中, 物件變數是多型的
每個子類物件都算是父類物件(子類物件可以當作父類變數所引用)
那反過來可不可以呢?
答案是取決於父類變數引用的是誰
如果父類變數引用的是子類物件的例項, 可以通過強轉被子類變數引用
如果父類變數引用的是父類物件的例項,則不能被為子類變數引用
上程式碼舉例子(本篇一直用這兩個類舉例子,main測試不同):
一個Father類
package test;
public class Father
{
int fatherA;
Father(int a)
{
fatherA=a;
}
}
一個Son類
package test; public class Son extends Father { int sonB; Son(int a,int b) { super(a); sonB=b; } }
把子類物件賦給父類變數:
package test;
public class MainTest
{
public static void main(String[] args)
{
Son son1=new Son(1, 2);
Father father1=son1; //子類物件被父類變數引用
System.out.println(father1.fatherA);
}
}
結果: 賦值成功!
把父類引用賦值給子類變數分兩種情況:
1.父類引用的是子類物件:
package test; public class MainTest { public static void main(String[] args) { Father father2=new Son(1, 2); //父類引用了子類物件的例項 Son son2=(Son)father2; System.out.println(son2.sonB); } }
結果:轉換成功!
這裡注意即使引用的是子類例項轉換成子類也需要強轉, 否則會報錯
2.父類引用的是父類的例項:
package test;
public class MainTest
{
public static void main(String[] args)
{
Father father2=new Father(1); //父類引用了子類物件的例項
Son son2=(Son)father2;
System.out.println(son2.sonB);
}
}
結果:失敗!
結論:
- 子類物件可以當作父類物件使用(子類的引用可以賦值給父類變數),
- 父類的引用如果是:
- 子類的例項, 可以通過強轉賦值給子類引用
- 父類的例項, 不能被子類引用
其實細想new出的物件之間本身是不能轉換的, 我們賦值的是類的引用,
總的來說就是父類變數可以應用父類例項, 也可以引用子類例項,
子類變數只能引用子類例項
這也就是開篇所說的 : 子類物件算是父類物件