1. 程式人生 > >外部類,內部類,匿名內部類詳解!

外部類,內部類,匿名內部類詳解!

外部類: 最普通的,我們平時見到的那種類,就是在一個字尾為.java的檔案中,

直接定義的類,比如

public class Student {   private String name;   private int age; }

內部類: 內部類,顧名思義,就是包含在外部類中的類,就叫做內部類。

內部類有兩種,一種是靜態內部類,一種是非靜態內部類。

public class School {   private static School instance = null;   static class Teacher {} }

public class School {   private String name;   class Teacher {} }

靜態內部類和非靜態內部類之間的區別主要如下:

1、內部原理的區別: 靜態內部類是屬於外部類的類成員,是一種靜態的成員,

是屬於類的,就有點類似於private static Singleton instance = null;非靜態內部類

,是屬於外部類的例項物件的一個例項成員,也就是說,每個非靜態內部類,

不是屬於外部類的,是屬於外部類的每一個例項的,建立非靜態內部類的例項以後,

非靜態內部類例項,是必須跟一個外部類的例項進行關聯和有寄存關係的。

2、建立方式的區別: 建立靜態內部類的例項的時候,只要直接使用

“外部類.內部類()”的方式,就可以,比如new School.Teacher();建立非靜態內部類的例項的時候

,必須要先建立一個外部類的例項,然後通過外部類的例項,再來建立內部類的例項,

new School().Teader() 通常來說,我們一般都會為了方便,會選擇使用靜態內部類。

匿名內部類:public interface ISayHello {

  String sayHello(String name);

}

public class SayHelloTest {    

public static void main(String[] args) {  

  ISayHello obj = new ISayHello() {

      public String sayHello(String name) { return "hello, " + name }    

}    

System.out.println(obj.sayHello("leo"))  

}

}

匿名內部類的使用場景,通常來說,就是在一個內部類,只要建立一次,

使用一次,以後就不再使用的情況下,就可以。那麼,此時,通常不會

選擇在外部建立一個類,而是選擇直接建立一個實現了某個介面、或者

繼承了某個父類的內部類,而且通常是在方法內部,建立一個匿名內部類。