Java的變量類型分爲2種。基本類型(原始類型)和引用類型。基本類型包括如下八種類型:boolean、 char、byte、short、int、long、float、double。引用類型包括一下三種類型,類(class)類型、接口(interface)類型、數組(Array)類型。java
本章主要講述基本類型之間轉換的方法,轉換包括由Java運行時環境隱式執行的類型轉換和根據程序須要進行的強制類型轉換。另外,關於引用類型的轉換,請參照Class(引用類型的轉換和強制類型轉換)。程序員
基本類型的類型轉換是經過擴輾轉換的規則完成的。當Java運行時環境將數據的存儲範圍向更寬的類型轉換的時,執行隱式類型轉換。數組
待轉換的基本類型 | 可能的轉換目標的基本類型 |
---|---|
boolean | 沒有 |
char | int, long, float, double |
byte | short, int, long, float, double |
short | int, long, float, double |
int | long, float, double |
long | float, double |
float | double |
double | 沒有 |
如下將會說明Java運行時環境什麼時候會進行隱式類型轉換。學習
某個基本類型的變量,在賦值給其餘基本類型的變量時,將會進行隱式的類型轉換。轉換遵循[類型轉換規則]。code
int x = 10; double y; y = x; //變量x(int類型)賦值給變量y(double類型)時,將會執行隱式類型轉換。int類型的變量轉換爲double類型以後,會執行賦值操做。由於它是按照[類型轉換的規則]進行的,因此不須要程序員主動的進行轉換。 int x = 10; short y; y = x; //變量x(int類型)沒法賦值給變量y(short類型)。由於int類型的變量x沒法轉換成shot類型的變量,short類型的存儲範圍小於int類型。執行的結果會出現編譯錯誤。
在調用方法時,若是指定的類型與您要調用的方法的參數類型所需的類型不一樣,則會執行隱式類型轉換。 在這種狀況下,類型轉換也遵循【類型轉換規則】htm
short x = 10; System.out.println(Integer.toString(x));
Integer.toString是一種將int類型數據轉換爲字符串的方法,該方法須要一個int類型的參數。 在如上所示代碼,形參的類型爲short類型的狀況下 根據【類型轉換規則】,short類型被轉換爲int類型以後,而後方法被執行,因此不會出現編譯錯誤。索引
double y = 20.25; System.out.println(Integer.toString(y));
double類型的變量被指定爲參數時
因爲不符合【類型轉換規則】(double類型不能轉換爲int類型),執行結果爲編譯錯誤。接口
當使用算術運算符執行算術運算時,將執行隱式類型轉換。 算術運算中的類型轉換規則以下。ip
【算術運算符類型變換規則】ci
算術運算符 | 規則 |
---|---|
單項運算符 (+, -, ~) |
1. char, byte, short類型的變量會轉化成int類型。 2. 除此以外不會進行轉換。 |
二項運算符 (+, -, *, /, %, >>, >>>, <<, &, ^, 、豎線) |
1. 其中一個變量爲double類型的時候,另外一個變量也會轉換爲double型。 2. 不含有double類型的變量的時候,其中一個變量爲float類型,那麼另外一個變量也會變成float類型。 3. 不含有double、float類型的時候,其中一個變量爲long類型,那麼另外一個變量也會變成long類型。 4. 不含有double、float、long類型的時候,其中一個變量爲int類型,那麼另外一個變量也會變成int類型。 |
【例1】算術運算時進行轉換的正確例子。
short x = 10; double y = 20.25; double z = -x + y; //(1) System.out.println(z); //(2)
解釋1
【例2】算術運算時進行轉換編譯錯誤的例子
short x = 10; double y = 20.25; int z = -x + y; //(1) System.out.println(z);
解釋2
也許有的讀者會問,如何證實變量-x是int類型,苦於譯者的水平,想不到如何用代碼來證實,可是經過:
javap -c [class文件名]//java反彙編命令
也許能夠一探究竟。
public class HelloWorld { public static void main(String[] args) { short x = 10; double y = 20.25; double z = -x + y; } }
使用javac命令編譯後,運行javap -c命令進行反編譯,編譯結果以下
Compiled from "HelloWorld.java" public class HelloWorld { public HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: bipush 10 2: istore_1 3: ldc2_w #2 // double 20.25d 6: dstore_2 7: iload_1 8: ineg 9: i2d 10: dload_2 11: dadd 12: dstore 4 14: return }
第0行:使用bipush將10推入棧頂時,會被擴展爲32bit int類型的值。
第3行:使用ldc2_將將long或double型常量值從常量池中推送至棧頂(寬索引),這裏常量是10
第7行:使用iload_1將第2個int類型的局部變量入棧,也就是10。
第8行:使用ineg將棧頂int型數值取負,而且結果進棧。
第9行:使用i2d將棧頂int值強轉double值,而且結果進棧。
第10行:使用dload_2將第3個double類型的局部變量入棧,也就是20.25d。
第11行:使用dadd將棧頂兩double型數值相加,而且結果進棧。
第12行:使用dstore將棧頂double類型的值存入指定的局部變量。
_(:з」∠)_,好像解釋的並不怎麼好。要是有好的辦法,但願能告訴我,你們一塊兒學習。謝謝。
---未完待續---