1. 程式人生 > >JAVA的多型----父類與子類轉換問題

JAVA的多型----父類與子類轉換問題

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);
	}

}

結果:失敗!

 

 

結論:

  • 子類物件可以當作父類物件使用(子類的引用可以賦值給父類變數),
  • 父類的引用如果是:
  1. 子類的例項,  可以通過強轉賦值給子類引用
  2. 父類的例項, 不能被子類引用

其實細想new出的物件之間本身是不能轉換的, 我們賦值的是類的引用, 

總的來說就是父類變數可以應用父類例項, 也可以引用子類例項,

子類變數只能引用子類例項

這也就是開篇所說的 : 子類物件算是父類物件