黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解內部類和內部接口

詳解內部類和內部接口

更新時間:2020-10-20 17:57:39 來源:動力節點 瀏覽1140次

一般情況下,我們創建類和接口的時候都是一個類一個文件,一個接口一個文件,但有時候為了方便或者某些特殊的原因,java并不介意在一個文件中寫多個類和多個接口,于是就需要用到我們今天要講的內部類和內部接口


一、內部類

先講內部類,內部類就是在類中定義的類。類中的類可以看做是類的一個屬性,一個屬性可以是static也可以是非static的。而內部類也可以定義在類的方法中,再加上匿名類,總共有5種內部類。


1.靜態內部類

我們在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()來實例化內部類。


2.非靜態內部類

class中定義的類也可以是非靜態的,如下所示:

@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。


3.靜態方法內部類

我們可以在靜態方法中定義一個類,這個類其實就相當于方法中的變量,這個變量當然不能是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();

}

}

方法中的類,我們是無法在外部實例化的。


4.非靜態方法的內部類

同樣的非靜態方法也可以定義內部類:

@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();

}

}


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{

interface Entry{

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基礎教程中有更加詳細的講解,歡迎小伙伴們前來觀看學習。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 中国大陆毛片 | 午夜成年人网站 | 五月天婷婷伊人 | 国产99热99 | 丁香五香天堂 | 色在线网| 日韩黄色中文字幕 | 日韩 国产 欧美 | 免费人成激情视频在线观看冫 | 成年人免费观看视频网站 | 日本福利片午夜免费观着 | 欧美色淫网站免费观看 | 午夜剧场直接免费观看 | 午夜成人免费视频 | 高清欧美一区二区免费影视 | 青草视频免费观看 | 日日噜噜噜夜夜爽爽狠狠 | 亚洲色图综合图片 | 制服丝袜视频在线观看 | 日韩色视频一区二区三区亚洲 | 可以免费观看的一级毛片 | h肉动漫无遮挡在线观看免费 | 亚洲图片在线视频 | 久久天天躁夜夜躁狠狠躁2019 | 看全色黄大色黄女片爽毛片 | 丁香六月在线观看 | 国产成人福利 | 成人免费体验区福利云点播 | 在线日韩视频 | 亚洲精品无码不卡在线播放he | 国产无遮挡男女羞羞影院在线播放 | 日韩高清欧美 | 日本国产片 | 国产日韩精品欧美一区喷水 | 国产香蕉一区二区在线观看 | a级毛片在线视频免费观看 a级免费看 | 在线满18网站观看视频 | 欧美怡红院免费全视频 | 国产 日韩 欧美 在线 | 亚洲第一天堂无码专区 | 午夜影院在线免费 |