Java 之 內部類

來源:互聯網
上載者:User

標籤:

(static修飾的成員屬於整個類,而不屬於單個對象)

定義:將一個類放到另一個類的內部定義,這個在內部定義的類就叫做內部類(也有的成嵌套類),包含內部類的類被稱為外部類(也有的稱宿主類)。

1。非靜態內部類

沒有使用static修飾的內部類就是非靜態內部類。

注意:a。java不允許在非靜態內部類中定義靜態成員

b。當調用非靜態內部類中的執行個體方法時,必須有一個非靜態成員內部類執行個體,非靜態內部類執行個體必須寄生在外部執行個體內

c。如果外部類成員變數與內部類成員變數與內部類裡的方法的局部變數同名,可通過this,外部類類名.this 作為限定來加以區分

public class Test {    private String prop = "外部類的執行個體變數";        public class InClass{        private String prop = "內部類中的執行個體變數";        public void info(){            String prop = "局部變數";            System.out.println("外部類的執行個體變數值:"+Test.this.prop);            System.out.println("內部類的執行個體變數值:" + this.prop);            System.out.println("局部變數:" + prop);        }    }    public void test(){        InClass ic = new InClass();        ic.info();    }    public static void main(String[] args){        /*         * Test ts = new Test();         * ts.test();         * 上下的代碼作用一樣         */        new Test().test();    }}

使用非靜態內部類:

在外部類以外的地方定義內部類的文法格式: OuterClass.InnerClass  VarName

在外部類以外的地方建立非靜態內部類執行個體的文法: OuterInstace .new  InnerConstructor()

class Out{    class In    {        public In(String msg){            System.out.println(msg);        }    }}public class CreateInnerInstance {    public static void main(String[] args){        //OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();        Out.In in = new Out().new In("測試資訊");        /*Out.In in;        *Out out = new Out();        *in2 = out.new In("測試資訊");

     */
    }}

 

2.靜態內部類

靜態內部類是用static修飾的內部類,也稱類內部類。

a。靜態內部類不能訪問外部類的執行個體成員,只能訪問外部類的類成員(同為static 修飾)。

c。外部類依然不能訪問靜態內部類中的成員,但可以使用靜態內部類的類名作為調用者來訪問靜態內部類中的類成員,也可以使用靜態內部類對象作為調用者來訪問靜態內部類中的執行個體變數。

public class StaticInnerClassTest {    private int prop = 5 ;    private static int prop1 = 6 ;    static class InClass{        public void accessOuterProp(){

        private static int prop = 5;                                                                  
        private int prop1 = 6;
         //System.out.println(prop);   //這句代碼會出錯,靜態內部類無法訪問外部類的非靜態成員  

         System.out.println(prop1); } }
public void accessInnerPro(){
  //通過靜態內部類的類名訪問靜態內部類中的類成員


  System.out.println(InClass.prop);
  //通過靜態內部類對象作為調用者來訪問靜態內部類中的執行個體變數
  SYstem.out.println(new InClass().prop1);
}
}

在外部類以外使用使用靜態內部類:(和使用非靜態比較,相類似)
文法:   new OuterClass.InnerConstructor()

class Out{    static class In    {        public In(){            System.out.println("靜態內部類的構造器");        }    }}public class CreateStaticInnerInstance {    public static void main(String[] args){        Out.In in = new Out.In();    }}

3.匿名內部類
如果把一個內部類放到方法中定義,則這個內部類就是一個局部內部類,局部內部類僅在該方法裡有效。

定義匿名內部類的格式:

new 實現介面 | 父類構造器(實參列表){  類體部分}

可以看出,匿名內部類必須繼承一個父類或者實現一個介面。

interface Product{    public Double getPrice();    public String getName();}public class AnonymTest {        public void ce(Product p){        System.out.println("購買了一個" + p.getName() + ",花掉了" + p.getPrice());    }    public static void main(String[] args){        AnonymTest  at = new AnonymTest();        at.ce(new Product() {            @Override            public Double getPrice() {                return 0.5;            }            @Override            public String getName() {                return "辣條";            }        });    }}

 

Java 之 內部類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.