官术网_书友最值得收藏!

3.5 數(shù)據(jù)類型轉(zhuǎn)換

Java語言的數(shù)據(jù)類型在定義時就已經(jīng)確定,因此不能隨意轉(zhuǎn)換成其他的數(shù)據(jù)類型,但Java語言容許用戶有限度地做類型轉(zhuǎn)換處理,這就是所謂的數(shù)據(jù)類型轉(zhuǎn)換,簡稱類型轉(zhuǎn)換。類型轉(zhuǎn)換就是在Java程序中,將常數(shù)或變量從一種數(shù)據(jù)類型轉(zhuǎn)換到另一種數(shù)據(jù)類型,但這種轉(zhuǎn)換是有條件的,并不是一種數(shù)據(jù)類型能任意地轉(zhuǎn)換為另一種數(shù)據(jù)類型。

1.數(shù)值型不同類型數(shù)據(jù)的轉(zhuǎn)換

由于數(shù)值型分為不同的類型,所以數(shù)值型數(shù)據(jù)有類型轉(zhuǎn)換問題。數(shù)值型數(shù)據(jù)的類型轉(zhuǎn)換分為自動類型轉(zhuǎn)換(或稱隱含類型轉(zhuǎn)換)和強制類型轉(zhuǎn)換兩種。凡是把占用比特數(shù)較少的數(shù)據(jù)(簡稱較短的數(shù)據(jù))轉(zhuǎn)換成占用比特數(shù)較多的數(shù)據(jù)(簡稱較長的數(shù)據(jù)),都使用自動類型轉(zhuǎn)換,即類型轉(zhuǎn)換由編譯系統(tǒng)自動完成,不需要程序做特別的說明。但如果把較長的數(shù)據(jù)轉(zhuǎn)換成較短的數(shù)據(jù)時,就要使用強制類型轉(zhuǎn)換,否則就會產(chǎn)生編譯錯誤。

1)自動類型轉(zhuǎn)換

在程序中已經(jīng)定義好的數(shù)值型的變量,若是想以另一種數(shù)值類型表示時,Java語言會在下列條件同時成立時,自動進行數(shù)據(jù)類型的轉(zhuǎn)換。

①轉(zhuǎn)換前的數(shù)據(jù)類型與轉(zhuǎn)換后的類型兼容。

②轉(zhuǎn)換后數(shù)據(jù)類型的表示范圍比轉(zhuǎn)換前數(shù)據(jù)類型的表示范圍大。

條件②說明不同類型的數(shù)據(jù)進行運算時,需先轉(zhuǎn)換為同一類型,然后進行運算。轉(zhuǎn)換從“短”到“長”的優(yōu)先關(guān)系為:

舉例來說,若是想將short類型的變量a轉(zhuǎn)換為int類型,由于short與int皆為整數(shù)類型,符合上述條件①,而int的表示范圍比short來得大,也符合條件②,因此Java語言會自動將原為short類型的變量a轉(zhuǎn)換為int類型。

值得注意的是,類型的轉(zhuǎn)換只限該語句本身,并不會影響原先變量的類型定義,而且通過自動類型的轉(zhuǎn)換,可以保證數(shù)據(jù)的精確度,它不會因為類型轉(zhuǎn)換而損失數(shù)據(jù)的內(nèi)容。這種類型的轉(zhuǎn)換方式也稱為擴大轉(zhuǎn)換(augmented conversion)。

在一個表達式中若有整數(shù)類型為short或byte的數(shù)據(jù)參加運算,為了避免溢出,Java會將表達式中的short或byte類型的數(shù)據(jù)自動轉(zhuǎn)換成int類型,這樣就可以保證其運算結(jié)果的正確性,這也是Java語言所提供的“擴大轉(zhuǎn)換”功能。

由于boolean類型只能存放true或false,與整數(shù)及字符不兼容,因此不可能做類型的轉(zhuǎn)換。接下來看一看當兩個數(shù)中有一個為浮點數(shù)時,其運算的結(jié)果如何?

例3.1】 數(shù)據(jù)類型的自動轉(zhuǎn)換。

輸出結(jié)果為:

     a=155,b=21.0
     a/b=7.3809524

程序中第8、9兩行的System.out.println()語句,其功能是輸出括號中表達式的值然后換行。由運行的結(jié)果可以看到,當兩個數(shù)中有一個為浮點數(shù)時,其運算的結(jié)果會直接轉(zhuǎn)換為浮點數(shù)。當表達式中變量的類型不同時,Java會自動將較小的表示范圍轉(zhuǎn)換成較大的表示范圍后,再做運算。也就是說,假設有一個整數(shù)和雙精度浮點數(shù)做運算時,Java會把整數(shù)轉(zhuǎn)換成雙精度浮點數(shù)后再做運算,運算結(jié)果也會變成雙精度浮點數(shù)。

2)強制類型轉(zhuǎn)換

如果要將較長的數(shù)據(jù)轉(zhuǎn)換成較短的數(shù)據(jù)時,就要進行強制類型轉(zhuǎn)換。強制類型轉(zhuǎn)換的格式如下:

     (欲轉(zhuǎn)換的數(shù)據(jù)類型)變量名

這種強制類型的轉(zhuǎn)換,因為是直接編寫在程序代碼中,所以也稱為顯性轉(zhuǎn)換(explicit cast)。經(jīng)過強制類型轉(zhuǎn)換,將得到一個括號里聲明的數(shù)據(jù)類型的數(shù)據(jù),該數(shù)據(jù)是從指定變量名中所包含的數(shù)據(jù)轉(zhuǎn)換而來的,但是指定的變量及其數(shù)據(jù)本身將不會因此而轉(zhuǎn)變。下面的程序說明了在Java語言中是如何進行數(shù)據(jù)類型強制轉(zhuǎn)換的。

例3.2】 整型與浮點數(shù)據(jù)類型的轉(zhuǎn)換。

程序執(zhí)行結(jié)果如下:

     a=155,b=9
     a/b=17.0
a=155,b=9 a/b=17.222221 (int)h=17

當兩個整數(shù)相除時,小數(shù)點之后的數(shù)字會被截斷,使得運算的結(jié)果保持為整數(shù)。但由于這并不是預期的計算結(jié)果,因此想要使運算的結(jié)果為浮點數(shù),就必須將兩個整數(shù)中的一個或是兩個強制轉(zhuǎn)換為浮點數(shù)類型,例如下面的三種寫法均成立:

     (float)a/b    //將整數(shù)a強制轉(zhuǎn)換成浮點數(shù),再與整數(shù)b相除
     a/(float)b    //將整數(shù)b強制轉(zhuǎn)換成浮點數(shù),再以整數(shù)a除之
     (float)a/(float)b //將整數(shù)a與b同時強制轉(zhuǎn)換成浮點數(shù)

只要在變量名前面加上欲轉(zhuǎn)換的類型,如例中第15行中的變量h,程序運行時就會自動將此行語句里的變量做類型轉(zhuǎn)換的處理,并不影響原先定義的類型。

此外,若是將一個大于變量可表示范圍的值賦值給這個變量時,這種轉(zhuǎn)換稱為縮小轉(zhuǎn)換(narrowing conversion)。由于縮小轉(zhuǎn)換在轉(zhuǎn)換的過程中可能會因此損失數(shù)據(jù)的精確度,Java并不會自動做這種類型的轉(zhuǎn)換,此時必須由程序員做強制性的轉(zhuǎn)換。

注意在程序設計過程中,不推薦從較長數(shù)據(jù)向較短數(shù)據(jù)的轉(zhuǎn)換,因為從較長數(shù)據(jù)向較短數(shù)據(jù)轉(zhuǎn)換的過程中,由于數(shù)據(jù)存儲位數(shù)的縮小,將導致計算數(shù)據(jù)精度的降低。

2.字符串型數(shù)據(jù)與整型數(shù)據(jù)相互轉(zhuǎn)換

1)字符串轉(zhuǎn)換成數(shù)值型數(shù)據(jù)

數(shù)字字符串型數(shù)據(jù)轉(zhuǎn)換成byte、short、int、float、double、long等數(shù)據(jù)類型,或?qū)⒆址?true"、"false"轉(zhuǎn)換成相應的布爾類型,可以分別使用表3.7所提供的Byte、Short、Integer、Long、Double、Float和Boolean類的parseXXX()方法完成。

表3.7 字符串轉(zhuǎn)換成數(shù)值型數(shù)據(jù)的方法

例如:

     String myNumber="1234.567";  //定義字符串型變量myNumber
     float myFloat=Float.parseFloat(myNumber);

第2條語句是將字符串型變量myNumber的值轉(zhuǎn)換成浮點型數(shù)據(jù)后,賦給變量myFloat。

2)數(shù)值型數(shù)據(jù)轉(zhuǎn)換成字符串

在Java語言中,字符串可用加號“+”來實現(xiàn)連接操作。所以若其中某個操作數(shù)不是字符串,該操作在連接之前會自動將其轉(zhuǎn)換成字符串,因此可用加號來實現(xiàn)自動的轉(zhuǎn)換。如:

     int myInt=1234;       //定義整型變量myInt
     String myString=""+myInt;  //將整型數(shù)據(jù)轉(zhuǎn)換成了字符串

其他數(shù)值型數(shù)據(jù)類型也可以利用同樣的方法轉(zhuǎn)換成字符串。

主站蜘蛛池模板: 阜康市| 徐闻县| 普陀区| 柏乡县| 普洱| 清涧县| 昌江| 青海省| 荔波县| 申扎县| 徐闻县| 托克托县| 东台市| 临沭县| 上思县| 五台县| 维西| 吉首市| 三明市| 荣昌县| 肇庆市| 界首市| 靖江市| 博爱县| 尖扎县| 满洲里市| 申扎县| 六枝特区| 花垣县| 军事| 安化县| 宝丰县| 高陵县| 石景山区| 龙胜| 柏乡县| 高尔夫| 呼图壁县| 马尔康县| 丁青县| 于田县|