乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java 內(nèi)部類和靜態(tài)內(nèi)部類的區(qū)別

       黃家v少 2019-03-26

      下面說一說內(nèi)部類(Inner Class)和靜態(tài)內(nèi)部類(Static Nested Class)的區(qū)別:
      定義在一個(gè)類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明 為abstract的供其他內(nèi)部類或外部類繼承與擴(kuò)展,或者聲明為static、final的,也可以實(shí)現(xiàn)特定的接口。外部類按常規(guī)的類訪問方式使用內(nèi)部 類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。

      (1)創(chuàng)建實(shí)例

         OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部類實(shí)例.new,內(nèi)部類

         AAA.StaticInner in = new AAA.StaticInner();//注意是外部類本身,靜態(tài)內(nèi)部類

      (2)內(nèi)部類中的this

         內(nèi) 部類中的this與其他類一樣是指的本身。創(chuàng)建內(nèi)部類對(duì)象時(shí),它會(huì)與創(chuàng)造它的外圍對(duì)象有了某種聯(lián)系,于是能訪問外圍類的所有成員,不需任何特殊條件,可理 解為內(nèi)部類鏈接到外部類。 用外部類創(chuàng)建內(nèi)部類對(duì)象時(shí),此內(nèi)部類對(duì)象會(huì)秘密的捕獲一個(gè)指向外部類的引用,于是,可以通過這個(gè)引用來訪問外圍類的成員。

      (3)外部類訪問內(nèi)部類

         內(nèi)部類類似外部類的屬性,因此訪問內(nèi)部類對(duì)象時(shí)總是需要一個(gè)創(chuàng)建好的外部類對(duì)象。內(nèi)部類對(duì)象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:
             System.out.println("Print in inner Outer.index=" + pouter.this.index);
             System.out.println("Print in inner Inner.index=" + this.index);

      (4)內(nèi)部類向上轉(zhuǎn)型

         內(nèi)部類也可以和普通類一樣擁有向上轉(zhuǎn)型的特性。將內(nèi)部類向上轉(zhuǎn)型為基類型,尤其是接口時(shí),內(nèi)部類就有了用武之地。如果內(nèi)部類是private的,只可以被它的外部類問,從而完全隱藏實(shí)現(xiàn)的細(xì)節(jié)。

      (5)方法內(nèi)的類

         方法內(nèi)創(chuàng)建的類(注意方法中也能定義類),不能加訪問修飾符。另外,方法內(nèi)部的類也不是在調(diào)用方法時(shí)才會(huì)創(chuàng)建的,它們一樣也被事先編譯了。

      (6)靜態(tài)內(nèi)部類

         定義靜態(tài)內(nèi)部類:在定義內(nèi)部類的時(shí)候,可以在其前面加上一個(gè)權(quán)限修飾符static。此時(shí)這個(gè)內(nèi)部類就變?yōu)榱遂o態(tài)內(nèi)部類。

      通常稱為嵌套類,當(dāng)內(nèi)部類是static時(shí),意味著:

         [1]要?jiǎng)?chuàng)建嵌套類的對(duì)象,并不需要其外圍類的對(duì)象;

         [2]不能從嵌套類的對(duì)象中訪問非靜態(tài)的外圍類對(duì)象(不能夠從靜態(tài)內(nèi)部類的對(duì)象中訪問外部類的非靜態(tài)成員);

         嵌 套類與普通的內(nèi)部類還有一個(gè)區(qū)別:普通內(nèi)部類的字段與方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段, 也不能包含嵌套類。但是在嵌套類里可以包含所有這些東西。也就是說,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員,只有將某個(gè)內(nèi)部類修飾為靜態(tài)類,然后才能夠在這 個(gè)類中定義靜態(tài)的成員變量與成員方法。

         另外,在創(chuàng)建靜態(tài)內(nèi)部類時(shí)不需要將靜態(tài)內(nèi)部類的實(shí)例綁定在外部類的實(shí)例上。普通非靜態(tài)內(nèi)部類的 對(duì)象是依附在外部類對(duì)象之中的,要在一個(gè)外部類中定義一個(gè)靜態(tài)的內(nèi)部類,不需要利用關(guān)鍵字new來創(chuàng)建內(nèi)部類的實(shí)例。靜態(tài)類和方法只屬于類本身,并不屬于 該類的對(duì)象,更不屬于其他外部類的對(duì)象。

      (7)內(nèi)部類標(biāo)識(shí)符

         每個(gè)類會(huì)產(chǎn)生一個(gè).class文件,文件名即為類名。同樣,內(nèi)部類也會(huì)產(chǎn)生這么一個(gè).class文件,但是它的名稱卻不是內(nèi)部類的類名,而是有著嚴(yán)格的限制:外圍類的名字,加上$,再加上內(nèi)部類名字。

      (8)為何要用內(nèi)部類?

         1.   內(nèi)部類一般只為其外部類使用;

         2.   內(nèi)部類提供了某種進(jìn)入外部類的窗戶;

         3.   也是最吸引人的原因,每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)接口,而無論外部類是否已經(jīng)繼承了某個(gè)接口。因此,內(nèi)部類使多重繼承的解決方案變得更加完整。

       

      加深印象,參考一下:

      package com.test.xml;
      public class OutClassTest {
          static int a;

          int b;

          public static void test() {
              System.out.println("outer class static function");
          }

          public static void main(String[] args) {
              OutClassTest oc = new OutClassTest();
              // new一個(gè)外部類
              OutClassTest oc1 = new OutClassTest();
              // 通過外部類的對(duì)象new一個(gè)非靜態(tài)的內(nèi)部類
              OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
              // 調(diào)用非靜態(tài)內(nèi)部類的方法
              System.out.println(no_static_inner.getKey());

              // 調(diào)用靜態(tài)內(nèi)部類的靜態(tài)變量
              System.out.println(OutClassTest.InnerStaticClass.static_value);
              // 不依賴于外部類實(shí)例,直接實(shí)例化內(nèi)部靜態(tài)類
              OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
              // 調(diào)用靜態(tài)內(nèi)部類的非靜態(tài)方法
              System.out.println(inner.getValue());
              // 調(diào)用內(nèi)部靜態(tài)類的靜態(tài)方法
              System.out.println(OutClassTest.InnerStaticClass.getMessage());
          }

          private class InnerClass {
              // 只有在靜態(tài)內(nèi)部類中才能夠聲明或定義靜態(tài)成員
              // private static String tt = "0";
              private int flag = 0;

              public InnerClass() {
                  // 三.非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量和靜態(tài)變量
                  System.out.println("InnerClass create a:" + a);
                  System.out.println("InnerClass create b:" + b);
                  System.out.println("InnerClass create flag:" + flag);
                  //
                  System.out.println("InnerClass call outer static function");
                  // 調(diào)用外部類的靜態(tài)方法
                  test();
              }

              public  String getKey() {
                  return "no-static-inner";
              }
          }

          private static class InnerStaticClass {
              // 靜態(tài)內(nèi)部類可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員。
              private static String static_value = "0";

              private int flag = 0;

              public InnerStaticClass() {
                  System.out.println("InnerClass create a:" + a);
                  // 靜態(tài)內(nèi)部類不能夠訪問外部類的非靜態(tài)成員
                  // System.out.println("InnerClass create b:" + b);
                  System.out.println("InnerStaticClass flag is " + flag);
                  System.out.println("InnerStaticClass tt is " + static_value);
              }

              public int getValue() {
                  // 靜態(tài)內(nèi)部類訪問外部類的靜態(tài)方法
                  test();
                  return 1;
              }

              public static String getMessage() {
                  return "static-inner";
              }
          }

          public OutClassTest() {
              // new一個(gè)非靜態(tài)的內(nèi)部類
              InnerClass ic = new InnerClass();
              System.out.println("OuterClass create");
          }

      }

      /**
       * 總結(jié): 
       * 1.靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法,屬性)。
       * 2.靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員,而非靜態(tài)內(nèi)部類則可以訪問外部類的所有成員(方法,屬性)。
       * 3.實(shí)例化一個(gè)非靜態(tài)的內(nèi)部類的方法:
       *  a.先生成一個(gè)外部類對(duì)象實(shí)例
       *  OutClassTest oc1 = new OutClassTest();
       *  b.通過外部類的對(duì)象實(shí)例生成內(nèi)部類對(duì)象
       *  OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
       *  4.實(shí)例化一個(gè)靜態(tài)內(nèi)部類的方法:
       *  a.不依賴于外部類的實(shí)例,直接實(shí)例化內(nèi)部類對(duì)象
       *  OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
       *  b.調(diào)用內(nèi)部靜態(tài)類的方法或靜態(tài)變量,通過類名直接調(diào)用
       *  OutClassTest.InnerStaticClass.static_value
       *  OutClassTest.InnerStaticClass.getMessage()
       */

      refs:
      http://hi.baidu.com/zhumulangma/item/bcd478c140427b2cef466532
      http://duqiangcise./blog/697476

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多