嵌套類
定義: 定義在另一個類、接口裏的類。
包括: 內部類(非靜態嵌套類)、靜態嵌套類
內部類(非靜態嵌套類)
包括: 成員內部類、局部內部類、匿名內部類
成員內部類
定義: 定義在另一個類成員位置的內部類
注意:
靜態成員的加載早於成員內部類
必須先創建外部類對象才能創建成員內部類對象
使用成員內部類:
//外部類
public class Outer {
//成員內部類
public class Inner{
}
}
//測試類
import com.liuhao.neibulei.Outer.Inner;
public class Test {
public static void main(String[] args) {
//在其它類中創建成員內部類的實例
Outer outer = new Outer();
//必須創建外部類對象才能創建成員內部類
Inner inner = outer.new Inner();
}
}
成員內部類中訪問外部類的成員
1.當內部類訪問外部類成員時,可直接訪問。
2.當內部類和外部類有相同名稱的變量時,優先訪問內部類的變量
//外部類
public class Outer {
private String str1 = "Outer類的str1";
private String str = "Outer類的str";
public void print(){
System.out.println("Outer類的print方法");
}
//成員內部類
public class Inner{
private String str1 = "Inner類的str1";
public void print(){
System.out.println("Inner類的print方法");
}
public void visitOuter(){
System.out.println(str);
System.out.println(str1);
System.out.println(Outer.this.str1);
print();
}
}
}
public class Test {
public static void main(String[] args) {
////在其它類中創建成員內部類的實例
Outer outer = new Outer();
//必須創建外部類對象才能創建成員內部類
Inner inner = outer.new Inner();
inner.visitOuter();
}
}
成員內部類中訪問外部類中同名的成員
方法: 外部類名.this.成員
public void visitOuter(){
System.out.println(str);
System.out.println(str1);
System.out.println("----------------"+Outer.this.str1);
print();
}
編譯後的.class文件爲:
外部類中調用成員內部類
1.靜態的可使用 類名.變量名 調取
2.非靜態先實例化內部類再調用。
public class Outer {
//成員內部類
public class Inner{
private String str1 = "Inner類的str1";
private static final String str2 = "Inner類的str2";
public void print(){
System.out.println("Inner類的print方法");
}
}
public void visitInner(){
System.out.println(new Inner().str1);
System.out.println(Inner.str2);
new Inner().print();
}
}
局部內部類
定義: 定義在方法或代碼塊裏的內部類
不能含有靜態變量、靜態代碼塊、靜態方法(靜態常量除外)
靜態成員的加載早於局部內部類
使用:
代碼塊內、方法內、
static {
class Inner1{
}
}
public void method() {
class Inner2{
}
if(true) {
//只能使用abstract、final修飾不能與外部類重名
class Inner3{}
}
}
編譯後的.class文件爲:
注意事項:
局部內部類只可以用abstract、final修飾且不能與外部類同名
只可以在定義它的方法或代碼塊中使用
局部內部類訪問外部類
注意:
內部類成員優先於外部類成員
直接訪問外部類成員
定義在靜態塊或方法時,只能訪問外部類的靜態成員!!!
public class Outer {
private String str1 = "Outer類中的str1";
private String str2 = "Outer類中的str2";
public void print(){
System.out.println("Outer類中的print方法");
}
public void method(){
class Inner{
private String str1 = "Inner類中的str1";
public void visitOuter (){
System.out.println(str1);
System.out.println(str2);
print();
}
}
new Inner(). visitOuter();
}
}
Outer outer = new Outer();
//必須創建外部類對象才能創建成員內部類
outer.method();
局部內部類訪問外部類同名的成員
方法: 外部類名.this.成員
注: 在靜態塊或靜態方法中無法使用“外部類名.this”
局部內部類訪問所在方法的成員
注: 內部類成員優先於包含它的方法中的變量
匿名內部類
定義: 直接使用接口或父類實例化對象時創建的沒有名字的內部類。
使用
public interface Father {
public void print();
}
public class Outer{
//匿名內部類
Father father = new Father() {
@Override
public void print() {
}
};
}
編譯後的.class文件爲:
注意:
- 必須且僅能繼承一個父類或實現一個接口
- 沒有class關鍵字,沒有類名
- 僅能使用一次
- 不能定義構造方法
- 匿名類不能是抽象類
- 靜態成員的加載早於匿名內部類
- 匿名內部類中訪問外部類的成員: 使用外部類名.this.變量名訪問外部類同名成員
- 匿名內部類訪問它所在方法的局部變量: 直接訪問。當存在同名時,內部類成員優先於包含它的方法中的變量
靜態嵌套類
定義: 定義在另一個類成員位置使用static修飾的或定義在另一個接口成員位置的嵌套類
使用
public class Outer {
public static class Inner {
}
}
public class Test {
public static void main(String[] args){
//在其它類中創建成員內部類的實例
Inner inner = new Outer.Inner();
}
}
編譯後的.class文件爲:
注意:
- 只能定義在類的成員位置不能定義在方法或代碼塊中
- 不需要通過生成外部類對象來生成靜態嵌套類對象
- 靜態嵌套類中可以聲明靜態成員
- 靜態嵌套類中訪問外部類:可以直接訪問外部類的靜態成員不能直接訪問外部類的非靜態成員
- 外部類可通過靜態嵌套類的對象調用其成員(包括實例成員和靜態成員)