Java中訪問修飾符和構(gòu)造函數(shù)的一點(diǎn)總結(jié)

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ì)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容