1. 程式人生 > >Java內部類詳解

Java內部類詳解

strong 匿名 per 創建 show rac 成員變量 end outer

成員內部類(聲明在類內部且方法外的)1是外部類的一個成員:①可以有修飾符(4個)②static final ③可以調用外部類的屬性、方法

2具體類的特點:①abstract ②還可以在其內部定義屬性、方法、構造器

局部內部類(聲明在類的方法裏)

內部類作用:

  • 實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為private時,只有外部類可以訪問內部類,很好地隱藏了內部類
  • 內部類可以繼承(extends)或實現(implements)其他的類或接口,而不受外部類的影響
  • 內部類可以直接訪問外部類的字段和方法,即使是用private修飾的,相反的,外部類不能直接訪問內部類的成員

一、靜態內部類:作為類的靜態成員,存在於某個類的內部

靜態內部類雖然是外部類的成員,但是在未創建外部類的對象的情況下,可以直接創建靜態內部類的對象。

靜態內部類可以引用外部類的靜態成員變量和靜態方法,但不能引用外部類的普通成員

package com.yyx.pratice;

public class TestInner {
    private String outerName = "outer";
    
private static int id = 123; private Inner inner = new Inner(); public static class Inner { public void print1() { System.out.println(id); // System.out.println(outerName); } public static void print2() { System.out.println(id); } }
public void show() { inner.print1(); } public static void main(String[] args) { TestInner testInner = new TestInner(); testInner.show(); TestInner.Inner.print2(); } }

二、成員內部類:作為類的成員,存在於某個類的內部

成員內部類可以調用外部類的所有成員,但只有在創建了外部類的對象後,才能調用外部的成員

package com.yyx.pratice;

public class TestInner {
    private String outerName = "outer";
    // 外部類無法直接訪問內部類的成員,需要實例化內部類對象
    private Inner inner = new Inner();

    public class Inner {
        private String innerName = "inner";

        public void show() {
            System.out.println(outerName); // 可以直接訪問外部類的成員
        }
    }

    public void show() {
        System.out.println(inner.innerName);
        inner.show();
    }

    public static void main(String[] args) {
        TestInner outer = new TestInner();
        outer.show();
        // 實例化內部類
        TestInner.Inner inner = outer.new Inner();
        inner.show();
    }
}

三、局部內部類:存在於某個方法的內部

局部內部類只能在方法內部中使用,一旦方法執行完畢,局部內部類就會從內存中刪除。
必須註意:如果局部內部類中要使用他所在方法中的局部變量,那麽就需要將這個局部變量定義為final的

package com.yyx.pratice;

public class InnerClass {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.getPerson().eatRice();
    }
}

interface Person {
    public void eatRice();
}

class Student {
    public Person getPerson() {
        /*
         * 匿名內部類
         */
        return new Person() {

            @Override
            public void eatRice() {
                System.out.println("我會吃米飯!");

            }
        };
    }
}

Java內部類詳解