Java訪問修飾符
| 訪問修飾符 | 作用范圍 |
|---|---|
| public | 完全開發(fā) |
| private | 只能本類訪問 |
| protected | 同包及子類訪問 |
| default(無修飾符時(shí)) | 同包訪問 |
Java用于類的修飾符(2個(gè))和限定符(2個(gè))
| 訪問修飾符 | 作用范圍 |
|---|---|
| public | 完全開發(fā) |
| default(無) | 同包訪問 |
注意:內(nèi)部類可以擁有更多的訪問修飾符
| 限定符 | 描述 |
|---|---|
| abstract | 指定為抽象類 |
| final | 指定為最終類,不可被繼承 |
Java用于成員變量的修飾符
- public
- protected
- private
- static
- final
- transient
- volatile
| 限定符 | 描述 |
|---|---|
| static | 類屬性,可通過類名直接調(diào)用 |
| final | 該成員不能被重寫,即定義常量 |
| transient | 不序列化 |
| volatile | 可被多個(gè)線程訪問 (同步變量) |
限定詞含義:
| 限定符 | 描述 |
|---|---|
| static | 類屬性,可通過類名直接調(diào)用 |
| final | 該成員不能被重寫,即定義常量 |
| transient | 不序列化 |
| volatile | 可被多個(gè)線程訪問 (同步變量) |
Java用于成員方法的修飾符
- public
- protected
- private
- static
- final
- abstract
- native
- synchronized
| 限定符 | 描述 |
|---|---|
| static | 類(靜態(tài))方法,可通過類名直接調(diào)用 |
| final | 方法不能被重寫 |
| native | 集成其它語言的代碼 本地方法 |
| abstract | 抽象方法,沒有方法體 |
| synchronized | 控制多個(gè)并發(fā)線程的訪問 (同步方法) |
限定詞含義:
| 限定符 | 描述 |
|---|---|
| static | 類(靜態(tài))方法,可通過類名直接調(diào)用 |
| final | 方法不能被重寫 |
| native | 集成其它語言的代碼 本地方法 |
| abstract | 抽象方法,沒有方法體 |
| synchronized | 控制多個(gè)并發(fā)線程的訪問 (同步方法) |
構(gòu)造函數(shù)的一些注意事項(xiàng)
在 Java 中,無論是 explicit 還是 implicit 方式,都要求在子類的構(gòu)造方法中調(diào)用其父類的構(gòu)造方法。
如果父類無構(gòu)造方法(其實(shí)是一個(gè)默認(rèn)無參的構(gòu)造方法),那么子類的構(gòu)造方法中會(huì)自動(dòng)進(jìn)行調(diào)用;如果 父類有自己的構(gòu)造方法(這時(shí)父類不會(huì)有默認(rèn)無參的構(gòu)造方法),那么在子類的構(gòu)造方法中,必須要調(diào)用父類的某個(gè)構(gòu)造方法,而且必須是在構(gòu)造方法的第一個(gè)語句 中進(jìn)行調(diào)用。 究其原因,想必是 Java 語言設(shè)計(jì)者,要求子類有責(zé)任保證它所繼承的父類盡快進(jìn)入到一個(gè)穩(wěn)定、完整的狀態(tài)中。試想,如果沒有這個(gè)約束,那么子類的某個(gè)繼承自父類的方法可能會(huì)使用到父類中的一些變量,而這些變量并沒有進(jìn)行初始化,從而產(chǎn)生一些難以預(yù)料的后果。
構(gòu)造函數(shù)必須滿足的語法規(guī)則:方法名必須與類名相同;不要聲明返回類型;不能被static、final、synchronized、abstract、native等修飾。
構(gòu)造方法可以被重載,來表達(dá)對(duì)象的多種初始化行為。在重載構(gòu)造方法中可以使用this語句來調(diào)用其他構(gòu)造方法,使用時(shí)應(yīng)該注意:如果在構(gòu)造方法中使用了this語句,則必須作為構(gòu)造方法的第一條語句;只能在一個(gè)構(gòu)造方法中用this語句來調(diào)用類的其他構(gòu)造方法,而不能在成員方法中調(diào)用類的構(gòu)造方法;只能通過this語句來調(diào)用其他構(gòu)造方法,不能通過方法名來直接調(diào)用構(gòu)造方法。
在java中,如果用戶定義的類中沒有提供任何構(gòu)造方法,java語言會(huì)自動(dòng)提供一個(gè)默認(rèn)的構(gòu)造方法,該默認(rèn)構(gòu)造方法沒有參數(shù),用public修飾,且方法體為空。當(dāng)然,程序中也可以顯示的定義默認(rèn)構(gòu)造方法。
如果類中顯示定義了一個(gè)或多個(gè)構(gòu)造方法,并且所有的構(gòu)造方法都帶有參數(shù),那么這個(gè)類就失去了java語言為其準(zhǔn)備的默認(rèn)構(gòu)造方法,此時(shí)若使用該類的默認(rèn)構(gòu)造方法(即不含參數(shù)的構(gòu)造方法)時(shí)就是編譯出錯(cuò)。
父類的構(gòu)造方法不能被子類繼承,但是,在子類的構(gòu)造方法中可以通過super語句調(diào)用父類的構(gòu)造方法。使用super語句應(yīng)該注意:在子類的構(gòu)造方法中使用super語句,它必須作為第一條語句。
在創(chuàng)建子類的對(duì)象時(shí),java虛擬機(jī)首先執(zhí)行父類的構(gòu)造方法,然后再執(zhí)行子類的構(gòu)造方法,在多級(jí)繼承的情況下,將從繼承樹的最上層得父類開始,依次執(zhí)行各個(gè)類的構(gòu)造方法,這可以保證子類對(duì)象從所有直接或間接父類中繼承的實(shí)例變量都被正確的初始化。
如果子類的構(gòu)造方法中沒有用super語句顯示調(diào)用父類的構(gòu)造方法,那么通過這個(gè)構(gòu)造方法創(chuàng)建子類對(duì)象時(shí),java虛擬機(jī)會(huì)自動(dòng)先調(diào)用父類的默認(rèn)構(gòu)造方法,而此時(shí)若父類沒有默認(rèn)構(gòu)造方法時(shí),就是編譯出錯(cuò)。
例如
class A //該類定義了含參數(shù)的構(gòu)造方法,就失去了默認(rèn)的無參的構(gòu)造方法
{
int i;
A(int i) {
this.i=i*2;
}
}
public class B extends A
{
B(int i) {//該構(gòu)造方法沒有super顯示調(diào)用父類的構(gòu)造方法,將自動(dòng)調(diào)用父類的默認(rèn)構(gòu)造方法,而父類A沒有默認(rèn)構(gòu)造方法,這里將編譯錯(cuò)誤
System.out.println(i);
}
public static void main(String[] args) {
B b=new B(2);
}
}
構(gòu)造方法被調(diào)用的幾種方式:
當(dāng)前類的其他構(gòu)造方法通過this語句調(diào)用它;
當(dāng)前類的子類的構(gòu)造方法通過super語句調(diào)用它;
在程序中通過new語句調(diào)用它。
構(gòu)造方法可以處于public、protected、private和默認(rèn)四種訪問級(jí)別之一。當(dāng)構(gòu)造方法為private級(jí)別時(shí),意味著只能在當(dāng)前類訪問它,不能被繼承,不能被其他程序用new創(chuàng)建實(shí)例對(duì)象??梢詫?duì)比其他幾種修飾符的作用:abstract修飾的類,不允許被實(shí)例化,這點(diǎn)和private修飾構(gòu)造方法相同,但abstract修飾的類可以被繼承,擁有子類,可以創(chuàng)建子類的實(shí)例;final類禁止被繼承,這點(diǎn)和private修飾構(gòu)造方法相同,但是final類可以用new創(chuàng)建實(shí)例對(duì)象。