內部類:成員內部類、靜態內部類、局部內部類和匿名內部類。
- 成員內部類
package com.jiaoyinbrother.test;
/*
* 成員內部類可以調用外部類的所有成員,但只有在創建了外部類的對象後,才能調用外部的成員。
*/
public class OuterClass {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public InnerClass innerClass = new InnerClass();
public void show() {
innerClass.print();
}
public void display() {// 非靜態方法可以直接創建內部類對象
InnerClass innerClass = new InnerClass();
innerClass.print();
}
public static void display1() {// 靜態方法必須先創建外部類,然後才能創建內部類
InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.print();
}
// 成員內部類
public class InnerClass {
public void print() {
System.out.println("-----------inner class----------");
System.out.println(name);
System.out.println(charSet);
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.show();
outerClass.display();
outerClass.innerClass.print();
}
}
- 靜態內部類
package com.jiaoyinbrother.test;
/*
* 靜態內部類雖然是外部類的成員,但是在未創建外部類的對象的情況下,可以直接創建靜態內部類的對象。
* 靜態內部類可以引用外部類的靜態成員變量和靜態方法,但不能引用外部類的普通成員。
*/
public class OuterClass1 {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public InnerClass innerClass = new InnerClass();
public void show() {
innerClass.print();
}
public void display() {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
// 無需外部類對象,直接創建靜態內部類對象
public static void display1() {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
// 靜態內部類
public static class InnerClass {
public void print() {
System.out.println("-----------static inner class----------");
System.out.println(charSet);
// System.out.println(name);//編譯失敗,不能引用非靜態成員變量
}
}
public static void main(String[] args) {
OuterClass1 outerClass = new OuterClass1();
outerClass.show();
outerClass.display();
outerClass.innerClass.print();
InnerClass innerClass = new InnerClass();
innerClass.print();
}
}
- 局部內部類
package com.jiaoyinbrother.test;
/*
* 局部內部類只能在方法內部中使用,一旦方法執行完畢,局部內部類就會從內存中刪除。
* 必須注意:如果局部內部類中要使用他所在方法中的局部變量,那麼就需要將這個局部變量定義爲final的。
*/
public class OuterClass2 {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public void show() {
final int i = 1;
class InnerClass {// 修飾符只能爲final或者abstract
public void print() {
System.out.println(charSet);
System.out.println(name);
System.out.println(i);// 局部變量必須爲final
}
}
InnerClass innerClass = new InnerClass();// 只能在聲明後創建對象
innerClass.print();
}
public static void main(String[] args) {
OuterClass2 outerClass = new OuterClass2();
outerClass.show();
}
}
- 匿名內部類
package com.jiaoyinbrother.test;
/*
* 匿名內部類的主體,大括號中是匿名內部類的主體,這個主體就是類或者接口的實現,
* 如果是類,那麼匿名內部類是該類的子類,如果是接口,匿名內部類需要完成接口的實現。
*/
public class OuterClass3 {
public void show(InnerClass innerClass) {
innerClass.print();
}
public static void main(String[] args) {
OuterClass3 outerClass = new OuterClass3();
outerClass.show(new InnerClass() {
@Override
public void print() {
System.out.println("匿名內部類");
}
});
}
}
abstract class InnerClass {
public abstract void print();
}