重拾java基礎之內部類

ChicoChen發表於2019-01-11

最近看了一篇介紹Java內部類的文字,發現之前對內部類的理解還不完整,這裡重新總結一下對java內部類的理解

內部類的種類?
  • 非靜態內部類(Non-static nested class)或者(inner class)
  • 靜態內部類(Static nested class)
非靜態內部類(Non-static nested class)

非靜態內部類是指一個類巢狀了另外一個類,被巢狀的這個類可以訪問封閉類(outer class)的成員變數,因此通常也被稱為inner class

我們來看一個例項瞭解一下非靜態內部類

public class Animal {

 private String getType(int type) {
        if (type == 1) {
            return "birds ";
        } else {
            return "mammal";
        }
    }

    class Chicken {

        String weigth;

        public int getPrice() {
            return 1000;
        }

        public String getType() {
            return Animal.this.getType(1);
        }
    }

    class Panda {

        String gender;

        public String getFrom() {
            return "ChengDu";
        }

        public String getType() {
            return Animal.this.getType(2);
        }

    }
}
複製程式碼

以上程式碼建立了一個Animal類,Animal裡面巢狀了Pig和Panda類,所以Pig和Panda屬於Animal的內部類,而Animal相對於Pig和Panda類屬於封閉類(也叫外部類),所以,在Pig和Panda可以呼叫Animal的成員變數以及成員方法,下面看一下內部類的呼叫

public class Main {

    public static void main(String[] args) {

        Animal animal = new Animal();
        Animal.Chicken pig = animal.new Chicken();
        System.out.println(pig.getPrice());
        System.out.println(pig.getType());
        
        Animal.Panda panda = animal.new Panda();
        System.out.println(panda.getFrom());
        System.out.println(panda.getType());
    }
}
複製程式碼

注意,內部類例項化必須要先例項化外部類。

靜態內部類(Static Inner Class)

靜態內部類是在內部類class前面用static宣告

接下來我們瞭解一下靜態內部類的建立

public class Animal {

    private String getType(int type) {
        if (type == 1) {
            return "birds ";
        } else {
            return "mammal";
        }
    }

    static class Chicken {

        String weigth;

        public int getPrice() {
            return 1000;
        }
    }

    static class Panda {

        String gender;

        public String getFrom() {
            return "ChengDu";
        }
    }
}
複製程式碼

靜態內部類的例項方式與非靜態內部類不同,我們來看一下

public class Main {

    public static void main(String[] args) {

        Animal animal = new Animal();
        Animal.Chicken pig = new Animal.Chicken();
        System.out.println(pig.getPrice());

        Animal.Panda panda = new Animal.Panda();
        System.out.println(panda.getFrom());
    }
}
複製程式碼

注意,與非靜態內部類不同,靜態內部類不能訪問外部類的成員變數以及成員方法,因為靜態內部類不需要建立外部類的例項

非靜態內部類與靜態內部類的異同?
  • 靜態內部類需要通過static修飾,非靜態內部類這不需要
  • 非靜態內部類可以訪問外部類的成員變數或成員方法,而靜態內部類則不能訪問
  • 非靜態內部類例項化要先例項化外部類,而靜態內部類則不需要例項化外部類
  • 非靜態內部類和靜態內部類可以使用pulic和protect修飾宣告

以上就是被人對Java中的內部類的一點理解,如果又不對的或者不完善的,歡迎在留言指正。

相關文章