1. 程式人生 > >java類型轉換詳解(自動轉換和強制轉換)

java類型轉換詳解(自動轉換和強制轉換)

代碼 oid 高精 log 相加 println 類型轉換詳解 範圍 void

自動轉換

class Hello
{
	public static void main(String[] args)
	{
		//自動轉換
		int a = 5;
		byte b = 6;
		int c = a + b;
		System.out.println(c);
	}
}

a是int類型,b是byte類型 當二者進行加法運算時(根據同類型相加結果還是同類型) 由於int的範圍比byte的取值範圍大這個時候jvm會自動將b轉換成int類型

強制轉換

//強制轉換
		int a = (int)8.8;

強制轉換就是將前面加上要轉換的類型就可以了。

下面來看比較特殊的

class Hello
{
    public static void main(String[] args)
    {
        byte b = 3;//正確
        int x = 3;//正確
        b = x;//錯誤
        
    }
}

上面代碼在編譯的時候會報錯 常量3的類型為int int類型可以賦值給byte的變量 但是b=x這個時候就不行了呢 因為根據常量優化機制 這種方式只針對 常量 不針對變量 也就是說大範圍的不能賦值給小範圍 除非用強制轉換類型

在看下面的也遵循上面的原則

class Hello
{
	public static void main(String[] args)
	{
		byte b1=3,b2=4,b;//正確
		b = b1 + b2;//錯誤   因為b1  b2這個時候是變量(常量優化機制只針對常量不針對變量)
		b = 3 + 4;//正確
		
	}
}

在看一個例子

class Hello
{
    public static void main(String[] args)
    {
        
        short s = 1;
        s = s + 1;//錯誤

        和
        
        short s = 1;
        s+=1;//正確
    }
}

上面的代碼從表面上看是沒什麽區別的 為什麽第二種寫法就正確了呢?

第一種算的時候 會將s自動轉換為int類型在進行加法運算(低精度轉高精度) 然後得出的結果是int類型 在賦值給short類型 這樣是不合適的(高精度不能賦值給低精度類型)所以會報錯 正確的寫法如下面代碼

class Hello
{
	public static void main(String[] args)
	{
		
		short s = 1;
		s = (short)(s + 1);

		System.out.println(s);
	}
}

那第二種為什麽是可行的呢?

因為+=、-+、*=、/= 這些運算符比較特殊 本身就具有強制類型轉換的作用。

java類型轉換詳解(自動轉換和強制轉換)