java類(lèi)的構(gòu)成
java類(lèi)的構(gòu)成
Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群。以下是小編為大家搜索整理的java類(lèi)的基本構(gòu)成,希望能給大家?guī)?lái)幫助!
1:Java 類(lèi)的定義形式
一個(gè)完整的 Java 類(lèi)通常由下面六個(gè)部分組成:
包定義語(yǔ)句
import 語(yǔ)句
類(lèi)定義{
成員變量
構(gòu)造方法
成員方法
}
其中:只有類(lèi)定義和“{}”是不可或缺的,其余部分都可以根據(jù)需要來(lái)定義。
下面分別來(lái)學(xué)習(xí)各個(gè)部分的基本規(guī)則,看看如何寫(xiě) Java 的類(lèi)。
2: 包
2.1:包 是什么
在 Java 中,包是類(lèi)、接口或其它包的集合,包主要用來(lái)將類(lèi)組織起來(lái)成為組,從而對(duì)類(lèi)進(jìn)行管理。
2.2:包 能干什么
包對(duì)于下列工作非常有用:
(1):包允許您將包含類(lèi)代碼的文件組織起來(lái),易于查找和使用適當(dāng)?shù)念?lèi)。
(2):包不止是包含類(lèi)和接口,還能夠包含其它包。形成層次的包空間。
(3):它有助于避免命名沖突。當(dāng)您使用很多類(lèi)時(shí),確保類(lèi)和方法名稱(chēng)的唯一性是非常困難的。包能夠形成層次命名空間,縮小了名稱(chēng)沖突的范圍,易于管理名稱(chēng)。
為便于管理數(shù)目眾多的類(lèi),Java 語(yǔ)言中引入了“包”的概念,可以說(shuō)是對(duì)定義的 Java類(lèi)進(jìn)行“分組” ,將多個(gè)功能相關(guān)的類(lèi)定義到一個(gè)“包”中,以解決命名沖突、引用不方便、安全性等問(wèn)題。
就好似當(dāng)今的戶(hù)籍制度,每個(gè)公民除有自己的名字“張三” 、 “李四”外還被規(guī)定了他的戶(hù)籍地。假定有兩個(gè)人都叫張三,只稱(chēng)呼名字就無(wú)法區(qū)分他們,但如果事先登記他們的戶(hù)籍分別在北京和上海,就可以很容易的用“北京的張三” 、 “上海的張三”將他們區(qū)分開(kāi)來(lái)。如果北京市仍有多個(gè)張三,還可以細(xì)分為“北京市.海淀區(qū)的張三” 、 “北京市.西城區(qū).平安大街的張三”等等,直到能惟一標(biāo)識(shí)每個(gè)“張三”為止。
JDK 中定義的類(lèi)就采用了“包”機(jī)制進(jìn)行層次式管理,下圖顯示了其組織結(jié)構(gòu)的一部分:
從圖中可以看出,一個(gè)名為 java 的包中又包含了兩個(gè)子包:io 包和 lang 包。lang 包中包含了 System, String, Object 三個(gè)類(lèi)的定義。事實(shí)上,Java 包中既可以包含類(lèi)的定義,也可以包含子包,或同時(shí)包含兩者。
簡(jiǎn)而言之: 從 邏輯 上 講 , 包 是一 組 相 關(guān)類(lèi) 的集 合 ; 從 物 理 上 講 , 同 包即 同 目 錄。
2.1:JDK 中常 用的 包
java.lang----包含一些 Java 語(yǔ)言的核心類(lèi),包含構(gòu)成 Java 語(yǔ)言設(shè)計(jì)基礎(chǔ)的類(lèi)。在此包中定義的最重要的一個(gè)類(lèi)是“Object” ,代表類(lèi)層次的根,Java 是一個(gè)單根系統(tǒng),最終的根就是“Object” ,這個(gè)類(lèi)會(huì)在后面講到。
Java 并不具有“自由”的方法,例如,不屬于任何類(lèi)的方法,Java 中的所有方法必須始終屬于某個(gè)類(lèi)。經(jīng)常需要使用數(shù)據(jù)類(lèi)型轉(zhuǎn)換方法。Java 在 Java.lang 包中定義了“包裝對(duì)象”類(lèi),使我們能夠?qū)崿F(xiàn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換。如 Boolean、Character、Integer、Long、Float 和Double,這些在后面會(huì)講到。
此包中的其它類(lèi)包括:
? Math——封裝最常用的數(shù)學(xué)方法,如正弦、余弦和平方根。
? String,StringBuffer——封裝最常用的字符串操作。
你不必顯示導(dǎo)入該包,該 Java 包通常已經(jīng)導(dǎo)入。
java.awt----包含了構(gòu)成抽象窗口工具集(abstract window toolkits)的多個(gè)類(lèi),這些類(lèi)被用來(lái)構(gòu)建和管理應(yīng)用程序的圖形用戶(hù)界面(GUI)。
javax.swing----完全 Java 版的圖形用戶(hù)界面(GUI)解決方案,提供了很多完備的組件,可以應(yīng)對(duì)復(fù)雜的桌面系統(tǒng)構(gòu)建。
java.net----包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類(lèi),如 URL, Socket, ServerSocket 等。
java.io----包含能提供多種輸入/輸出功能的類(lèi)。
java.util----包含一些實(shí)用工具類(lèi),如定義系統(tǒng)特性、使用與日期日歷相關(guān)的方法。還有重要的集合框架。
2.2:Java 中 如何 表達(dá) 包 ——package 語(yǔ) 句
Java 語(yǔ)言使用 package 語(yǔ)句來(lái)實(shí)現(xiàn)包的定義。package 語(yǔ)句必須作為 Java 源文件的第一條語(yǔ)句, 指明該文件中定義的類(lèi)所在的包。 若缺省該語(yǔ)句, 則指定為無(wú)名包, 其語(yǔ)法格式為:
package pkg1[.pkg2[.pkg3…]]; //“[]”表示可選Java 編譯 器 把包對(duì) 應(yīng) 于 文 件系 統(tǒng) 的目 錄管 理,因此包也可以嵌套使用,即一個(gè)包中可以含有類(lèi)的定義也可以含有子包,其嵌套層數(shù)沒(méi)有限制。package 語(yǔ)句中,用‘.’來(lái)指明包的層次;
Java 語(yǔ)言要求包聲明的層次和實(shí)際保存類(lèi)的字節(jié)碼文件的目錄結(jié)構(gòu)存在對(duì)應(yīng)關(guān)系, 以便將來(lái)使用該類(lèi)時(shí)能通過(guò)包名(也就是目錄名)查找到所需要的類(lèi)文件。簡(jiǎn)單地說(shuō)就是包的層次結(jié)構(gòu)需要和文件夾的層次對(duì)應(yīng)。
注意:每 個(gè)源文 件 只 有一 個(gè) 包 的 聲 明, 而 且包 名 應(yīng) 該 全部 小 寫(xiě) 。
具體來(lái)說(shuō),程序員要做以下工作:
2.3:編譯和 生 成 包
如果在程序 Test.java 中已定義了包 p1,就必須將編譯生成的字節(jié)碼文件 Test.class 保存在與包名同名的子目錄中,可以選用下述兩種方式之一:
采用下述命令編譯:
javac Test.java
則編譯器會(huì)在當(dāng)前目錄下生成 Test.class 文件, 再在適合位置手動(dòng)創(chuàng)建一個(gè)名為 p1 的子目錄,將 Test.class 復(fù)制到該 p1 目錄下。
采用簡(jiǎn)化的編譯命令,就是可以帶包編譯
javac -d destpath Test.java
歸入該包的類(lèi)的字節(jié)代碼文件應(yīng)放在 java 的類(lèi)庫(kù)所在路徑的 destpath 子目錄下。 現(xiàn)在包的相對(duì)位置已經(jīng)決定了,但 java 類(lèi)庫(kù)的路徑還是不定的。事實(shí)上,java 可以有多個(gè)存放類(lèi)庫(kù)的目錄,其中的缺省路徑為 java 目錄下的 lib 子目錄,你可以通過(guò)使用-classpath 選項(xiàng)來(lái)確定你當(dāng)前想選擇的類(lèi)庫(kù)路徑。 除此之外, 你還可以在 CLASSPATH 環(huán)境變量中設(shè)置類(lèi)庫(kù)路徑。 destpath 為目標(biāo)路徑, 可以是本地的任何絕對(duì)或相對(duì)路徑。 則編譯器會(huì)自動(dòng)在 destpath目錄下建立一個(gè)子目錄 p1,并將生成的.class 文件自動(dòng)保存到 destpath/p1 下。例如:
javac -d . Test.java
javac -d C: est Test.java
2.4:帶包 運(yùn)行
運(yùn)行帶包的程序,需要使用類(lèi)的全路徑,也就是帶包的路徑,比如上面的那個(gè)程序,就使用如下的代碼進(jìn)行運(yùn)行:
java p1.Test
3:import
為了能夠使用某一個(gè)包的成員,我們需要在 Java 程序中明確導(dǎo)入該包。使用“import”語(yǔ)句可完成此功能。在 java 源文件中 import 語(yǔ)句應(yīng)位于 package 語(yǔ)句之后,所有類(lèi)的定義之前,可以有 0~多條,其語(yǔ)法格式為:
import package1[.package2…].(classname|*);
java 運(yùn)行時(shí)環(huán)境將到 CLASSPATH + package1.[package2…]路徑下尋找并載入相應(yīng)的字節(jié)碼文件 classname.class。 “*”號(hào)為通配符,代表所有的類(lèi)。也就是說(shuō) import 語(yǔ)句為編譯器指明了尋找類(lèi)的途徑。
例,使用 import 語(yǔ)句引入類(lèi)程序:TestPackage.java
java 編譯器默認(rèn)為所有的 java 程序引入了 JDK 的 java.lang 包中所有的類(lèi)(import java.lang.*;) ,其中定義了一些常用類(lèi):System、String、Object、Math 等。因此我們可以直接使用這些類(lèi)而不必顯式引入。但使用其它非無(wú)名包中的類(lèi)則必須先引入、后使用。
3.1:Java 類(lèi) 搜尋方 式
程序中的 import 語(yǔ)句標(biāo)明要引入 p1 包中的 Test 類(lèi), 假定環(huán)境變量 CLASSPATH 的值為
“.;C:jdk6lib;D:ex” , java 運(yùn)行環(huán)境將依次到下述可能的位置尋找并載入該字節(jié)碼
文件 Test.class:
.p1Test.class
C:jdk6libp1Test.class
D:exp1Test.class
其中, “.”代表當(dāng)前路徑,如果在第一個(gè)路徑下就找到了所需的類(lèi)文件,則停止搜索。
否則依次搜索后續(xù)路徑,如果在所有的路徑中都未找到所需的類(lèi)文件,則編譯或運(yùn)行出錯(cuò)。
4: 訪問(wèn)修飾 符
Java 語(yǔ)言允許對(duì)類(lèi)中定義的各種屬性和方法進(jìn)行訪問(wèn)控制, 即規(guī)定不同的保護(hù)等級(jí)來(lái)限制對(duì)它們的使用。為什么要這樣做?Java 語(yǔ)言引入類(lèi)似訪問(wèn)控制機(jī)制的 目的 在 于實(shí) 現(xiàn) 信息的 封 裝 和 隱藏。 Java 語(yǔ)言為對(duì)類(lèi)中的屬性和方法進(jìn)行有效地訪問(wèn)控制, 將它們分為四個(gè)等級(jí):private, 無(wú)修飾符, protected, public,具體規(guī)則如下:
變量和方法可以處于四個(gè)訪問(wèn)級(jí)別中的一個(gè):公共,受保護(hù),無(wú)修飾符或私有。類(lèi)可以在公共或無(wú)修飾級(jí)別。
變量、方法或類(lèi)有缺省(無(wú)修飾符)訪問(wèn)性,如果它沒(méi)有顯式受保護(hù)修飾符作為它的聲明的一部分的話。這種訪問(wèn)性意味著,訪問(wèn)可以來(lái)自任何方法,當(dāng)然這些方法只能在作為對(duì)象的同一個(gè)包中的成員類(lèi)當(dāng)中。
以修飾符 protected 標(biāo)記的變量或方法實(shí)際上比以缺省訪問(wèn)控制標(biāo)記的更易訪問(wèn)。 一個(gè)protected 方法或變量可以從同一個(gè)包中的類(lèi)當(dāng)中的任何方法進(jìn)行訪問(wèn), 也可以是從任何子類(lèi)中的任何方法進(jìn)行訪問(wèn)。 當(dāng)它適合于一個(gè)類(lèi)的子類(lèi)但不是不相關(guān)的類(lèi)時(shí), 就可以使用這種受保護(hù)訪問(wèn)來(lái)訪問(wèn)成員。
5: 類(lèi)定義
Java 程序的基本單位是類(lèi),你建立類(lèi)之后,就可用它來(lái)建立許多你需要的對(duì)象。Java把每一個(gè)可執(zhí)行的成分都變成類(lèi)。
類(lèi)的定義形式如下:
這里,類(lèi)名要是合法的標(biāo)識(shí)符。在類(lèi)定義的開(kāi)始與結(jié)束處必須使用花括號(hào)。你也許想建立一個(gè)矩形類(lèi),那么可以用如下代碼:
6:構(gòu) 造方 法
6.1:什么是構(gòu)造方法
類(lèi)有一個(gè)特殊的成員方法叫作構(gòu)造方法, 它的作用是創(chuàng)建對(duì)象并初始化成員變量。 在創(chuàng)建對(duì)象時(shí),會(huì)自動(dòng)調(diào)用類(lèi)的構(gòu)造方法。
6.2:構(gòu) 造方 法定義規(guī)則
Java 中的構(gòu)造方法必須與該類(lèi)具有相同的名字,并且沒(méi)有方法的返回類(lèi)型(包括沒(méi)有void) 。另外,構(gòu)造方法一般都應(yīng)用 public 類(lèi)型來(lái)說(shuō)明,這樣才能在程序任意的位置創(chuàng)建類(lèi)的實(shí)例--對(duì)象。
6.3:示 例
下面是一個(gè) Rectangle 類(lèi)的構(gòu)造方法,它帶有兩個(gè)參數(shù),分別表示矩形的長(zhǎng)和寬:
6.4:說(shuō)明
每個(gè)類(lèi)至少有一個(gè)構(gòu)造方法。 如果不寫(xiě)一個(gè)構(gòu)造方法, Java 編程語(yǔ)言將提供一個(gè)默認(rèn)的,該構(gòu)造方法沒(méi)有參數(shù),而且方法體為空。
注意:如果一個(gè)類(lèi) 中 已經(jīng) 定義 了 構(gòu) 造方 法則 系 統(tǒng) 不 再 提 供 默認(rèn) 的 構(gòu) 造方
7:析構(gòu)方法
析構(gòu)方法 finalize 的功能是: 當(dāng)對(duì)象被從內(nèi)存中刪除時(shí), 該成員方法將會(huì)被 自動(dòng)調(diào)用。通常,在析構(gòu)方法內(nèi),你可以填寫(xiě)用來(lái)回收對(duì)象內(nèi)部的動(dòng)態(tài)空間的代碼。
特別注意:當(dāng)我們?nèi)フ{(diào)用析構(gòu)方法的時(shí)候,并不會(huì)引起該對(duì)象實(shí)例從內(nèi)存中刪除,而是不會(huì)起到任何作用。
在 Java 編程里面,一般不需要我們?nèi)?xiě)析構(gòu)方法,這里只是了解一下就可以了。
8:屬性
8.1:屬性是什么
簡(jiǎn)單點(diǎn)說(shuō),屬性就是對(duì)象所具有的靜態(tài)屬性。
8.2:定義規(guī)則
Java 類(lèi)中屬性的聲明采用如下格式:
訪問(wèn)修飾符 修飾符 類(lèi)型 屬性名稱(chēng)=初始值;
訪問(wèn)修飾符:可以使用四種不同的訪問(wèn)修飾符中的一種,包括 public(公共的)、protected(受保護(hù)的) ,無(wú)修飾符和 private(私有的) 。public 訪問(wèn)修飾符表示屬性可以從任何其它代碼調(diào)用。private 表示屬性只可以由該類(lèi)中的其它方法來(lái)調(diào)用。protected 將在以后的課程中討論。
修飾符:是對(duì)屬性特性的描述,例如后面會(huì)學(xué)習(xí)到的:static、final 等等。
類(lèi)型:屬性的數(shù)據(jù)類(lèi)型,可以是任意的類(lèi)型。
屬性名稱(chēng):任何合法標(biāo)識(shí)符
初始值:賦值給屬性的初始值。如果不設(shè)置,那么會(huì)自動(dòng)進(jìn)行初始化,基本類(lèi)型使用缺省值,對(duì)象類(lèi)型自動(dòng)初始化為 null。
8.3:說(shuō)明
屬性有時(shí)候也被稱(chēng)為成員變量、實(shí)例變量、域,它們經(jīng)常被互換使用。
9:方 法
9.1:方法是什么
方法就是對(duì)象所具有的動(dòng)態(tài)功能。
9.2:定義規(guī)則
Java 類(lèi)中方法的聲明采用以下格式:訪問(wèn)修飾符 修飾符 返回值類(lèi)型 方法名稱(chēng) (參數(shù)列表) throws 異常列表 {方法體}
訪問(wèn)修飾符:可以使用四種不同的訪問(wèn)修飾符中的一種,包括 public(公共的)、protected(受保護(hù)的) ,無(wú)修飾符和 private(私有的) 。public 訪問(wèn)修飾符表示方法可以從任何其它代碼調(diào)用。private 表示方法只可以由該類(lèi)中的其它方法來(lái)調(diào)用。protected 將在以后的課程中討論。
修飾符:是對(duì)方法特性的描述,例如后面會(huì)學(xué)習(xí)到的:static、final、abstract、synchronized 等等。
返回值類(lèi)型::表示方法返回值的類(lèi)型。 如果方法不返回任何值, 它必須聲明為 void(空)。
Java 技術(shù)對(duì)返回值是很?chē)?yán)格的,例如,如果聲明某方法返回一個(gè) int 值,那么方法必須從所有可能的返回路徑中返回一個(gè) int 值(只能在等待返回該 int 值的上下文中被調(diào)用。 )
方法名稱(chēng):可以是任何合法標(biāo)識(shí)符,并帶有用已經(jīng)使用的名稱(chēng)為基礎(chǔ)的某些限制條件。
參數(shù)列表:允許將參數(shù)值傳遞到方法中。列舉的元素由逗號(hào)分開(kāi),而每一個(gè)元素包含一個(gè)類(lèi)型和一個(gè)標(biāo)識(shí)符。在下面的方法中只有一個(gè)形式參數(shù),用 int 類(lèi)型和標(biāo)識(shí)符 days 來(lái)聲明:public void test(int days){}
throws 異常列表:子句導(dǎo)致一個(gè)運(yùn)行時(shí)錯(cuò)誤(異常)被報(bào)告到調(diào)用的方法中,以便以合適的方式處理它。異常在后面的課程中介紹。
花括號(hào)內(nèi)是方法體,即方法的具體語(yǔ)句序列。
9.3:示例
比如現(xiàn)在有一個(gè)“車(chē)”的類(lèi)——Car, “車(chē)”具有一些基本的屬性,比如四個(gè)輪子,一個(gè)方向盤(pán),車(chē)的品牌等等。當(dāng)然,車(chē)也具有自己的功能,也就是方法,比如車(chē)能夠“開(kāi)動(dòng)”——run。要想車(chē)子能夠開(kāi)動(dòng),需要給車(chē)子添加汽油,也就是說(shuō),需要為 run 方法傳遞一些參數(shù)“油”進(jìn)去。車(chē)子跑起來(lái)過(guò)后,我們需要知道當(dāng)前車(chē)輛運(yùn)行的速度,就需要 run 方法具有返回值“當(dāng)前的速度” 。
9.4:形參和實(shí)參
形參:就是形式參數(shù)的意思。是在定義方法名的時(shí)候使用的參數(shù),用來(lái)標(biāo)識(shí)方法接收的參數(shù)類(lèi)型,在調(diào)用該方法時(shí)傳入。
實(shí)參:就是實(shí)際參數(shù)的意思。是在調(diào)用方法時(shí)傳遞給該方法的實(shí)際參數(shù)。
比如:上面的例子中“int oil”就是個(gè)形式參數(shù),這里只是表示需要加入汽油,這個(gè)方法才能正常運(yùn)行,但具體加入多少,要到真正使用的時(shí)候,也就是調(diào)用這個(gè)方法的時(shí)候才具體確定,加入調(diào)用的時(shí)候傳入“80” ,這就是個(gè)實(shí)際參數(shù)。
形參和實(shí)參有如下基本規(guī)則:
(1):形參和實(shí)參的類(lèi)型必須要一致,或者要符合隱含轉(zhuǎn)換規(guī)則
(2):形參類(lèi)型不是引用類(lèi)型時(shí),在調(diào)用該方法時(shí),是按值傳遞的'。在該方法運(yùn)行時(shí),形參和實(shí)參是不同的變量,它們?cè)趦?nèi)存中位于不同的位置,形參將實(shí)參的值復(fù)制一份,在該方法運(yùn)行結(jié)束的時(shí)候形參被釋放,而實(shí)參內(nèi)容不會(huì)改變。
(3):形參類(lèi)型是引用類(lèi)型時(shí),在調(diào)用該方法時(shí),是按引用傳遞的。運(yùn)行時(shí),傳給方法的是實(shí)參的地址, 在方法體內(nèi)部使用的也是實(shí)參的地址, 即使用的就是實(shí)參本身對(duì)應(yīng)的內(nèi)存空間。所以在函數(shù)體內(nèi)部可以改變實(shí)參的值。
9.5:參數(shù)可變的方法
從 JDK5.0 開(kāi)始,提供了參數(shù)可變的方法。
當(dāng)不能確定一個(gè)方法的入口參數(shù)的個(gè)數(shù)時(shí),5.0 以前版本的 Java 中,通常的做法是將多個(gè)參數(shù)放在一個(gè)數(shù)組或者對(duì)象集合中作為參數(shù)來(lái)傳遞,5.0 版本以前的寫(xiě)法是:
int sum(Integer[] numbers){…}
//在別處調(diào)用該方法
sum(new Integer[] {12,13,20});
而在 5.0 版本中可以寫(xiě)為:
int sum(Integer... numbers){//方法內(nèi)的操作}
注意:方法定義中是三個(gè)點(diǎn)
//在別處調(diào)用該方法
sum(12,13,20);//正確
sum(10,11); //正確
也就是說(shuō),傳入?yún)?shù)的個(gè)數(shù)并不確定。但請(qǐng)注意:傳入?yún)?shù)的類(lèi)型必須是一致的,究其本質(zhì),就是一個(gè)數(shù)組。
顯然,JDK5.0 版本的寫(xiě)法更為簡(jiǎn)易,也更為直觀,尤其是方法的調(diào)用語(yǔ)句,不僅簡(jiǎn)化很多,而且更符合通常的思維方式,更易于理解。
Java類(lèi)基本構(gòu)成
1、包:(package)類(lèi)名管理空間,由于Java編譯器為每個(gè)類(lèi)生成字節(jié)碼文件,且文件名與類(lèi)名相同,因此同名的類(lèi)可能發(fā)生沖突,所以引入了包的概念。
A:包提供了一種命名機(jī)制和可見(jiàn)性限制機(jī)制;在java中將功能相似類(lèi)用一個(gè)包來(lái)進(jìn)行管理
B:定義一個(gè)包package定義,若要定義包,則類(lèi)的第一行必須無(wú)空格,業(yè)務(wù)注釋?zhuān)蝗纾簆ackage+包名。包名通常都由小寫(xiě)字母組成。
2、引入:(import)import語(yǔ)句在功能上與C/C++語(yǔ)言中的include語(yǔ)句相同
A:兩者之間的不同點(diǎn):
a、Include是包含外部文件,import是輸入外部類(lèi),
b、import末尾必須以“;”結(jié)尾。
B:import語(yǔ)句必須放在package之后,若沒(méi)有package,則該語(yǔ)句放在類(lèi)文件名的開(kāi)頭;
C:若要引入某一個(gè)類(lèi),必須寫(xiě)完整的包名和類(lèi)名;如:importpackage.classname
3、類(lèi):(class)類(lèi)是java程序的基本單位,類(lèi)的實(shí)例是對(duì)象。
A:若在源程序中包含有公共類(lèi)的定義,則該源文件名必須與公共類(lèi)的名字完全一致,否則編譯時(shí)就會(huì)報(bào)錯(cuò)。
B:在一個(gè)java源程序中至多只能有一個(gè)公共類(lèi)的定義。
C:若在一個(gè)源程序中有多個(gè)類(lèi)定義,則在編譯時(shí)將為每個(gè)類(lèi)生成一個(gè).class文件
4、變量:(variable)一個(gè)類(lèi)中通常都包含數(shù)據(jù)和函數(shù)兩種類(lèi)型的元素,一般把它們稱(chēng)為變量和成員函數(shù);也把成員函數(shù)成為方法。
將數(shù)據(jù)和代碼通過(guò)類(lèi)結(jié)合在一起,就行成了封裝的概念。
變量也叫做域,它是用于定義屬性類(lèi)的數(shù)據(jù),這些數(shù)據(jù)是用來(lái)描述對(duì)象的狀態(tài),方法就是對(duì)這個(gè)數(shù)據(jù)進(jìn)行操作。
5、方法:(method)指引類(lèi)進(jìn)行具體的活動(dòng)和操作
6、注釋?zhuān)簀ava注釋分為三種
A:?jiǎn)涡凶⑨專(zhuān)河?/表示
B:多行注釋?zhuān)河?*.................................................*/表示
C:文檔注釋?zhuān)河?**.................................................*/表示
java類(lèi)文件內(nèi)容介紹
一、什么是Java類(lèi)文件
Java類(lèi)文件是Java程序的二進(jìn)制表示形式。每一個(gè)類(lèi)文件代表一個(gè)類(lèi)或者接口。不可能在一個(gè)類(lèi)文件中放入多個(gè)類(lèi)或者接口。這樣就使得無(wú)論類(lèi)文件是在哪一種平臺(tái)上生成,都可以在任何主機(jī)上執(zhí)行。
雖然類(lèi)文件是Java體系結(jié)構(gòu)的一部分,但是他并不是與Java語(yǔ)言不可分的。你可以將其他語(yǔ)言的程序編譯為類(lèi)文件,也可以將Java程序文件編譯為其他二進(jìn)制形式。
Java類(lèi)文件是一個(gè)基于8-bit字節(jié)的二進(jìn)制流。數(shù)據(jù)塊順序的、無(wú)分割符的、big-endian的形式存儲(chǔ)。
二、類(lèi)文件的內(nèi)容
Java的類(lèi)文件中包含了所有Java虛擬機(jī)所需要的關(guān)于類(lèi)和接口的信息。所有類(lèi)文件中的信息都以以下的四種基本類(lèi)型的存儲(chǔ):
Table 6-1. Class file "primitive types"
u1 a single unsigned byte
u2 two unsigned bytes
u4 four unsigned bytes
u8 eight unsigned bytes
1、魔術(shù)編碼(magic)
每一個(gè)Java類(lèi)文件的開(kāi)頭四個(gè)字節(jié)都是魔術(shù)編碼(OxCAFEBABE)。通過(guò)魔術(shù)編碼可以很容易識(shí)別類(lèi)文件。
2、副版本號(hào)和主版本號(hào)(minor version and major version)
剩下的四個(gè)字節(jié)是副版本號(hào)和主版本號(hào)。但Java技術(shù)在進(jìn)化時(shí),一些新的特性可能會(huì)被加入到類(lèi)文件中。每一次類(lèi)文件格式的變化,都會(huì)相應(yīng)的改變版本號(hào)。虛 擬機(jī)通過(guò)版本號(hào)來(lái)識(shí)別自己能夠處理的類(lèi)文件。Java虛擬機(jī)往往只能處理一個(gè)給定的主版本號(hào)和其下的一些副版本號(hào)。虛擬機(jī)必須拒絕那些不再處理范圍內(nèi)的類(lèi) 文件。
Java類(lèi)和對(duì)象的概念
Java是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,理解Java,首先要理解類(lèi)與對(duì)象這兩個(gè)概念。
Java中的類(lèi)可以看做C語(yǔ)言中結(jié)構(gòu)體的升級(jí)版。結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類(lèi)型,可以包含不同的成員(變量),每個(gè)成員的數(shù)據(jù)類(lèi)型可以不一樣;可以通過(guò)結(jié)構(gòu)體來(lái)定義結(jié)構(gòu)體變量,每個(gè)變量擁有相同的性質(zhì)。例如:
#include
運(yùn)行結(jié)果:
小明的年齡是 15,成績(jī)是 92.500000
Java中的類(lèi)也是一種構(gòu)造數(shù)據(jù)類(lèi)型,但是進(jìn)行了一些擴(kuò)展,類(lèi)的成員不但可以是變量,還可以是函數(shù);通過(guò)類(lèi)定義出來(lái)的變量也有特定的稱(chēng)呼,叫做“對(duì)象”。例如:
public class Demo {public static void main(String[] args){// 定義類(lèi)Studentclass Student{ // 通過(guò)class關(guān)鍵字類(lèi)定義類(lèi)// 類(lèi)包含的變量String name;int age;float score;// 類(lèi)包含的函數(shù)void say(){System.out.println( name + "的年齡是 " + age + ",成績(jī)是 " + score );}}// 通過(guò)類(lèi)來(lái)定義變量,即創(chuàng)建對(duì)象Student stu1 = new Student(); // 必須使用new關(guān)鍵字// 操作類(lèi)的成員stu1.name = "小明";stu1.age = 15;stu1.score = 92.5f;stu1.say();}}
運(yùn)行結(jié)果:
小明的年齡是 15,成績(jī)是 92.5
在C語(yǔ)言中,通過(guò)結(jié)構(gòu)體名稱(chēng)就可以完成結(jié)構(gòu)體變量的定義,并分配內(nèi)存空間;但是在Java中,僅僅通過(guò)類(lèi)來(lái)定義變量不會(huì)分配內(nèi)存空間,必須使用new關(guān)鍵字來(lái)完成內(nèi)存空間的分配。
可以將類(lèi)比喻成圖紙,對(duì)象比喻成零件,圖紙說(shuō)明了零件的參數(shù)及其承擔(dān)的任務(wù);一張圖紙可以生產(chǎn)出具有相同性質(zhì)的零件,不同圖紙可以生產(chǎn)不同類(lèi)型的零件。
在Java中,使用new關(guān)鍵字,就可以通過(guò)類(lèi)來(lái)創(chuàng)建對(duì)象,即將圖紙生產(chǎn)成零件,這個(gè)過(guò)程叫做類(lèi)的實(shí)例化,因此也稱(chēng)對(duì)象是類(lèi)的一個(gè)實(shí)例。
注意:類(lèi)只是一張圖紙,起到說(shuō)明的作用,不占用內(nèi)存空間;對(duì)象才是具體的零件,要有地方來(lái)存放,才會(huì)占用內(nèi)存空間。
類(lèi)所包含的變量和函數(shù)都有特定的稱(chēng)呼,變量被稱(chēng)為屬性(通常也稱(chēng)成員變量),函數(shù)被稱(chēng)為方法,屬性和方法統(tǒng)稱(chēng)為類(lèi)的成員。
面向?qū)ο缶幊?Object Oriented Programming, OOP)
類(lèi)是一個(gè)通用的概念,Java、C++、C#、PHP等很多編程語(yǔ)言中都有類(lèi),都可以通過(guò)類(lèi)創(chuàng)建對(duì)象。可以將類(lèi)看做是結(jié)構(gòu)體的升級(jí)版,C語(yǔ)言的晚輩們看到了C語(yǔ)言的不足,嘗試加以改善,繼承了結(jié)構(gòu)體的思想,并進(jìn)行了升級(jí),讓程序員在開(kāi)發(fā)或擴(kuò)展大中型項(xiàng)目時(shí)更加容易。
因?yàn)镴ava、C++等語(yǔ)言都支持類(lèi)和對(duì)象,所以使用這些語(yǔ)言編寫(xiě)程序也被稱(chēng)為面向?qū)ο缶幊,這些語(yǔ)言也被稱(chēng)為面向?qū)ο蟮木幊陶Z(yǔ)言。C語(yǔ)言因?yàn)椴恢С诸?lèi)和對(duì)象的概念,被稱(chēng)為面向過(guò)程的編程語(yǔ)言。
實(shí)際上,面向?qū)ο笾皇敲嫦蜻^(guò)程的升級(jí)。
在C語(yǔ)言中,可以將完成某個(gè)功能的重復(fù)使用的代碼塊定義為函數(shù),將具有一類(lèi)功能的函數(shù)聲明在一個(gè)頭文件中,不同類(lèi)型的函數(shù)聲明在不同的頭文件,以便對(duì)函數(shù)進(jìn)行更好的管理,方便編寫(xiě)和調(diào)用。
在Java中,可以將完成某個(gè)功能的代碼塊定義為方法,將具有相似功能的方法定義在一個(gè)類(lèi)中,也就是定義在一個(gè)源文件中(因?yàn)橐粋(gè)源文件只能包含一個(gè)公共的類(lèi)),多個(gè)源文件可以位于一個(gè)文件夾,這個(gè)文件夾有特定的稱(chēng)呼,叫做包。
圖1 C語(yǔ)言中項(xiàng)目的組織結(jié)構(gòu)
圖2 Java中項(xiàng)目的組織結(jié)構(gòu)
面向?qū)ο缶幊淘谲浖䦂?zhí)行效率上絕對(duì)沒(méi)有任何優(yōu)勢(shì),它的主要目的是方便程序員組織和管理代碼,快速梳理編程思路,帶來(lái)編程思想上的革新。
Java類(lèi)和對(duì)象的初始化順序
類(lèi)裝載步驟
在Java中,類(lèi)裝載器把一個(gè)類(lèi)裝入Java虛擬機(jī)中,要經(jīng)過(guò)三個(gè)步驟來(lái)完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗(yàn)、準(zhǔn)備和解析三步,除了解析外,其它步驟是嚴(yán)格按照順序完成的,各個(gè)步驟的主要工作如下:
裝載:查找和導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù);
鏈接:執(zhí)行下面的校驗(yàn)、準(zhǔn)備和解析步驟,其中解析步驟是可以選擇的;
校驗(yàn):檢查導(dǎo)入類(lèi)或接口的二進(jìn)制數(shù)據(jù)的正確性;
準(zhǔn)備:給類(lèi)的靜態(tài)變量分配并初始化存儲(chǔ)空間;
解析:將符號(hào)引用轉(zhuǎn)成直接引用;
初始化:激活類(lèi)的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊。
其中 初始化(initialization)包含兩部分:
1.類(lèi)的初始化(initialization class & interface)
2.對(duì)象的創(chuàng)建(creation of new class instances)。
因?yàn)轭?lèi)的初始化其實(shí)是類(lèi)加載(loading of classes)的最后一步,所以很多書(shū)中把它歸結(jié)為“對(duì)象的創(chuàng)建”的第一步。其實(shí)只是看問(wèn)題的角度不同而已。為了更清楚的理解,這里還是分開(kāi)來(lái)。
順序:
因?yàn)轭?lèi)的加載肯定是第一步的,所以類(lèi)的初始化在前。大體的初始化順序是:
類(lèi)初始化 -> 子類(lèi)構(gòu)造函數(shù) -> 父類(lèi)構(gòu)造函數(shù) -> 實(shí)例化成員變量 -> 繼續(xù)執(zhí)行子類(lèi)構(gòu)造函數(shù)的語(yǔ)句
下面結(jié)合例子,具體解釋一下。
1. 類(lèi)的初始化(Initialization classes and interfaces)
其實(shí)很簡(jiǎn)單,具體來(lái)說(shuō)有:
(a)初始化類(lèi)(initialization of class),是指初始化static field 和執(zhí)行static初始化塊。
public class Demo{ //初始化static field, //其中= "initialization static field"又叫做static field initializer private static String str = "initialization static field"; //初始化塊,又叫做static initializer,或 static initialization block static { System.out.println("This is static initializer"); } }
btw,有些書(shū)上提到static initializer 和 static field initializer 的概念,與之對(duì)應(yīng)的還有 instance initializer 和 instance variable initializer。例子中的注釋已經(jīng)解釋了其含義。
(b)初始化接口(initialization of interface),是指初始化定義在該interface中的field。
*注意*
1. initialization classes 時(shí),該class的superclass 將首先被初始化,但其實(shí)現(xiàn)的interface則不會(huì)。
initialization classes 時(shí),該class的superclass,以及superlcass的superclass 會(huì)首先被遞歸地初始化,一直到j(luò)ava.lang.Object為止。但initialiazation interface的時(shí)候,卻不需如此,只會(huì)初始化該interface本身。
2. 對(duì)于由引用類(lèi)變量(class field)所引發(fā)的初始化,只會(huì)初始化真正定義該field的class。
3. 如果一個(gè)static field是編譯時(shí)常量(compile-time constant),則對(duì)它的引用不會(huì)引起定義它的類(lèi)的初始化。
為了幫助理解最后兩點(diǎn),請(qǐng)?jiān)囋嚳聪旅娴睦樱?/p>
Initialization類(lèi)
public class Initialization { static { System.out.println("Initialization Main class"); } public static void main(String[] args) { System.out.println(Sub.y); System.out.println(Sub.x); System.out.println(Sub.z); } }
Sub類(lèi)
public class Sub extends Super { public static final int y = 2005; public static int z; static { System.out.println("Initialization Sub"); } }
Super類(lèi)
public class Super { public static int x = 2006; static { System.out.println("Initialization Super"); } }
輸入結(jié)果
Initialization Main class
2005
Initialization Super
2006
Initialization Sub
從這個(gè)結(jié)果可以看到,
static塊在類(lèi)中會(huì)先執(zhí)行;(實(shí)際上是先加載static成員變量,然后是static代碼塊)
static 的final變量不會(huì)引起類(lèi)的初始化;
子類(lèi)Sub引用父類(lèi)Super里面的變量,就會(huì)引起父類(lèi)的初始化,但不會(huì)引起子類(lèi)的初始化;
static的成員變量也有默認(rèn)值。
2. 對(duì)象的創(chuàng)建(creation of new class instances)
看例子來(lái)說(shuō)明:
InitializationOrder類(lèi)
public class InitializationOrder { public static void main(String[] args) { SubClass sb = new SubClass(); } }
SuperClass類(lèi)
public class SuperClass{ static { System.out.println("SuperClass static"); } SuperClass(String str){ System.out.println(str); } }
Interface類(lèi)
interface Interface{ static SuperClass su = new SuperClass("Interface new SuperClass"); }
SubClass類(lèi)
public class SubClass extends SuperClass implements Interface{ static { System.out.println("SubClass static"); } private SuperClass su = new SuperClass("initialization variable"); SubClass() { super("super"); new SuperClass("new SuperClass"); } }
輸出結(jié)果
SuperClass static
SubClass static
super
initialization variable
new SuperClass
解釋一下:
1) Java虛擬機(jī)要執(zhí)行InitializationOrder類(lèi)中的static 方法main(),這引起了類(lèi)的初始化。開(kāi)始初始化InitializationOrder類(lèi)。具體的步驟略去不說(shuō)。
2) InitializationOrder類(lèi)初始化完畢后,開(kāi)始執(zhí)行main()方法。語(yǔ)句SubClass sb = new SubClass()將創(chuàng)建一個(gè)SubClass對(duì)象。加載類(lèi)SubClass后對(duì)其進(jìn)行類(lèi)初始化,因?yàn)镾ubclass有一個(gè)父類(lèi)SuperClass,所以先初始化SuperClass類(lèi)。于是看到輸出“SuperClass static”。
3) SuperClass類(lèi)初始化完畢后,開(kāi)始初始化SubClass類(lèi),輸出“SubClass static”。
4) 至此,類(lèi)的加載工作全部完成。開(kāi)始進(jìn)入創(chuàng)建SubClass的對(duì)象過(guò)程。先為SubClass類(lèi)和其父類(lèi)SuperClass類(lèi)分配內(nèi)存空間,這時(shí)Super su 被賦值為null。
5) 執(zhí)行構(gòu)造函數(shù)SubClass(),執(zhí)行super(), 調(diào)用父類(lèi)的構(gòu)造函數(shù),輸出“super”。
6) 初始化SubClass類(lèi)的成員變量su,輸出“initialization variable”。
7) 繼續(xù)執(zhí)行構(gòu)造函數(shù)的剩余部分,執(zhí)行new SuperClass("new SuperClass"),輸出“new SuperClass”,這時(shí)Super su 被賦值新建對(duì)象的引用。
8) 而SubClass雖然實(shí)現(xiàn)了接口Interface,但是初始化它的時(shí)候并不會(huì)引起接口的初始化,所以接口Interface中的static SuperClass su = new SuperClass("Interface new SuperClass")自始至終都沒(méi)有被執(zhí)行到。
所以對(duì)象的創(chuàng)建,具體步驟如下:
(1) 所有的成員變量—包括該類(lèi),及它的父類(lèi)中的成員變量--被分配內(nèi)存空間,并賦予默認(rèn)值。(這里是第一次初始化成員變量)
(2) 為所調(diào)用的構(gòu)造函數(shù)初始化其參數(shù)變量。(如果有參數(shù))
(3) 如果在構(gòu)造函數(shù)中用this 調(diào)用了同類(lèi)中的其他構(gòu)造函數(shù),則按照步驟(2)~(6)去處理被調(diào)用到的構(gòu)造函數(shù)。
(4) 如果在構(gòu)造函數(shù)中用super調(diào)用了其父類(lèi)的構(gòu)造函數(shù),則按照步驟(2)~(6)去處理被調(diào)用到的父類(lèi)構(gòu)造函數(shù)。
(5) 按照書(shū)寫(xiě)順序,執(zhí)行instance initializer 和 instance variable initializer來(lái)初始化成員變量。(這里是第二次初始化成員變量)
(6) 按照書(shū)寫(xiě)順序,執(zhí)行構(gòu)造函數(shù)的其余部分。
總結(jié):
從類(lèi)的初始化和對(duì)象的創(chuàng)建步驟,可以知道,一個(gè)類(lèi)是先初始化static的變量和static句塊,然后在分配該類(lèi)以及父類(lèi)的成員變量的內(nèi)存空間,賦予默認(rèn)值,然后開(kāi)始調(diào)用構(gòu)造函數(shù)。而子類(lèi)和父類(lèi)之間,則先初始化和創(chuàng)建父類(lèi),然后在初始化和創(chuàng)建子類(lèi)的。
java system類(lèi)使用方法示例
常用的方法:
復(fù)制代碼 代碼如下:
long currentTimeMillis(); 獲取當(dāng)前時(shí)間的毫秒值
void exit();終止當(dāng)前正在運(yùn)行的 Java 虛擬機(jī)。
復(fù)制代碼 代碼如下:
public static void Method(){
long l = System.currentTimeMillis();
System.out.println(l);
System.exit();
}
描述系統(tǒng)屬性信息:Properties System.getProperties();
該方法獲取的信息存儲(chǔ)在Properties集合中
因?yàn)镻roperties是Hashtable的子類(lèi),也就是Map集合的一個(gè)子類(lèi)對(duì)象,要倒入util包
那么可以通過(guò)map的方法取出該集合中的元素
該集合中的鍵和值存儲(chǔ)的都是字符串,沒(méi)有泛型的定義
復(fù)制代碼 代碼如下:
public static void Method Properties(){
//獲取當(dāng)前系統(tǒng)所有屬性信息
Properties prop = System.getProperties();
//遍歷prop中的屬性信息,也可以使用迭代器
for(Object obj : prop.keySet()){
String value = (String)prop.get(obj);
System.out.println(obj+"==="+value);
//通過(guò)鍵獲取對(duì)應(yīng)的屬性信息
String value = System.getProperty("os.name");//如果沒(méi)有該鍵返回null
System.out.println(value);
}
}
在系統(tǒng)中自定義系統(tǒng)信息
復(fù)制代碼 代碼如下:
public static void SetProperties(){
System.setProperty("makey","myvalue");
System.out.println(System.getProperty("makey"));
}
out:標(biāo)準(zhǔn)輸出,默認(rèn)是顯示器
in:標(biāo)準(zhǔn)輸入,默認(rèn)是鍵盤(pán)
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 yyfangchan@163.com (舉報(bào)時(shí)請(qǐng)帶上具體的網(wǎng)址) 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除