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"))
  }

}

匿名內部類的使用場景,通常來說,就是在一個內部類,只要建立一次,使用一次,以後就不再使用的情況下,就可以。那麼,此時,通常不會選擇在外部建立一個類,而是選擇直接建立一個實現了某個介面、或者繼承了某個父類的內部類,而且通常是在方法內部,建立一個匿名內部類。 在使用java進行spark程式設計的時候,如果使用的是java7以及之前的版本,那麼通常在對某個RDD執行運算元,並傳入運算元的函式的時候,通常都會傳入一個實現了某個Spark Java API中Function介面的匿名內部類。