JAVA 內部類詳解及執行個體_java

來源:互聯網
上載者:User

JAVA 內部類

一、什麼是內部類?

  一個類的定義放在另一個類的內部,這個類就叫做內部類

二、內部類有那些特性?

  1、內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符號 。
  2、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變數,無論是否是private的 。
  3、內部類聲明成靜態,就不能隨便的訪問外部類的成員變數了,此時內部類只能訪問外部類的靜態成員變數 。

三、內部類有哪幾種?

  1.成員內部類

    如:

package com.test01;public class A {  // 內部類 B 繼承 TestPojo 和實現 TestInterface 介面  class B extends TestPojo implements TestInterface{    //內部類 B 自己的方法    public void run(){      System.out.println("我正在跑!");    }    //重寫的介面方法    public void testf() {      System.out.println("實現介面!");    }  }   // 方法裡面調用內部類  public void test(){    B b = new B() ;    b.testf() ;    // 掉用重寫介面方法    b.run() ;     // 調用自己的方法    b.testpojo() ;   // 調用繼承父類的方法  }  // main 方法測試  public static void main(String[] args) {    A a = new A() ;    a.test() ;  }}// 定義了一個介面 ,方法為testf() interface TestInterface{  public void testf() ;}// 定義了一個普通類 方法testpojo() class TestPojo{  public void testpojo(){    System.out.println("我是簡單的pojo類");  }}// 實現 調用內部類裡面的方法class Textone{  public static void main(String[] args) {    A.B b = new A().new B() ;  //調用類A裡面的內部類B    /** 等同於 下面代碼     *     A a = new A() ;     *     A.B b = a.new B() ;     * */    b.testf() ;   // 掉用重寫介面方法    b.run() ;    // 調用自己的方法    b.testpojo() ;  // 調用繼承父類的方法  }}

  2、方法內部類

package com.test01;public class PerTest {  public void test(){     // 定義一個方法    class Ne{        // 定義一個方法內部類      public void fle(){  // 定義方法內部類的方法         System.out.println("我正在飛翔!");      }    } ;    new Ne().fle() ;    //調用內部類的方法  }  public static void main(String[] args) {    new PerTest().test() ;  //測試  }}

  注意: (1)、方法內部類只能在定義該內部類的方法內執行個體化,不可以在此方法外對其執行個體化。

      (2)、方法內部類對象不能使用該內部類所在方法的非final局部變數。        

      因為方法的局部變數位於棧上,只存在於該方法的生命期內。當一個方法結束,其棧結構被刪除,
      局部變數成為曆史。但是該方法結束之後,在方法內建立的內部類對象可能仍然存在於堆中!
      例如,如果對它的引用被傳遞到其他某些代碼,並儲存在一個成員變數內。正因為不能保證局部變
      量的存活期和方法內部類對象的一樣長,所以內部類對象不能使用它們。 (該理解來源於百度百科)

   3、匿名內部類

      1)、抽象匿名內部類    

package com.anonymous;public class AbstractClass {  public void test(){        //方法為test    TestA a = new TestA(){    //實現抽象類別      @Override      public void run() {    //實現抽象類別的方法        System.out.println("我正在使用抽象匿名內部類");      }    } ;    a.run() ;          //調用內部類的方法  }  public static void main(String[] args) {    new AbstractClass().test() ;  //測試  }}//定義一個抽象類別 TestA 抽象方法為run()abstract class TestA{  public abstract void run() ;}

    2)、介面匿名內部類

package com.anonymous;public class TestAnonymous {  MyInterface m = new MyInterface(){  //實現介面    public void eat() {        //重寫MyInterface 介面方法      System.out.println("我正在吃飯!");    }  } ;  public void ss(){  //方法ss    m.eat() ;    //調用重寫的方法  }  public static void main(String[] args) {    new TestAnonymous().ss() ;  //測試  }}//定義一個介面 方法為 eatinterface MyInterface{  public void eat() ;}

  注意:匿名內部 類 可以定義在方法內也可以定義在類的成員中,不管是那種匿名內部類都不能被外部類直接調用

四、內部類的作用?

  每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。

介面解決了部分問題,而內部類有效地實現了“多重繼承”。

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.