java
容許將一個類A
聲明在另外一個類B
中,則類A
就是內部類,類B
稱爲外部類java
內部類的分類:成員內部類(靜態內、非靜態內) VS
局部內部類(方法內、代碼塊內、構造器內)
外部類的成員:
1)調用外部類的機構。
2)能夠用被static
修飾。
3)能夠被四種不一樣的權限修飾。ide
做爲一個類:
1)類內能夠定義屬性、方法、構造器等。
2)能夠被final
修飾,表示此類不能被繼承。言外之意,不使用final
就能夠被繼承。
3)能夠被abstract
修飾,表示此類不能被實例化。與上面同理,不使用abstract
就能被實例化。this
關注以下三個問題:
1)如何實例化成員內部類的對象。
2)如何在成員內部類中區分調用外部類的結構。code
public class InnerClassTest { public static void main(String[] args) { // 建立Dog實例(靜態的成員內部你) Person.Dog dog = new Person.Dog(); dog.show(); // 建立Bird實例(非靜態的成員內部類) Person person = new Person(); Person.Bird bird = person.new Bird(); bird.sing(); System.out.println(); bird.display("黃鸝"); } } class Person{ String name = "庫森"; int age; public void ead() { System.out.println("人:吃飯"); } //靜態成員內部類 static class Dog { String name; public Dog() {} public void show() { System.out.println("卡拉沙狗"); } } //非靜態成員內部類 class Bird{ String name = "杜鵑"; public Bird() {} public void sing() { System.out.println("我是一隻小小鳥"); //調用外部類的一個方法 Person.this.ead(); } public void display(String name) { System.out.println(name);//方法形參 System.out.println(this.name);//內部類的name System.out.println(Person.this.name);//外部類的name System.out.println(age);//在沒有重名的狀況下能夠直接調用外部類的成員屬性 } } public Person() { class CC {}//局部內部類 } public void method() { class AA {}//局部內部類 } { class BB {}//局部內部類 } //修飾內部類 abstract class Cat{} final class Snake{} }
3)開發中局部內部類的使用。對象
public class InnerClassTest1 { public Comparable getComparable() { // 方式一: class MyComparable implements Comparable { @Override public int compareTo(Object o) { return 0; } } return new MyComparable(); // 方式二: return new Comparable() { @Override public int compareTo(Object o) { return 0; } }; } }