內部類以及匿名內部類
阿新 • • 發佈:2018-12-02
外部類: 最普通的,我們平時見到的那種類,就是在一個字尾為.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介面的匿名內部類。