1. 程式人生 > >JAVA中的變數,自動型別轉換

JAVA中的變數,自動型別轉換

一直以來對變數的理解比較模糊,今天來掃掃盲。

變數的概念:

1.記憶體中的一個儲存區域


2.該區域有自己的名稱(變數名)型別(資料型別)

3.該區域的資料可以在同一類型範圍內不斷變化

為什麼要定義變數:

用來不斷存放同一型別的資料,並且可以重複使用。 變數定義格式: 資料型別 變數名 = 初始值 JAVA資料型別:

整數預設型別:int 小數預設型別:double
自動型別轉換: 例一: byte+int
class  Demo
{
	public static void main(String[] args) 
	{
			byte b = 4;
			int  x = 3;
			x = x + b;
			System.out.println("x="+x);	
	}
}
結果:7 JAVA中不同資料型別之間是不能進行運算的,那為什麼上述程式碼編譯卻通過了呢? 1.只要都是數值型,就能運算 2.之所以不一致是因為它們在記憶體中佔的空間大小不同 x在記憶體中佔4個位元組 b在記憶體中佔1個位元組 java中有一個運算特性自動型別提升(以大的為主,小的向大的提升b(byte)-->x(int)) x(int) = b(byte) + x(int) --> x(int) = b(int) + x(int) 運算時b就會進行自動型別提升 3.型別提升之後,x和b就可以進行運算,運算之後的值是7,型別是int型別,並且等式左邊的變數x也是int型別,所以結果為7


例二:
byte+int
class  Demo
{
	public static void main(String[] args) 
	{
			byte b = 3;
			b = b + 1;
			System.out.println("b="+b);	
	}
}
結果:編譯錯誤 與例一原理相同,b作為一個byte型別變數在與1(預設int型別變數)進行運算時會進行自動型別提升,最終算出的結果是int型別的,而等式左邊的b是一個byte型別的變數,所以會報錯。 這裡需要繼續解釋一下: “byte b = 3;”這一句的3作為一個預設的int型別變數可以賦值給byte型別變數b,但是“b = b + 1;”這一句等式的右邊的運算結果最終也是int型別卻不能賦值給b是因為:
1.3是以一個常量的形式存在的 2.b是以一個變數的形式存在的,b+1理所當然就是一個變數,所以3是常量,b+1是變數 “byte b = 3;”中的3(常量)就可進行自動型別轉換 “b = b + 1;”中的b+1(變數)所以就不會就進行自動型別轉換
結論:賦值運算時常量可以進行自動型別轉化,變數不可以
例三:
byte+byte
class  Demo
{
	public static void main(String[] args) 
	{
			byte a = 1;
			byte b = 3;
			a = b + a;
			System.out.println("b="+a);	
	}
}
結果:
大家一定會納悶變數a和變數b都是byte型別同一種類型的變數,而且等式左邊的a也是byte型別的變數為什麼會報錯呢?
揭祕: 這時JVM內部的指令造成的。 下面是JVM指令集截圖:
如圖片所示,加運算(Tadd)只有int,long,float,double四個數字型別支援,所以比int小的加運算自動轉化成int的加運算,結果也是int
因為a和b都是byte型別,在進行計算的時候a和b都被自動提升為int型別,而等式左邊的a仍然是byte型別的,所以編譯就會出錯,這種情況只能進行強轉。 例四:
byte+short
class  Demo
{
	public static void main(String[] args) 
	{
			byte a = 1;
			short b = 3;
			b = b + a;
			System.out.println("b="+b);	
	}
}


例五: short+short
class  Demo
{
	public static void main(String[] args) 
	{
			short m = 1;
			short n = 3;
			m = m + n;
			System.out.println("m="+m);	
	}
}


例三,例四,例五錯誤都是由於JVM內部的指令所引起的,詳細解釋看例三。 例六: int+int
class  Demo
{
	public static void main(String[] args) 
	{
			int s = 1;
			int f = 3;
			s = s + f;
			System.out.println("s="+s);	
	}
}

編譯,執行成功。 例七: long+long
class  Demo
{
	public static void main(String[] args) 
	{
			long ss = 1;
			long df = 3;
			ss = ss + df;
			System.out.println("ss="+ss);	
	}
}

編譯執行成功 例八: int+long
class  Demo
{
	public static void main(String[] args) 
	{
			long abc = 1;
			int qwe = 3;
			qwe = abc + qwe;
			System.out.println("abc="+abc);	
	}
}

這個原因就不必多說了,還有float,double型別的都是一個道理,這裡只需要記住一點:在進行加運算的時候比int小的資料型別之間的運算都會自動轉化成int的加運算,所以賦值的時候就得注意兩邊的資料型別是否一致。 終於寫完了,花了一晚上的時間,睡覺去了...