Java內部類介紹


在Java中,內部類包括:成員內部類(靜態內部類、非靜態內部類)、匿名內部類、局部內部類(幾乎不用)。

1.成員內部類:

  1.1非靜態成員內部類

public class InnerClassTest {
    public class FirstInnerClass{
        
    }
}

  成員內部類(可以使用private、default、protected、public任意進行修飾。

  •   非靜態內部類必須寄存在一個外部類對象里。因此,如果有一個非靜態內部類對象那么一定存在對應的外部類對象。非靜態內部類對象單獨屬於外部類的某個對象。
  •        非靜態內部類可以直接訪問外部類的成員,但是外部類不能直接訪問非靜態內部類成員。
  •        非靜態內部類不能有靜態方法、靜態屬性和靜態初始化塊。
  •        外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例。

 

       成員變量訪問要點:

 

  •        內部類里方法的局部變量:變量名。
  •        內部類屬性:this.變量名。
  •        外部類屬性:外部類名.this.變量名。

 

public class InnerClassTest {
    private int age = 10;
    public class FirstInnerClass{
        int age = 20;
        public void test(){
            int age = 30;
            System.out.println(InnerClassTest.this.age);
            System.out.println(FirstInnerClass.this.age);
            System.out.println(age);
        }
    }

    public static void main(String[] args) {
        InnerClassTest.FirstInnerClass innerClass = new InnerClassTest().new FirstInnerClass();
        innerClass.test();
    }
}

 

  1.2靜態成員內部類

public class InnerClassTest {
    public static class FirstInnerClass{
        
    }
}
  • 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。
  • 靜態內部類看做外部類的一個靜態成員。 因此,外部類的方法中可以通過:“靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過 new 靜態內部類()訪問靜態內部類的實例。

 

public class InnerClassTest {
    private int age = 10;
    public static class FirstInnerClass{
        int age = 20;
        public void test(){
            int age = 30;
            //System.out.println(InnerClassTest.this.age); 不能訪問外部類變量,因為靜態內部類對象不依賴外部類對象,所以存在內部類對象不代表存在外部類對象
            System.out.println(FirstInnerClass.this.age);
            System.out.println(age);
        }
    }

    public static void main(String[] args) {
        InnerClassTest.FirstInnerClass innerClass = new InnerClassTest.FirstInnerClass();//注意和非靜態內部類的new方式區別
        innerClass.test();
    }
}

 

2.匿名內部類

public class InnerClassTest {
    public static void talk(Person person){
        person.speak();
    }
    public static void main(String[] args) {
        //只是創建一個匿名內部類的對象,並沒有調用它,所以不會輸出你好
        new Person() {
            @Override
            public void speak() {
                System.out.println("你好");
            }
        };

        InnerClassTest.talk(new Person() {
            @Override
            public void speak() {
                System.out.println("Hello");
            }
        });

        //通常的new一個線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("薩瓦迪卡");
            }
        }).start();
    }
}

interface Person{
    public void speak();
}

3.局部內部類

public class Test2 {
    public void show() {
        //作用域僅限於該方法
        class Inner {
            public void fun() {
                System.out.println("helloworld");
            }
        }
        new Inner().fun();
    }
    public static void main(String[] args) {
        new Test2().show();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM