- Java與Android移動應(yīng)用開發(fā):技術(shù)、方法與實踐
- 曹化宇
- 1944字
- 2019-12-06 15:39:11
3.4 數(shù)據(jù)類型處理
第2章討論了基本數(shù)據(jù)類型的應(yīng)用,如整數(shù)、浮點數(shù)、字符和布爾類型,以及它們的定義、運算、轉(zhuǎn)換等操作。本章討論面向?qū)ο缶幊痰膬?nèi)容。那么,在應(yīng)用開發(fā)中,如何合理地處理這些數(shù)據(jù)類型呢?
本節(jié)就討論相關(guān)內(nèi)容,首先來看基本數(shù)據(jù)類型及其包裝類的使用。
3.4.1 基本數(shù)據(jù)類型與包裝類
第2章討論過的基本數(shù)據(jù)類型在java.lang包中都提供了一個面向?qū)ο蟮陌b類,其對應(yīng)關(guān)系如表3-1所示。
表3-1 基本數(shù)據(jù)類型與包裝類

開發(fā)中,應(yīng)該如何使用基本數(shù)據(jù)類型和包裝類呢?當基本類型的數(shù)據(jù)需要面向?qū)ο蟛僮鲿r,就可以將其轉(zhuǎn)換為對象來使用,如下面的代碼所示。

代碼中,以int類型為例,使用Integer類的構(gòu)造函數(shù)代入一個整數(shù),從而創(chuàng)建一個值為10的Integer對象。然后,通過toString()方法顯示其內(nèi)容。實際上,還可以使用更加簡單的方式創(chuàng)建Integer對象,如下面的代碼所示。
Integer objY = 99; System.out.println(objY.toString()); // 99
這里,直接將整數(shù)賦值給Integer類型的objY對象,此時,編譯器會自動完成轉(zhuǎn)換工作。
示例中,objX和objY就是Integer類型的對象,可以使用Integer類中定義的成員來處理數(shù)據(jù)。接下來,還可以使用Integer類中的一系列方法將數(shù)據(jù)轉(zhuǎn)換為所需要的類型,如下面的代碼所示。
public static void main(String[] args) { Integer objX = new Integer(10); System.out.println(objX.intValue()); System.out.println(objX.floatValue()); }
代碼中,分別使用intValue()和floatValue()方法將objX對象中的數(shù)據(jù)轉(zhuǎn)換為整數(shù)和浮點數(shù),執(zhí)行結(jié)果如圖3-18所示。

圖3-18 使用基本數(shù)據(jù)類型與包裝類
3.4.2 數(shù)據(jù)的傳遞
基本數(shù)據(jù)類型稱為值類型,而所有的類稱為引用類型。它們在使用中有什么區(qū)別呢?接下來著重討論值類型與引用類型在數(shù)據(jù)傳遞過程中的一些特點。
下面的代碼在JavaDemo類中創(chuàng)建三個數(shù)據(jù)改裝方法,它們定義在main()方法的外面。

代碼中創(chuàng)建的三方法分別如下所示。
□ intModification()方法,其中將參數(shù)(int類型)的值修改為99。
□ stringModification()方法,其中會修改String類型參數(shù)的內(nèi)容。
□ autoModification()方法,其中會對CAuto對象進行修改。
首先,測試int類型的改裝,如下面的代碼所示。

代碼執(zhí)行結(jié)果如圖3-19所示。
現(xiàn)實可能和你想象的不一樣,代碼執(zhí)行結(jié)果是,intModification()方法并沒有改變x變量的值,這是為什么呢?原因很簡單,因為int是值類型,而值類型的參數(shù)在傳遞時會產(chǎn)生一個副本。也就是說,在intModification()方法中處理的并不是main()方法中定義的x變量,而是x變量的副本,而修改副本的值并不會影響原變量中的數(shù)據(jù)。

圖3-19 值類型參數(shù)的傳遞
下面的代碼改裝汽車。
public static void main(String[] args) { CAuto auto = new CAuto("X9", 4); System.out.println(auto.model); System.out.println(auto.getDoors()); System.out.println("*** 對汽車進行改裝 ***"); autoModification(auto); System.out.println(auto.model); System.out.println(auto.getDoors()); }
代碼執(zhí)行結(jié)果如圖3-20所示。
代碼中,在autoModification()方法中成功地對auto對象進行了改造,將型號(model)修改為“改裝車”,車門數(shù)量變成2。為什么這個操作會成功呢?因為CAuto是一個類類型,也就是一個引用類型,引用類型在傳遞時,會直接傳遞其對象位于內(nèi)存中的位置,所以在autoModification()方法中實際操作的就是main()方法中的auto對象。
最后看引用類型中的異類,即String類型的改裝測試,如下面的代碼所示。
public static void main(String[] args) { String s = "abc"; stringModification(s); System.out.println(s); }
代碼執(zhí)行結(jié)果如圖3-21所示。

圖3-20 引用類型參數(shù)的傳遞

圖3-21 String類型參數(shù)的傳遞
String類型是引用類型。那為什么和CAuto對象的表現(xiàn)不一樣呢?實際上,不止是在Java中,在C#中也是這樣,String類用于處理不可變字符串類型。也就是說,String對象的內(nèi)容一旦確定就不能改變了,對于字符串內(nèi)容的任何操作,都會生成一個新的字符串對象。所以,在stringModification()方法中修改字符串對象的內(nèi)容時,實際上已經(jīng)生成了一個新的字符串對象,而不是s所指向的字符串對象。
前面的示例中,使用+運算符來連接字符串,這一操作實際上會生成多個字符串對象。對于需要大量拼接字符串的操作來說,其效率是非常低的。解決方案是使用StringBuffer或StringBuilder類來操作字符串,第6章會討論相關(guān)主題。
3.4.3 類型的動態(tài)處理
應(yīng)用開發(fā)過程中,為了簡化代碼,經(jīng)常會使用Object類或其他通用類型來傳遞對象,但對象會保留原始類型的相關(guān)信息。此時,如何獲取對象的真正類型、如何判斷對象可以進行什么操作就是一項非常重要的工作。
動態(tài)處理對象時,Object類中的一系列成員,以及Class等類型的使用將扮演非常重要的角色。
在討論繼承的過程中,已經(jīng)使用了Object類中的一些方法。下面再來看一看Object類中的其他常用成員。
□ equals()方法,與參數(shù)指定的對象進行比較,當兩個對象是同一引用時返回true,否則返回false。
□ toString()方法,返回對象的文本描述。
□ getClass()方法,返回一個Class類型的對象,即對象類型的描述對象。
接下來測試Class類的使用,如下面的代碼所示。

代碼中,首先定義了CAssaultVechicle類的av對象。然后,使用av對象的getClass()方法獲取對象的類型信息,它會返回一個Class類型的對象。
接下來,使用Class類中的getPackage()方法返回類型所在包的名稱;使用getName()方法返回類的名稱,這是包含包名的完整類名;使用getSuperclass()返回類型的超類信息,同樣是Class對象,同樣使用getName()顯示超類的名稱。
最后,使用Class對象的getMethods()方法返回CAssaultVechicle類的所有方法,包括自定義方法和繼承的方法。請注意,Method類定義在java.lang.reflect包中,在代碼文件的開始處,package語句的下面,需要使用import語句引用這個類,如下面的代碼所示。
import java.lang.reflect.Method;
如果需要引用java.lang.reflect包中的所有資源,可以使用*通配符,如下面的代碼所示。
import java.lang.reflect.*;
此外,關(guān)于代碼中的for語句結(jié)構(gòu),會在第5章詳細討論。
- DBA攻堅指南:左手Oracle,右手MySQL
- Go語言高效編程:原理、可觀測性與優(yōu)化
- JavaScript 網(wǎng)頁編程從入門到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開發(fā)視頻大講堂)
- Python從入門到精通(精粹版)
- Instant Typeahead.js
- Android Native Development Kit Cookbook
- Python編程:從入門到實踐
- Scala Reactive Programming
- Tableau 10 Bootcamp
- 編程與類型系統(tǒng)
- Babylon.js Essentials
- 從零開始學Python網(wǎng)絡(luò)爬蟲
- Managing Microsoft Hybrid Clouds
- Learning Nessus for Penetration Testing
- Learning Python Data Visualization