Java面向?qū)ο笾畠?nèi)部類(lèi)案例講解
1. 內(nèi)部類(lèi)
很多時(shí)候我們創(chuàng)建類(lèi)的對(duì)象的時(shí)候并不需要使用很多次,每次只使用一次,這個(gè)時(shí)候我們就可以使用內(nèi)部類(lèi)了
1.1 內(nèi)部類(lèi)概述
- 內(nèi)部類(lèi)就是在一個(gè)類(lèi)的內(nèi)部在定義一個(gè)類(lèi),比如,A類(lèi)中定義一個(gè)B類(lèi),那么B類(lèi)相對(duì)A類(lèi)來(lái)說(shuō)就稱(chēng)為內(nèi)部類(lèi),而A類(lèi)相對(duì)B類(lèi)來(lái)說(shuō)就是外部類(lèi)了。
- 內(nèi)部類(lèi)不是在一個(gè)java源文件中編寫(xiě)倆個(gè)平行的倆個(gè)類(lèi),而是在一個(gè)類(lèi)的內(nèi)部再定義另外一個(gè)類(lèi)。 我可以把外邊的類(lèi)稱(chēng)為外部類(lèi),在其內(nèi)部編寫(xiě)的類(lèi)稱(chēng)為內(nèi)部類(lèi)。
- 內(nèi)部類(lèi)分為四種:
- 成員內(nèi)部類(lèi)
- 靜態(tài)內(nèi)部類(lèi)
- 局部?jī)?nèi)部類(lèi)
- 匿名內(nèi)部類(lèi)
1.2 成員內(nèi)部類(lèi)(實(shí)例內(nèi)部類(lèi)、非靜態(tài)內(nèi)部類(lèi))
注:成員內(nèi)部類(lèi)中不能寫(xiě)靜態(tài)屬性和方法
1.2.1 【定義一個(gè)內(nèi)部類(lèi)】
//在A(yíng)類(lèi)中申明了一個(gè)B類(lèi),此B類(lèi)就在A(yíng)的內(nèi)部,并且在成員變量的位置上,所以就稱(chēng)為成員內(nèi)部類(lèi)
public class Outer {
private int id;
class Inner {
public void in() {
System.out.println("這是內(nèi)部類(lèi)方法");
}
}
public void out() {
System.out.println("這是外部類(lèi)方法");
}
}
1.2.2【實(shí)例化內(nèi)部類(lèi)】
實(shí)例化內(nèi)部類(lèi),首先需要實(shí)例化外部類(lèi),通過(guò)外部類(lèi)去調(diào)用內(nèi)部類(lèi)
// 代碼接上
class Test {
public static void main(String[] args) {
//實(shí)例化成員內(nèi)部類(lèi)分兩步
//1、實(shí)例化外部類(lèi)
Outer outObject = new Outer();
//2、通過(guò)外部類(lèi)調(diào)用內(nèi)部類(lèi)
Outer.Inner inObject = outObject.new Inner();
//測(cè)試,調(diào)用內(nèi)部類(lèi)中的方法
inObject.in();//打?。哼@是內(nèi)部類(lèi)方法
}
}

分析:
想想如果你要使用一個(gè)類(lèi)中方法或者屬性,你就必須要先有該類(lèi)的一個(gè)對(duì)象,同理,一個(gè)類(lèi)在另一個(gè)類(lèi)的內(nèi)部,那么想要使用這個(gè)內(nèi)部類(lèi),就必須先要有外部類(lèi)的一個(gè)實(shí)例對(duì)象,然后在通過(guò)該對(duì)象去使用內(nèi)部類(lèi)。
1.2.3 【成員內(nèi)部類(lèi)能干什么?】
訪(fǎng)問(wèn)外部類(lèi)的所有屬性(這里的屬性包括私有的成員變量,方法)
//在A(yíng)類(lèi)中申明了一個(gè)B類(lèi),此B類(lèi)就在A(yíng)的內(nèi)部,并且在成員變量的位置上,所以就稱(chēng)為成員內(nèi)部類(lèi)
public class Outer {
private String id = "11923020124";
class Inner {
public void in() {
System.out.println("這是內(nèi)部類(lèi)方法");
}
//內(nèi)部類(lèi)訪(fǎng)問(wèn)外部類(lèi)私有的成員變量
public void getId() {
System.out.println("id: " + id);
}
public void useOut() {
out();
}
}
public void out() {
System.out.println("這是外部類(lèi)方法");
}
}
class Test {
public static void main(String[] args) {
//實(shí)例化成員內(nèi)部類(lèi)分兩步
//1、實(shí)例化外部類(lèi)
Outer outObject = new Outer();
//2、通過(guò)外部類(lèi)調(diào)用內(nèi)部類(lèi)
Outer.Inner inObject = outObject.new Inner();
//測(cè)試,調(diào)用內(nèi)部類(lèi)中的方法
inObject.in();//打?。哼@是內(nèi)部類(lèi)方法
inObject.getId();
inObject.useOut();
}
}

如果內(nèi)部類(lèi)中的變量名和外部類(lèi)的成員變量名一樣,要通過(guò)創(chuàng)建外部類(lèi)對(duì)象 "."屬性來(lái)訪(fǎng)問(wèn)外部類(lèi)屬性,通過(guò)this.屬性訪(fǎng)問(wèn)內(nèi)部類(lèi)成員屬性
//在A(yíng)類(lèi)中申明了一個(gè)B類(lèi),此B類(lèi)就在A(yíng)的內(nèi)部,并且在成員變量的位置上,所以就稱(chēng)為成員內(nèi)部類(lèi)
public class Outer {
private String id = "Outer Id";
class Inner {
private String id = "Inner Id"; //這個(gè)id跟外部類(lèi)的屬性id名稱(chēng)一樣。
public void getInnerId() {
System.out.println(id);//輸出Inner Id,內(nèi)部類(lèi)中的變量會(huì)暫時(shí)將外部類(lèi)的成員變量給隱藏
}
public void getOuterId() {
System.out.println(Outer.this.id);//輸出Outer Id,內(nèi)部類(lèi)中的變量會(huì)暫時(shí)將外部類(lèi)的成員變量給隱藏
}
}
public void out() {
System.out.println("這是外部類(lèi)方法");
}
}
class Test {
public static void main(String[] args) {
//實(shí)例化成員內(nèi)部類(lèi)分兩步
//1、實(shí)例化外部類(lèi)
Outer outObject = new Outer();
//2、通過(guò)外部類(lèi)調(diào)用內(nèi)部類(lèi)
Outer.Inner inObject = outObject.new Inner();
//測(cè)試,調(diào)用內(nèi)部類(lèi)中的方法
inObject.getInnerId();
inObject.getOuterId();
}
}

說(shuō)明:
如何調(diào)用外部類(lèi)的成員變量呢?通過(guò)Outer.this,因?yàn)槿绻雽?shí)例化內(nèi)部類(lèi)對(duì)象,就必須通過(guò)外部類(lèi)對(duì)象,當(dāng)外部類(lèi)對(duì)象new出內(nèi)部類(lèi)對(duì)象時(shí),會(huì)把自己(外部類(lèi)對(duì)象)的引用傳到了內(nèi)部類(lèi)中,所以?xún)?nèi)部類(lèi)就可以通過(guò)Outer.this來(lái)訪(fǎng)問(wèn)外部類(lèi)的屬性和方法,到這里,你也就可以知道為什么內(nèi)部類(lèi)可以訪(fǎng)問(wèn)外部類(lèi) 的屬性和方法,這里由于有兩個(gè)相同的屬性名稱(chēng),所以需要顯示的用Outer.this來(lái)調(diào)用外部類(lèi)的屬性,平常如果屬性名 不重復(fù),那么我們?cè)趦?nèi)部類(lèi)中調(diào)用外部類(lèi)的屬性和方法時(shí),前面就隱式的調(diào)用了Outer.this。
1.2.4 借助成員內(nèi)部類(lèi),來(lái)總結(jié)內(nèi)部類(lèi)(包括4種內(nèi)部類(lèi))的通用用法:
- 要想訪(fǎng)問(wèn)內(nèi)部類(lèi)中的內(nèi)容,必須通過(guò)外部類(lèi)對(duì)象來(lái)實(shí)例化內(nèi)部類(lèi)。
- 能夠訪(fǎng)問(wèn)外部類(lèi)所有的屬性和方法,原理就是在通過(guò)外部類(lèi)對(duì)象實(shí)例化內(nèi)部類(lèi)對(duì)象時(shí),外部類(lèi)對(duì)象把自己的引用傳進(jìn)了內(nèi)部類(lèi),使內(nèi)部類(lèi)可以用通過(guò)Outer.this去調(diào)用外部類(lèi)的屬性和方法,一般都是隱式調(diào)用了,但是當(dāng)內(nèi)部類(lèi)中有屬性或者方法名和外部類(lèi)中的屬性或方法名相同的時(shí)候,就需要通過(guò)顯式調(diào)用Outer.this了。
到此這篇關(guān)于Java面向?qū)ο笾畠?nèi)部類(lèi)案例講解的文章就介紹到這了,更多相關(guān)Java面向?qū)ο笾畠?nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟
這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
ShardingSphere數(shù)據(jù)分片算法及測(cè)試實(shí)戰(zhàn)
這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)分片算法及測(cè)試實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
java 數(shù)據(jù)結(jié)構(gòu)與算法 (快速排序法)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)與算法(快速排序法),,快速排序法是實(shí)踐中的一種快速的排序算法,在c++或?qū)ava基本類(lèi)型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下2022-02-02
springboot的LogbackLoggingSystem配置加載流程解析
這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
關(guān)于TreeMap自定義排序規(guī)則的兩種方式
這篇文章主要介紹了關(guān)于TreeMap自定義排序規(guī)則的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
一篇文章帶你了解spring事務(wù)失效的多種場(chǎng)景
在日常編碼過(guò)程中常常涉及到事務(wù),在前兩天看到一篇文章提到了Spring事務(wù),那么在此總結(jié)下在Spring環(huán)境下事務(wù)失效的幾種原因.2021-09-09
Java8使用lambda實(shí)現(xiàn)Java的尾遞歸
這篇文章主要介紹了Java8使用lambda實(shí)現(xiàn)Java的尾遞歸的相關(guān)資料,需要的朋友可以參考下2017-10-10
Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Java鎖升級(jí)的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

