深入解析Java的包(package)
雖然 Java 語(yǔ)言是典型的面向?qū)ο缶幊陶Z(yǔ)言,但其中的八種基本數(shù)據(jù)類型并不支持面向?qū)ο缶幊蹋绢愋偷臄?shù)據(jù)不具備“對(duì)象”的特性——不攜帶屬性、沒(méi)有方法可調(diào)用。 沿用它們只是為了迎合人類根深蒂固的習(xí)慣,并的確能簡(jiǎn)單、有效地進(jìn)行常規(guī)數(shù)據(jù)處理。
這種借助于非面向?qū)ο蠹夹g(shù)的做法有時(shí)也會(huì)帶來(lái)不便,比如引用類型數(shù)據(jù)均繼承了 Object 類的特性,要轉(zhuǎn)換為 String 類型(經(jīng)常有這種需要)時(shí)只要簡(jiǎn)單調(diào)用 Object 類中定義的toString()即可,而基本數(shù)據(jù)類型轉(zhuǎn)換為 String 類型則要麻煩得多。為解決此類問(wèn)題 ,Java為每種基本數(shù)據(jù)類型分別設(shè)計(jì)了對(duì)應(yīng)的類,稱之為包裝類(Wrapper Classes),也有教材稱為外覆類或數(shù)據(jù)類型類。
每個(gè)包裝類的對(duì)象可以封裝一個(gè)相應(yīng)的基本類型的數(shù)據(jù),并提供了其它一些有用的方法。包裝類對(duì)象一經(jīng)創(chuàng)建,其內(nèi)容(所封裝的基本類型數(shù)據(jù)值)不可改變。
基本類型和對(duì)應(yīng)的包裝類可以相互裝換:
由基本類型向?qū)?yīng)的包裝類轉(zhuǎn)換稱為裝箱,例如把 int 包裝成 Integer 類的對(duì)象;
包裝類向?qū)?yīng)的基本類型轉(zhuǎn)換稱為拆箱,例如把 Integer 類的對(duì)象重新簡(jiǎn)化為 int。
包裝類的應(yīng)用
八個(gè)包裝類的使用比較相似,下面是常見(jiàn)的應(yīng)用場(chǎng)景。
1) 實(shí)現(xiàn) int 和 Integer 的相互轉(zhuǎn)換
可以通過(guò) Integer 類的構(gòu)造方法將 int 裝箱,通過(guò) Integer 類的 intValue 方法將 Integer 拆箱。例如:
public class Demo { public static void main(String[] args) { int m = 500; Integer obj = new Integer(m); // 手動(dòng)裝箱 int n = obj.intValue(); // 手動(dòng)拆箱 System.out.println("n = " + n); Integer obj1 = new Integer(500); System.out.println("obj 等價(jià)于 obj1?" + obj.equals(obj1)); } }
運(yùn)行結(jié)果:
n = 500 obj 等價(jià)于 obj1?true
2) 將字符串轉(zhuǎn)換為整數(shù)
Integer 類有一個(gè)靜態(tài)的 paseInt() 方法,可以將字符串轉(zhuǎn)換為整數(shù),語(yǔ)法為:
parseInt(String s, int radix);
s 為要轉(zhuǎn)換的字符串,radix 為進(jìn)制,可選,默認(rèn)為十進(jìn)制。
下面的代碼將會(huì)告訴你什么樣的字符串可以轉(zhuǎn)換為整數(shù):
public class Demo { public static void main(String[] args) { String str[] = {"123", "123abc", "abc123", "abcxyz"}; for(String str1 : str){ try{ int m = Integer.parseInt(str1, 10); System.out.println(str1 + " 可以轉(zhuǎn)換為整數(shù) " + m); }catch(Exception e){ System.out.println(str1 + " 無(wú)法轉(zhuǎn)換為整數(shù)"); } } } }
運(yùn)行結(jié)果:
123 可以轉(zhuǎn)換為整數(shù) 123 123abc 無(wú)法轉(zhuǎn)換為整數(shù) abc123 無(wú)法轉(zhuǎn)換為整數(shù) abcxyz 無(wú)法轉(zhuǎn)換為整數(shù)
3) 將整數(shù)轉(zhuǎn)換為字符串
Integer 類有一個(gè)靜態(tài)的 toString() 方法,可以將整數(shù)轉(zhuǎn)換為字符串。例如:
public class Demo { public static void main(String[] args) { int m = 500; String s = Integer.toString(m); System.out.println("s = " + s); } }
運(yùn)行結(jié)果:
s = 500
自動(dòng)拆箱和裝箱
上面的例子都需要手動(dòng)實(shí)例化一個(gè)包裝類,稱為手動(dòng)拆箱裝箱。Java 1.5(5.0) 之前必須手動(dòng)拆箱裝箱。
Java 1.5 之后可以自動(dòng)拆箱裝箱,也就是在進(jìn)行基本數(shù)據(jù)類型和對(duì)應(yīng)的包裝類轉(zhuǎn)換時(shí),系統(tǒng)將自動(dòng)進(jìn)行,這將大大方便程序員的代碼書(shū)寫(xiě)。例如:
public class Demo { public static void main(String[] args) { int m = 500; Integer obj = m; // 自動(dòng)裝箱 int n = obj; // 自動(dòng)拆箱 System.out.println("n = " + n); Integer obj1 = 500; System.out.println("obj 等價(jià)于 obj1?" + obj.equals(obj1)); } }
運(yùn)行結(jié)果:
n = 500 obj 等價(jià)于 obj1?true
自動(dòng)拆箱裝箱是常用的一個(gè)功能,讀者需要重點(diǎn)掌握。
包不但可以包含類,還可以包含接口和其他的包。
目錄以"\"來(lái)表示層級(jí)關(guān)系,例如 E:\Java\workspace\Demo\bin\p1\p2\Test.java。
包以"."來(lái)表示層級(jí)關(guān)系,例如 p1.p2.Test 表示的目錄為 \p1\p2\Test.class。
如何實(shí)現(xiàn)包
通過(guò) package 關(guān)鍵字可以聲明一個(gè)包,例如:
package p1.p2;
必須將 package 語(yǔ)句放在所有語(yǔ)句的前面,例如:
package p1.p2; public class Test { public Test(){ System.out.println("我是Test類的構(gòu)造方法"); } }
表明 Test 類位于 p1.p2 包中。
包的調(diào)用
在Java中,調(diào)用其他包中的類共有兩種方式。
1) 在每個(gè)類名前面加上完整的包名
程序舉例:
public class Demo { public static void main(String[] args) { java.util.Date today=new java.util.Date(); System.out.println(today); } }
運(yùn)行結(jié)果:
Wed Dec 03 11:20:13 CST 2014
2) 通過(guò) import 語(yǔ)句引入包中的類
程序舉例:
import java.util.Date; // 也可以引入 java.util 包中的所有類 // import java.util.*; public class Demo { public static void main(String[] args) { Date today=new Date(); System.out.println(today); } }
運(yùn)行結(jié)果與上面相同。
實(shí)際編程中,沒(méi)有必要把要引入的類寫(xiě)的那么詳細(xì),可以直接引入特定包中所有的類,例如 import java.util.*;。
類的路徑
Java 在導(dǎo)入類時(shí),必須要知道類的絕對(duì)路徑。
首先在 E:\Java\workspace\Demo\src\p0\ 目錄(E:\Java\workspace\Demo\src\ 是項(xiàng)目源文件的根目錄)下創(chuàng)建 Demo.java,輸入如下代碼:
package p0; import p1.p2.Test; public class Demo{ public static void main(String[] args){ Test obj = new Test(); } }
再在 E:\Java\workspace\Demo\src\p1\p2 目錄下創(chuàng)建 Test.java,輸入如下代碼:
package p1.p2; public class Test { public Test(){ System.out.println("我是Test類的構(gòu)造方法"); } }
假設(shè)我們將 classpath 環(huán)境變量設(shè)置為 .;D:\Program Files\jdk1.7.0_71\lib,源文件 Demo.java 開(kāi)頭有 import p1.p2.Test; 語(yǔ)句,那么編譯器會(huì)先檢查 E:\Java\workspace\Demo\src\p0\p1\p2\ 目錄下是否存在 Test.java 或 Test.class 文件,如果不存在,會(huì)繼續(xù)檢索 D:\Program Files\jdk1.7.0_71\lib\p1\p2\ 目錄,兩個(gè)目錄下都不存在就會(huì)報(bào)錯(cuò)。顯然,Test.java 位于 E:\Java\workspace\Demo\src\p1\p2\ 目錄,編譯器找不到,會(huì)報(bào)錯(cuò),怎么辦呢?
可以通過(guò) javac 命令的 classpath 選項(xiàng)來(lái)指定類路徑。
打開(kāi)CMD,進(jìn)入 Demo.java 文件所在目錄,執(zhí)行 javac 命令,并將 classpath 設(shè)置為 E:\Java\workspace\Demo\src,如下圖所示:
運(yùn)行Java程序時(shí),也需要知道類的絕對(duì)路徑,除了 classpath 環(huán)境變量指定的路徑,也可以通過(guò) java 命令的 classpath 選項(xiàng)來(lái)增加路徑,如下圖所示:
注意 java 命令與 javac 命令的區(qū)別,執(zhí)行 javac 命令需要進(jìn)入當(dāng)前目錄,而執(zhí)行 java 命令需要進(jìn)入當(dāng)前目錄的上級(jí)目錄,并且類名前面要帶上包名。
可以這樣來(lái)理解,javac是一個(gè)平臺(tái)命令,它對(duì)具體的平臺(tái)文件進(jìn)行操作,要指明被編譯的文件路徑。而java是一個(gè)虛擬機(jī)命令,它對(duì)類操作,即對(duì)類的描述要用點(diǎn)分的描述形式,并且不能加擴(kuò)展名,還要注意類名的大小寫(xiě)。
這些命令比較繁雜,實(shí)際開(kāi)發(fā)都需要借助 Eclipse,在Eclipse下管理包、編譯運(yùn)行程序都非常方便。Eclipse 實(shí)際上也是執(zhí)行這些命令。
包的訪問(wèn)權(quán)限
被聲明為 public 的類、方法或成員變量,可以被任何包下的任何類使用,而聲明為 private 的類、方法或成員變量,只能被本類使用。
沒(méi)有任何修飾符的類、方法和成員變量,只能被本包中的所有類訪問(wèn),在包以外任何類都無(wú)法訪問(wèn)它。
相關(guān)文章
JAVA實(shí)現(xiàn)空間索引編碼——GeoHash的示例
本篇文章主要介紹了JAVA實(shí)現(xiàn)空間索引編碼——GeoHash的示例,如何從眾多的位置信息中查找到離自己最近的位置,有興趣的朋友可以了解一下2016-10-10SpringBoot結(jié)合SpringSecurity實(shí)現(xiàn)圖形驗(yàn)證碼功能
這篇文章主要介紹了SpringBoot + SpringSecurity 實(shí)現(xiàn)圖形驗(yàn)證碼功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式
這篇文章主要介紹了Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Java tomcat環(huán)境變量及idea配置解析
這篇文章主要介紹了Java tomcat環(huán)境變量及idea配置解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12在Java中使用redisTemplate操作緩存的方法示例
這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲(chǔ)String、List、Set、Hash、Zset。感興趣的可以了解一下2019-01-01java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07Shiro在springboot中快速實(shí)現(xiàn)方法
Apache Shiro是一個(gè)Java的安全(權(quán)限)框架,可以容易的開(kāi)發(fā)出足夠好的應(yīng)用,既可以在JavaEE中使用,也可以在JavaSE中使用,這篇文章主要介紹了Shiro在springboot中快速實(shí)現(xiàn),需要的朋友可以參考下2023-02-02Java 為什么要避免使用finalizer和Cleaner
這篇文章主要介紹了Java 為什么要避免使用finalizer和Cleaner,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03java 使用Scanner類接收從控制臺(tái)輸入的數(shù)據(jù)方式
這篇文章主要介紹了java 使用Scanner類接收從控制臺(tái)輸入的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08