重拾java基礎以內部類

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

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

非靜態內部類是指一個類嵌套了另一個類,被嵌套的這個類能夠訪問封閉類(outer class)的成員變量,所以一般也被稱爲inner classbash

咱們來看一個實例瞭解一下非靜態內部類ui

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的成員變量以及成員方法,下面看一下內部類的調用this

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());
    }
}
複製代碼

注意,內部類實例化必需要先實例化外部類。spa

靜態內部類(Static Inner Class)

靜態內部類是在內部類class前面用static聲明code

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

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";
        }
    }
}
複製代碼

靜態內部類的實例方式與非靜態內部類不一樣,咱們來看一下string

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());
    }
}
複製代碼

注意,與非靜態內部類不一樣,靜態內部類不能訪問外部類的成員變量以及成員方法,由於靜態內部類不須要建立外部類的實例it

非靜態內部類與靜態內部類的異同?
  • 靜態內部類須要經過static修飾,非靜態內部類這不須要
  • 非靜態內部類能夠訪問外部類的成員變量或成員方法,而靜態內部類則不能訪問
  • 非靜態內部類實例化要先實例化外部類,而靜態內部類則不須要實例化外部類
  • 非靜態內部類和靜態內部類能夠使用pulic和protect修飾聲明

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

相關文章
相關標籤/搜索