內部類的基本概念
內部類指的是一個類的內部進行其他類嵌套的操作語法形式。理論上就跟盜墓空間一樣,一層層進行類的嵌套形式
范例:內部類的基本使用
1 class Outer{//定義一個外部類
2 private String msg="Hello World!"; 3 //*********************
4 class Inter{//此時定義了一個內部類
5 public void print(){//定義一個普通方法
6 System.out.println(msg); 7 } 8 } 9 //********************* 10 //在外部類中定義一個方法,這個方法負責產生內部類的對象和調用print();方法
11 public void fun(){ 12 Inter in=new Inter();//內部類的對象
13 in.print();//內部類提供的print()方法
14 } 15 } 16 public class Newbegin{ 17 public static void main(String args[]) { 18 Outer out=new Outer();//外部類對象
19 out.fun();//外部類方法
20 } 21 }
程序結構有點混亂!雖然內部類破壞了程序結構從整體上來講不好,但從另一個方面來說
內部類的優點在於外部類的私有訪問
范例:將以上程序的內部類提取到外部,要求實現同樣的功能
1 class Outer{ 2 private String msg="Hello World!"; 3 public String getMsg(){//通過此方法才可以取得msg的內容
4 return this.msg; 5 } 6 public void fun(){//3.現在由out對象調用了fun()方法
7 Inter in=new Inter(this); //4.this表示當前對象,
8 in.print();//7.調用方法
9 } 10 } 11 class Inter{ 12 private Outer outer; 13 public Inter(Outer outer){//5.Inter.out=main.out;
14 this.outer=outer; //6.引用傳遞
15 } 16 public void print(){//8.執行此方法
17 System.out.println(this.out.getMsg()); 18 } 19 } 20 public class OuterDemo{ 21 public static void main(String args[]){ 22 Outer out=new Outer();//1.實例化Outer
23 out.fun();//2.調用Outer類方法
24 } 25 }
對內部類的操作
1.通過以上代碼可以發現,當前的內部類的訪問必須通過外部類的方法才可以完成,如果不想通過
外部類的方法調用,那么就必須按照如下形容進行創建:
語法:外部類.內部類 內部類對象=new 外部類().new 內部類();
class Outer{//定義一個外部類
private String msg="Hello World!"; class Inner{//此時定義了一個內部類
public void print(){//定義一個普通方法
System.out.println(msg); } } } public class Newbegin{ public static void main(String args[]) { //聲明內部類對象
Outer.Inner in=new Outer().new Inner(); in.print(); } }
1.因為外部類中有屬性,這些屬性只能實例化才能調用,
2.如果一個內部類只想被外部類使用,即:不希望直接產生內部類的實例化對象,那么可以使用private定義
1 class Outer{//定義一個外部類
2 private String msg="Hello World!"; 3 private class Inner{//此時定義了一個內部類
4 public void print(){//定義一個普通方法
5 System.out.println(msg); 6 } 7 } 8 public void fun(){ 9 Inner in=new Inner(); 10 in.print(); 11 } 12 } 13 public class Newbegin{ 14 public static void main(String args[]) { 15 //聲明內部類對象
16 new Outer().fun(); 17 } 18 }
3.在進行屬性訪問時要加上this. 如果想要在內部類明確的使用this
就要外部類.this.屬性表示外部類當前對象的屬性
public void print(){//定義一個普通方法
System.out.println(Outer.this.msg);
}
static定義內部類
內部類中如果使用了static進行定義,那么就表示其就是一個外部類的形式,
這個外部類的名稱就是“外部類.內部類”。同時該內部類只允許訪問外部類中的static 操作,
范例:使用static定義內部類
1 class Outer{//定義一個外部類 2 private static String msg="Hello World!"; 3 static class Inner{//內部類=“外部類” 4 public void print(){ 5 //此時只能夠使用外部類中的static操作 6 System.out.println(msg); 7 } 8 } 9 } 10 public class Newbegin{ 11 public static void main(String args[]) { 12 Outer.Inner in=new Outer.Inner();//static來定義內部類 13 in.print(); 14 } 15 }
外部類.內部類 內部類對象=new 外部類.內部類();
在方法中定義內部類
理論上內部類可以定義在類中的任意位置,在方法中定義內部類的形式是最多的
范例:在方法中定義內部類
1 class Outer{//定義一個外部類
2 private String msg="Hello World!"; 3 public void fun(final int num){ 4 class Inner{ 5 public void print(){ 6 System.out.println("num="+num); 7 System.out.println("msg="+msg); 8 } 9 } 10 new Inner().print();//產生內部類對象調用方法
11 } 12 } 13 public class Newbegin{ 14 public static void main(String args[]) { 15 new Outer().fun(100); 16 } 17 } 18 //此方法在JDk1.8是正常的,但是在JDK1.8之前就錯誤的 19 //在JDK1.7及之前,內部類要使用方法的參數,那么就必須用final定義
總結:
1.破壞了程序的結構;
2.方便進行私有屬性的訪問;不受private 限制