這篇文章主要講解了“Java有哪些內部類與內部接口”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java有哪些內部類與內部接口”吧!
一. 內部類
內部類就是在類中定義類。我們可以把類中的類看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。
1. 靜態內部類
靜態內部類就是在class內部定義一個static的class,如下代碼所示:
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()來實例化內部類。
2. 非靜態內部類
非靜態內部類就是在class中定義的類也可以是非靜態的,如下代碼所示:
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)
3.靜態方法內部類
靜態方法內部類就是在 靜態方法中定義一個類,這個類其實就相當于方法中的變量,這個變量當然不能是static的。如下代碼所示:
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();
}
}
注意:方法中的類,我們是無法在外部實例化的。
4. 非靜態方法內部類
同樣的非靜態方法也可以定義內部類,如下代碼所示:
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();
}
}
注意:這里需要先實例化外部類才可以繼續調用。
5. 匿名內部類
匿名類是直接在需要的時候實例化的類。匿名類很常見,比如在構建SortedSet的時候,可以傳入自定義的Comparator,我們可以用匿名類來實現,也可以直接使用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。
下面就來看看一個該內部接口的實現,如下代碼所示:
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;
}
}
感謝各位的閱讀,以上就是“Java有哪些內部類與內部接口”的內容了,經過本文的學習后,相信大家對Java有哪些內部類與內部接口這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。