- Java程序設計基礎(chǔ)(第6版)
- 陳國君主編
- 2031字
- 2019-07-01 10:11:01
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)換成字符串。
- Learning Python Web Penetration Testing
- 深入核心的敏捷開發(fā):ThoughtWorks五大關(guān)鍵實踐
- PHP 從入門到項目實踐(超值版)
- Learning Flask Framework
- Python程序設計案例教程
- 實戰(zhàn)Java高并發(fā)程序設計(第3版)
- 零基礎(chǔ)入門學習Python
- 微信小程序入門指南
- 蘋果的產(chǎn)品設計之道:創(chuàng)建優(yōu)秀產(chǎn)品、服務和用戶體驗的七個原則
- INSTANT Silverlight 5 Animation
- Creating Data Stories with Tableau Public
- Image Processing with ImageJ
- Android應用開發(fā)實戰(zhàn)(第2版)
- 大學計算機基礎(chǔ)實訓教程
- HTML5移動Web開發(fā)