欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Java內(nèi)部類(lèi)——成員內(nèi)部類(lèi)

 更新時(shí)間:2020年08月21日 10:17:55   作者:弗蘭克的貓  
這篇文章主要介紹了Java 成員內(nèi)部類(lèi)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 內(nèi)部類(lèi)的相關(guān)知識(shí),感興趣的朋友可以了解下

  內(nèi)部類(lèi)是什么,簡(jiǎn)單來(lái)說(shuō),就是定義在類(lèi)內(nèi)部的類(lèi)(一本正經(jīng)的說(shuō)著廢話)。

  一個(gè)正經(jīng)的內(nèi)部類(lèi)是長(zhǎng)這樣的:

public class Outer {
  class Inner{
  }
}

  這是為了演示而寫(xiě)的類(lèi),沒(méi)有什么luan用,可以看到Inner類(lèi)置于Outer類(lèi)的內(nèi)部。

  那為什么要大費(fèi)周章的在類(lèi)內(nèi)部定義一個(gè)類(lèi)呢?不能在類(lèi)外部定義類(lèi)嗎??jī)?nèi)部類(lèi)跟外部類(lèi)有什么關(guān)系?

  確實(shí),很多時(shí)候,在外部單獨(dú)定義一個(gè)類(lèi)確實(shí)更加方便,也更加通用,但內(nèi)部類(lèi)的存在自然有其存在的道理,內(nèi)部類(lèi)作為寄生在外部類(lèi)的類(lèi),可以自由訪問(wèn)內(nèi)部類(lèi)的所有的屬性和方法,有沒(méi)有聯(lián)想其我們之前說(shuō)的繼承,子類(lèi)可以繼承父類(lèi)的屬性和方法,但是內(nèi)部類(lèi)有著更高的訪問(wèn)權(quán)限,不僅是public屬性,protected屬性,就連private屬性也可以輕松訪問(wèn),這樣就不會(huì)讓修飾符限制你的想象了(手動(dòng)滑稽)。

  內(nèi)部類(lèi)也分很多種:成員內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)、匿名內(nèi)部類(lèi)。今天先來(lái)說(shuō)說(shuō)第一種:成員內(nèi)部類(lèi)。

  成員內(nèi)部類(lèi)是最簡(jiǎn)單粗暴的內(nèi)部類(lèi),上面那個(gè)栗子中的Inner類(lèi)就是成員內(nèi)部類(lèi),相比普通的類(lèi),成員內(nèi)部類(lèi)是不能有static修飾的成員或者方法的,因?yàn)槌蓡T內(nèi)部類(lèi)是寄生在外部類(lèi)中的,所以必須先有外部類(lèi)實(shí)例才能有成員內(nèi)部類(lèi)。在外部創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),姿勢(shì)也不太一樣,看起來(lái)像是這個(gè)樣子的:

public class Test {
  public static void main(String[] args) {
    Outer.Inner inner = new Outer().new Inner();
  }
}

  在內(nèi)部類(lèi)中可以訪問(wèn)外部類(lèi)的方法和屬性,外部類(lèi)也可以訪問(wèn)內(nèi)部類(lèi)的方法和屬性,舉個(gè)栗子:

public class Outer {
  private int num;
  private Inner inner;

  Outer(){
    num = 1;
    inner = new Inner();
  }

  public void print(){
    System.out.println("Outer.print()");
    System.out.println(inner.num);
    System.out.println(num);
  }

  class Inner{
    private int num;

    Inner(){
      num = 2;
    }

    public void print(){
      System.out.println("Inner.print()");
      System.out.println(this.num);
      System.out.println(Outer.this.num);
    }
  }
}
public class Test {
  public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    outer.print();
    inner.print();
  }
}

  輸出如下:

Outer.print()
3
1
Inner.print()
3
1

  外部類(lèi)訪問(wèn)內(nèi)部類(lèi)的姿勢(shì)是先生成內(nèi)部類(lèi)實(shí)例,然后就能訪問(wèn)所有方法和屬性,內(nèi)部類(lèi)訪問(wèn)外部類(lèi)方法和屬性則直接使用Outer.屬性/方法名 即可。

  在這個(gè)栗子中,我們可以看到內(nèi)部了Inner可以對(duì)外圍類(lèi)Outer的屬性進(jìn)行無(wú)限制的訪問(wèn),盡管它是private修飾的。因?yàn)楫?dāng)我們?cè)趧?chuàng)建某個(gè)外圍類(lèi)的內(nèi)部類(lèi)對(duì)象時(shí),會(huì)往內(nèi)部類(lèi)傳入一個(gè)外部類(lèi)的引用,只要我們?cè)谠L問(wèn)外部類(lèi)的成員時(shí),就會(huì)用這個(gè)引用來(lái)選擇外圍類(lèi)的成員。引用內(nèi)部類(lèi)的時(shí)候,需要使用Outer.Inner這樣的形式來(lái)聲明,而不能直接使用Inner來(lái)聲明(除了在Outer類(lèi)中),當(dāng)需要使用到內(nèi)部類(lèi)的時(shí)候,還是推薦使用getInnerInstance的方式來(lái)獲取,特別是當(dāng)內(nèi)部類(lèi)只有無(wú)參構(gòu)造器的時(shí)候:

public class Outer {
  private int num;
  private Inner inner;

  Outer(){
    num = 1;
    inner = new Inner();
  }

  public Inner getInnerInstance() {
    return new Inner();
  }

  public void print(){
    System.out.println("Outer.print()");
    System.out.println(inner.num);
    System.out.println(num);
  }

  public class Inner{
    private int num;

    Inner(){
      num = 2;
    }

    public void print(){
      System.out.println("Inner.print()");
      System.out.println(this.num);
      System.out.println(Outer.this.num);
    }
  }
}
public class Test {
  public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.Inner inner = outer.getInnerInstance();
    outer.print();
    inner.print();
  }
}

  這樣的話,就能更好的封裝了。

  當(dāng)然,內(nèi)部類(lèi)跟外部類(lèi)還有一個(gè)很重要區(qū)別:內(nèi)部類(lèi)可以用private修飾,而外部類(lèi)是不能使用private修飾的。如果內(nèi)部類(lèi)僅僅在類(lèi)內(nèi)部使用時(shí),使用private修飾后,就可以更好的隱藏內(nèi)部信息。

  至此,內(nèi)部類(lèi)的第一部分講解完畢,歡迎大家繼續(xù)關(guān)注。

以上就是淺析Java內(nèi)部類(lèi)——成員內(nèi)部類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于Java 成員內(nèi)部類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論