JAVA中的變數,自動型別轉換
阿新 • • 發佈:2019-02-03
一直以來對變數的理解比較模糊,今天來掃掃盲。
變數的概念:
1.記憶體中的一個儲存區域
2.該區域有自己的名稱(變數名)和型別(資料型別)
3.該區域的資料可以在同一類型範圍內不斷變化
為什麼要定義變數:
用來不斷存放同一型別的資料,並且可以重複使用。 變數定義格式: 資料型別 變數名 = 初始值 JAVA資料型別:整數預設型別:int 小數預設型別:double
自動型別轉換: 例一: byte+int
結果: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型別,所以結果為7class Demo { public static void main(String[] args) { byte b = 4; int x = 3; x = x + b; System.out.println("x="+x); } }
例二:
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是因為:結論:賦值運算時常量可以進行自動型別轉化,變數不可以
例三:
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的加運算,所以賦值的時候就得注意兩邊的資料型別是否一致。 終於寫完了,花了一晚上的時間,睡覺去了...