1. Java中的訪問(wèn)控制
表1-1
可見(jiàn)/訪問(wèn)性
public
protected
package
private
在同一類中
yes
yes
yes
Yes
同一包中
yes
yes
yes
no
不同包中
yes
No
No
No
同一包的子類中
yes
yes
yes
No
不同包的子類中
Yes
Yes
No
No
說(shuō)明:
(1) 在java中有public、protected、private三種顯示的修飾符用于控制可見(jiàn)性,package不是顯示的修飾符,它是隱含的,即如果在類、變量等前沒(méi)加顯示的可見(jiàn)性修飾符,那它就是package級(jí)別的。如果在類的定義中沒(méi)有指定package,那么java會(huì)把它放在缺省包中,一般來(lái)說(shuō)這個(gè)缺省的包就是當(dāng)前目錄。
(2) 在子類中的方法如果重載了父類的方法,那么該方法的可見(jiàn)級(jí)別應(yīng)更底或者相同,如父類中的方法是public,那么子類中方法必須是public。
(3) 在java中,一般來(lái)說(shuō),變量成員最好是private,對(duì)它們的訪問(wèn)可以通過(guò)public的方法,在這些方法中可以做些控制以保證數(shù)據(jù)的一致性。這些方法名一般以get和set做為前綴。
2. 包
包名一般為小寫,而類名的第一個(gè)字母一般為大寫,這樣在引用時(shí),可以明顯的分辨出包名和類名。如果在類的定義之前沒(méi)有使用package定義包名,那么該類就屬于缺省的包。
2.1 Hello Package
首先通過(guò)一個(gè)簡(jiǎn)單的package的定義來(lái)學(xué)習(xí)package的使用:
package testPackage;
public class Test
{
public static void main(String args[])
{
mNode node = new mNode();
node.print("hello");
}
}
說(shuō)明:
(1) 使用package關(guān)鍵字指明類所在的包;
(2) package語(yǔ)句必須在文件的最前面;
(3) 編譯時(shí)可使用javac –d . Test.java自動(dòng)產(chǎn)生包需要目錄;
(4) 可以使用java testPackage.Test來(lái)執(zhí)行編譯后的代碼;
2.2 包的幾個(gè)作用:
(1) 可以更好的組織類,包與文件夾類似,文件夾可以將不同的文件放在同一個(gè)文件夾中,而包也可以將不同的類文件放在同一包中;
(2) 減少類名的沖突問(wèn)題,這也與文件夾類似,同一文件夾中的文件不能重名,不同文件中的文件可以重名,同一包中的類名不能重復(fù),不同包中的類名可以重復(fù);
(3) 對(duì)包中的類起了一定的保護(hù)作用,詳見(jiàn)java的訪問(wèn)控制;
2.3 import的使用
(1) 直接引用指定的類,如import java.util.Vector;
(2) 引用一個(gè)包中的多個(gè)類,如import java.awt.*。更確切的說(shuō),它并不是引用java.awt中的所有類,而只引用定義為public的類,并且只引用被代碼引用的類,所以這種引用方法并不會(huì)降低程序的性能;
(3) *號(hào)代替類名,在不能代替包名,如import java.awt.*,只引用java.awt下的類,而不引用java.awt下的包;
(4) import java.awt.F*,這種使用方法是錯(cuò)誤的;
(5) import語(yǔ)句在所有類定義之前,在package定義之后;
(6) import只告訴編譯器及解釋器哪里可以找到類、變量、方法的定義,而并沒(méi)有將這些定義引入代碼中;
2.4 包中類的使用
有以下幾種機(jī)制可以使用包中的類:
(1) 如果要使用的類是屬于java.lang包的,那么可以直接使用類名來(lái)引用指定的類,而不需要加上包名,因?yàn)榘黬ava.lang不用顯示使用import,它是缺省引入的;
(2) 如果要使用的類在其它包(java.lang除外)中,那么可以通過(guò)包名加上類名來(lái)引用該類,如java.awt.Font
(3) 對(duì)于經(jīng)常要使用的類(該類在其它包中),那么最好使用import引用指定的包,如java.awt.*
(4) 如果import引入的不同的包中包含有相同的類名,那么這些類的使用必須加上包名
(5) 接口也可以屬于某個(gè)包,也可以使用import引入其它包中的類和接口