java中的內部類內部接口用法說明
簡介
一般來說,我們創(chuàng)建類和接口的時候都是一個類一個文件,一個接口一個文件,但有時候為了方便或者某些特殊的原因,java并不介意在一個文件中寫多個類和多個接口,這就有了我們今天要講的內部類和內部接口。
內部類
先講內部類,內部類就是在類中定義的類。類中的類可以看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。
靜態(tài)內部類
我們在class內部定義一個static的class,如下所示:
@Slf4j
public class StaticInnerClass {
static class Inner {
void print() {
log.info("Inner class is: " + this);
}
}
public static void main(String[] args) {
StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
inner.print();
}
}
因為static變量可以直接根據類名來存取,所以我們使用new StaticInnerClass.Inner()來實例化內部類。
非靜態(tài)內部類
class中定義的類也可以是非靜態(tài)的,如下所示:
@Slf4j
public class InnerClass {
class Inner {
void print() {
log.info("Inner class is: " + this);
}
}
public static void main(String[] args) {
InnerClass.Inner inner = new InnerClass().new Inner();
inner.print();
}
}
要訪問到類的變量,需要實例化外部內,然后再實例化內部類:new InnerClass().new Inner()。
注意這里我們需要使用到兩個new。
靜態(tài)方法內部類
我們可以在靜態(tài)方法中定義一個類,這個類其實就相當于方法中的變量,這個變量當然不能是static的。我們看下面的例子:
@Slf4j
public class StaticMethodInnerClass {
private static String x = "static x";
public static void print() {
class MyInner {
public void printOuter() {
log.info("x is " + x);
}
}
MyInner i = new MyInner();
i.printOuter();
}
public static void main(String[] args) {
StaticMethodInnerClass.print();
}
}
方法中的類,我們是無法在外部實例化的。
非靜態(tài)方法的內部類
同樣的非靜態(tài)方法也可以定義內部類:
@Slf4j
public class MethodInnerClass {
private String x = "non static x";
public void print() {
class MyInner {
public void printOuter() {
log.info("x is " + x);
}
}
MyInner i = new MyInner();
i.printOuter();
}
public static void main(String[] args) {
new MethodInnerClass().print();
}
}
注意,這里需要先實例化外部類才可以繼續(xù)調用。
匿名類
最后一個,匿名類,直接在需要的時候實例化的類。匿名類我們遇到了很多次了,比如在構建SortedSet的時候,可以傳入自定義的Comparator,我們可以用匿名類來實現(xiàn),也可以直接使用lambda表達式。
public class AnonymousClass {
public static void main(String[] args) {
SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
return 0;
}
});
SortedSet sortedSet2 = new ConcurrentSkipListSet((o1, o2) -> 0);
}
}
內部接口
Inner Interface是指在接口中定義的接口。最常見的就是Map中的Entry了:
public interface Map<K, V> {
interface Entry<K, V> {
K getKey();
}
這里的內部接口一定是static的,因為接口是不能實例化的,所以為了訪問到接口中的接口,必須定義為static。如果不指定,則默認就是static。
我們看一個該內部接口的實現(xiàn):
public class MapImpl implements Map.Entry{
@Override
public Object getKey() {
return 0;
}
@Override
public Object getValue() {
return null;
}
@Override
public Object setValue(Object value) {
return null;
}
}
總結
本文講解了5個內部類的實現(xiàn)和一個內部接口的應用。大家只要把內部的類或者接口看成一個變量,就可以很好的理解上面的內容了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
補充知識:內部類(成員內部類、靜態(tài)內部類、方法內部類)
一:成員內部類:
最常見的內部類就是成員內部類,也稱作普通內部類;

1、Inner類定義在Outer類的內部,相當于Outer類的成員變量的位置,Inner類可以使用任意訪問修飾符,如:public、private、protected等。
2、Inner類中定義的test()方法可以訪問Outer類中的數據,不受訪問控制符的影響。
3、 定義了成員內部類后,必須使用外部類對象來創(chuàng)建內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );如創(chuàng)建Inner的內部類對象:要先創(chuàng)建外部類對象:Outer o = new outer(); 創(chuàng)建內部類:Inner i = o.new Inner();訪問Inner中的test()方法:i.test();
例如:

4、如果外部類和內部類具有相同的成員變量或方法,內部類可以直接訪問內部類的成員變量或方法,但如果內部類訪問外部類的成員變量或者方法時,需要使用this關鍵字;如下:

二:靜態(tài)內部類
靜態(tài)內部類就是用static修飾的內部類,這種內部類的特點是:
1、靜態(tài)內部類不能直接訪問外部類的非靜態(tài)成員,但,可以通過new 外部類().成員的方式訪問;

2、如果外部類的靜態(tài)成員與內部類的靜態(tài)成員相同, 可以通過"類名.靜態(tài)成員"來訪問外部類的靜態(tài)成員;如果不同,可以直接調用外部類的靜態(tài)成員名。


3、創(chuàng)建靜態(tài)內部類的對象時,不需要外部類的對象,可以直接創(chuàng)建;
三:方法內部類:
1、方法內部類就是定義在外部類的方法中,方法內部類只在該方法內可以用;

2、由于方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。
以上這篇java中的內部類內部接口用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot Druid 自定義加密數據庫密碼的幾種方案
這篇文章主要介紹了Springboot Druid 自定義加密數據庫密碼的步驟,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下2020-12-12
Spark學習筆記 (二)Spark2.3 HA集群的分布式安裝圖文詳解
這篇文章主要介紹了Spark2.3 HA集群的分布式安裝,結合圖文與實例形式詳細分析了Spark2.3 HA集群分布式安裝具體下載、安裝、配置、啟動及執(zhí)行spark程序等相關操作技巧,需要的朋友可以參考下2020-02-02
MyBatis實現(xiàn)表連接查詢寫法(三種對應關系)的方法總結
這篇文章主要介紹了MyBatis實現(xiàn)表連接查詢寫法(一對一關系、一對多關系、多對多關系)的方法,文中的示例代碼講解詳細,感興趣的可以了解一下2023-01-01

