1. 程式人生 > >java提高篇----型別轉換

java提高篇----型別轉換

在java中強制型別轉換分為基本資料型別和引用資料型別兩種

引用資料型別1

在Java中由於繼承和向上轉型,子類可以非常自然地轉換成父類,但是父類轉換成子類則需要強制轉換。因為子類擁有比父類更多的屬性、更強的功能,所以父類轉換為子類需要強制。那麼,是不是隻要是父類轉換為子類就會成功呢?其實不然,他們之間的強制型別轉換是有條件的。

當我們用一個型別的構造器構造出一個物件時,這個物件的型別就已經確定的,也就說它的本質是不會再發生變化了。在Java中我們可以通過繼承、向上轉型的關係使用父類型別來引用它,這個時候我們是使用功能較弱的型別引用功能較強的物件,這是可行的。但是將功能較弱的型別強制轉功能較強的物件時,就不一定可以行了。

舉個例子來說明。比如系統中存在Father、Son兩個物件。首先我們先構造一個Son物件,然後用一個Father型別變數引用它:

  Father father = new Son();

在這裡Son 物件例項被向上轉型為father了,但是請注意這個Son物件例項在記憶體中的本質還是Son型別的,只不過它的能力臨時被消弱了而已,如果我們想變強怎麼辦?將其物件型別還原!

  Son son = (Son)father;

這條語句是可行的,其實father引用仍然是Father型別的,只不過是將它的能力加強了,將其加強後轉交給son引用了,Son物件例項在son的變數的引用下,恢復真身,可以使用全部功能了。

前面提到父類強制轉換成子類並不是總是成功,那麼在什麼情況下它會失效呢?

當引用型別的真實身份是父類本身的型別時,強制型別轉換就會產生錯誤。例如:

  Father father = new  Father();

  Son son = (Son) father;

這個系統會丟擲ClassCastException異常資訊。

所以編譯器在編譯時只會檢查型別之間是否存在繼承關係,有則通過;而在執行時就會檢查它的真實型別,是則通過,否則丟擲ClassCastException異常。

所以在繼承中,子類可以自動轉型為父類,但是父類強制轉換為子類時只有當引用型別真正的身份為子類時才會強制轉換成功,否則失敗。

基本資料型別轉換2

自動型別轉換規則:
自動型別轉換

強制型別轉換:
強制型別轉換

程式碼示例:

package com.jredu.ch02;
 
public class Ch04 {
	
	public static void main(String[]args){
		//自動型別轉換
		//基本資料的自動型別轉換隻有7種資料型別,除了boolean
		//基本原則:低級別可以直接轉高級別
		//      char
		//byte->short->int->long->float->double
		//運算時的自動轉換條件:1、兩種資料型別要相容,2、目標型別大於原型別
		int a=10;
		double b=1.1;
		b=b+a;
		a=a+(int)b;
		System.out.println(b);//b=11.1
		System.out.println(a);//a=10+11=21
		
	}
 
}

package com.jredu.ch02;
 
public class Ch05 {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//強制型別轉換
		//高級別轉低級別時,必須要進行強轉
		//是否強制轉換取決於資料型別級別的高低,不取決於資料的實際值。
		int a=330;
		short b=(short)a; 
		short c=350;//直接自變數賦值 ,不需要轉換型別
		
		int e=(int)-1.1;
		System.out.print(e); //e=-1
		
 
	}
 
}


相關博文:


  1. 轉自 https://www.cnblogs.com/chenssy/p/3393160.html ↩︎

  2. 轉自 https://www.cnblogs.com/chenssy/p/3393160.html ↩︎