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