為了便于管理大型軟件系統中數目眾多的類(lèi),解決類(lèi)命名的沖突的問(wèn)題,Java引入了包,與文件系統的目錄機制類(lèi)似。
package必須是第一個(gè)語(yǔ)句(除了注釋和空白),包名通常用小寫(xiě)的形式
如果不加package語(yǔ)句,則指定為缺省包或無(wú)名包
包對應著(zhù)文件系統的目錄層次結構
(不識廬山真面目,只緣身在此山中)
javac 什么都不加,是在當前目錄生成class,若要在當前目錄下生成包:javac -d . test.java(.表示當前路徑);若要在指定目錄下生成包:javac -d d:\ test.java(-d <directory>:Specify where to place generated class files)
import語(yǔ)句
引入包中的類(lèi):import java.io.File
引入整個(gè)包 :import java.io.*
在同一個(gè)包中的類(lèi)可以互相引用,無(wú)需import語(yǔ)句
lang包自動(dòng)導入
Sun公司把類(lèi)用jar包的形式提供(D:\j2sdk1.4.2_11\jre\lib\rt.jar\java\io)
javac -d . *.java(不用考慮源文件編譯順序)
類(lèi)的說(shuō)明符
類(lèi)的訪(fǎng)問(wèn)說(shuō)明符:
public類(lèi)(可被其他包中的類(lèi)訪(fǎng)問(wèn),但還要用import導入,或寫(xiě)上完整類(lèi)名,即包名.類(lèi)名)
default不加訪(fǎng)問(wèn)說(shuō)明符(此類(lèi)只能在同一個(gè)包中被訪(fǎng)問(wèn))
類(lèi)的其他修飾符:final、abstract
final類(lèi):該類(lèi)是最終的類(lèi),不能由該類(lèi)派生出其他的子類(lèi)(java類(lèi)庫中的String就是一個(gè)final類(lèi))
| | public | protected | default | private |
| 同類(lèi) | OK | OK | OK | OK |
| 同包 | OK | OK | OK | NOT |
| 子類(lèi)(不同包) | OK | OK | NOT | NOT |
| 通用性(不同包中無(wú)關(guān)系的類(lèi)) | OK | NOT | NOT | NOT |
方法的說(shuō)明符
方法的訪(fǎng)問(wèn)說(shuō)明符:
public、protected、不加訪(fǎng)問(wèn)說(shuō)明符、private
方法的其他修飾符:
static、final、abstract、native、synchronized
final方法:
為了確保某個(gè)函數的行為在繼承過(guò)程中保持不變,并請不能被子類(lèi)覆蓋,可以使用final方法
為了效率上的考慮,將方法聲明為final,讓編譯器對此方法的調用進(jìn)行優(yōu)化。要注意的是:編譯器會(huì )自行對final方法進(jìn)行判斷,并決定是否進(jìn)行優(yōu)化。通常在方法的體積很小,而我們確實(shí)不希望它被覆蓋時(shí),才將它聲明為final
class中所有的private和static方法自然就是final(寫(xiě)一個(gè)與基類(lèi)相同的private和static方法,編譯器不會(huì )報錯,其實(shí)并沒(méi)有覆蓋基類(lèi)的方法,而是產(chǎn)生了新的子類(lèi)的方法)
抽象方法和抽象類(lèi):
在類(lèi)中沒(méi)有方法體的方法(沒(méi)有{},而不是指在{}中沒(méi)有代碼?。?,就是抽象方法
含有抽象方法的類(lèi),即為抽象類(lèi),抽象類(lèi)不能被實(shí)例化
如果一個(gè)子類(lèi)沒(méi)有實(shí)現抽象基類(lèi)中所有的抽象方法,則子類(lèi)也成為一個(gè)抽象類(lèi)
我們可以將一個(gè)沒(méi)有任何方法的類(lèi)聲明為abstract,避免由這個(gè)類(lèi)產(chǎn)生任何的對象
在面向對象的編程過(guò)程中,我們把對象與對象間共有的方法抽象出來(lái)放到基類(lèi)當中,在某些方法無(wú)法確定的時(shí)候,可以把它聲明為抽象類(lèi),由子類(lèi)去具體實(shí)現這個(gè)方法。比如對于“動(dòng)物”這個(gè)類(lèi),每個(gè)動(dòng)物都會(huì )有“睡覺(jué)”這個(gè)行為,但有站著(zhù)睡的,有倒掛著(zhù)睡的等等
native方法:native方法是用戶(hù)在Java中可以使用,但不能編寫(xiě)的方法
JNI(Java Native Interface),它允許Java虛擬機(JVM)內部運行的Java代碼能夠與用其他編程語(yǔ)言(如C、C++、匯編語(yǔ)言)編寫(xiě)的應用程序和庫進(jìn)行互操作。其最大的好處是他沒(méi)有對底層Java虛擬機的實(shí)現施加任何限制,因此,Java虛擬機場(chǎng)上可以在不影響虛擬機其他部分的情況下添加對JNI的支持。程序員只需編寫(xiě)一種版本的本地(Native)應用程序和庫,就能夠與所有支持JNI的Java虛擬機協(xié)同工作。JNI可以理解為Java和本地應用程序之間的中介。如果想訪(fǎng)問(wèn)操作系統特有的功能,可以使用JNI,若想重復使用過(guò)去編寫(xiě)的非Java程序,或使用實(shí)時(shí)性較強的語(yǔ)言,也可以使用JNI。
用javah.exe編譯類(lèi)會(huì )產(chǎn)生頭文件
java.lang包下的Object類(lèi)是所有類(lèi)的祖先類(lèi),當一個(gè)類(lèi)沒(méi)有從另一個(gè)類(lèi)派生的話(huà),它就總是從Object這個(gè)類(lèi)派生
垃圾回收器(見(jiàn)Garbage.java):
Object類(lèi)中有一個(gè)方法finalize()是一個(gè)protected的方法(Called by the garbage collector on an object when garbage collection determines that there are no more references to the object),低優(yōu)先級,在內存不夠的情況下才會(huì )自動(dòng)運行垃圾回收器,垃圾回收器會(huì )先運行finalize()。若要讓垃圾回收器運行,可使用java.lang包下的System類(lèi)中的gc()方法(Runs the garbage collector)顯式調用垃圾回收器
class Garbage
{
int index;
static int count;
Garbage()
{
count++;
System.out.println("object"+count+"construct");
setID(count);
}
void setID(int id)
{
index=id;
}
protected void finalize()
{
System.out.println("object"+index+"is reclaimed");
}
public static void main(String[] args)
{
new Garbage();
new Garbage();
new Garbage();
new Garbage();
//System.gc();
}
}
接口:
接口當中所有的方法都是抽象的,它定義了一類(lèi)行為的集合,這些行為的實(shí)現由其實(shí)現類(lèi)來(lái)實(shí)現,提供了代碼實(shí)現的靈活性。
用interface定義接口 接口中的所有方法缺省為public abstract(無(wú)需顯式寫(xiě))
在接口中聲明方法時(shí),不能使用native、static、final、synchronized、private、protected等修飾符
接口一個(gè)重要作用是可以作為模塊與模塊間的通訊協(xié)議。一個(gè)人實(shí)現接口,一個(gè)人調用接口
和public類(lèi)一樣,public接口也必須定義在與接口同名的文件中
接口中可以有數據成員,這些成員默認都是public static final
一個(gè)接口可以繼承自另一個(gè)接口
Java中不允許類(lèi)的多繼承,但允許接口的多繼承
Java中,一個(gè)類(lèi)可以實(shí)現多個(gè)接口
一個(gè)類(lèi)在繼承一個(gè)類(lèi)的同時(shí),還可以實(shí)現多個(gè)接口(先extends后implements)
派生類(lèi)的方法覆蓋基類(lèi)的方法的時(shí)候,派生類(lèi)的方法的訪(fǎng)問(wèn)權限不能低于基類(lèi)方法的訪(fǎng)問(wèn)權限(基類(lèi)default,派生類(lèi)就至少要為default,可以為public),在接口當中也是如此
接口不能直接實(shí)例化一個(gè)對象