成員內部類
擁有四種訪問修飾符public、protected、default、private,會限制外部對內部類的創建
// 如果將內部類的訪問方式定義爲protected
public class OuterClass {
protected class InnerClass{
/**
* InnerClass這個內部類是protected修飾的,如果一個類沒有定義任何構造函數,Java編譯器會默認的給類生成一個空參數構造函數,
* 而這個構造函數的訪問級別是和類訪問級別相同的,所以產生了報錯,因爲OuterClass並不是InnerClass的子類且不在同一個包中
*
* 解決方案: 顯示聲明public修飾的構造函數
*/
public InnerClass() {
}
}
}
// 在外包調用
new OuterClass().new InnerClass(); // ... has protected access in ...
成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員),因爲內部類持有外部類的引用 OuterClass.this。
如果屬性名相同可以用OuterClass.this.來區分
外部類想要訪問內部類只能通過創建內部類對象
new OuterClass().new Inner();
非靜態內部類不能定義靜態成員
局部內部類
局部內部類是定義在一個方法或者一個作用域裏面的類,它和成員內部類的區別在於局部內部類的訪問僅限於方法內或者該作用域內
局部內部類就像是方法裏面的一個局部變量一樣,是不能有 public、protected、private 以及 static 修飾符的。
局部內部類可以訪問方法的局部變量,但是必須是final的,因爲method在調用結束後就彈出棧了,而內部類還存在持有變量的引用,所以需要定義爲常量
無法在外部去創建局部內部類,因爲局部內部類是定義在方法中的,而方法是需要所在類的對象去調用的
public class OuterClass {
public void getNum(final String name){
class LocalInnerClass{
public void test(){
System.out.println(name);
}
}
new LocalInnerClass().test();
}
}
靜態內部類
如果內部類是靜態的,就相當於一個外部類
靜態內部類只能訪問靜態的外部類成員
匿名內部類
沒有訪問修飾符
匿名內部類是唯一一種沒有構造器的類,大部分匿名內部類用於接口回調,一般來說,匿名內部類用於繼承其他類或是實現接口,並不需要增加額外的方法,只是對繼承方法的實現或是重寫
setComparable(new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
});