Java面向?qū)ο笾畠?nèi)部類案例講解
1. 內(nèi)部類
很多時(shí)候我們創(chuàng)建類的對(duì)象的時(shí)候并不需要使用很多次,每次只使用一次,這個(gè)時(shí)候我們就可以使用內(nèi)部類了
1.1 內(nèi)部類概述
- 內(nèi)部類就是在一個(gè)類的內(nèi)部在定義一個(gè)類,比如,A類中定義一個(gè)B類,那么B類相對(duì)A類來(lái)說(shuō)就稱為內(nèi)部類,而A類相對(duì)B類來(lái)說(shuō)就是外部類了。
- 內(nèi)部類不是在一個(gè)java源文件中編寫倆個(gè)平行的倆個(gè)類,而是在一個(gè)類的內(nèi)部再定義另外一個(gè)類。 我可以把外邊的類稱為外部類,在其內(nèi)部編寫的類稱為內(nèi)部類。
- 內(nèi)部類分為四種:
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 局部?jī)?nèi)部類
- 匿名內(nèi)部類
1.2 成員內(nèi)部類(實(shí)例內(nèi)部類、非靜態(tài)內(nèi)部類)
注:成員內(nèi)部類中不能寫靜態(tài)屬性和方法
1.2.1 【定義一個(gè)內(nèi)部類】
//在A類中申明了一個(gè)B類,此B類就在A的內(nèi)部,并且在成員變量的位置上,所以就稱為成員內(nèi)部類 public class Outer { private int id; class Inner { public void in() { System.out.println("這是內(nèi)部類方法"); } } public void out() { System.out.println("這是外部類方法"); } }
1.2.2【實(shí)例化內(nèi)部類】
實(shí)例化內(nèi)部類,首先需要實(shí)例化外部類,通過(guò)外部類去調(diào)用內(nèi)部類
// 代碼接上 class Test { public static void main(String[] args) { //實(shí)例化成員內(nèi)部類分兩步 //1、實(shí)例化外部類 Outer outObject = new Outer(); //2、通過(guò)外部類調(diào)用內(nèi)部類 Outer.Inner inObject = outObject.new Inner(); //測(cè)試,調(diào)用內(nèi)部類中的方法 inObject.in();//打印:這是內(nèi)部類方法 } }
分析:
想想如果你要使用一個(gè)類中方法或者屬性,你就必須要先有該類的一個(gè)對(duì)象,同理,一個(gè)類在另一個(gè)類的內(nèi)部,那么想要使用這個(gè)內(nèi)部類,就必須先要有外部類的一個(gè)實(shí)例對(duì)象,然后在通過(guò)該對(duì)象去使用內(nèi)部類。
1.2.3 【成員內(nèi)部類能干什么?】
訪問(wèn)外部類的所有屬性(這里的屬性包括私有的成員變量,方法)
//在A類中申明了一個(gè)B類,此B類就在A的內(nèi)部,并且在成員變量的位置上,所以就稱為成員內(nèi)部類 public class Outer { private String id = "11923020124"; class Inner { public void in() { System.out.println("這是內(nèi)部類方法"); } //內(nèi)部類訪問(wèn)外部類私有的成員變量 public void getId() { System.out.println("id: " + id); } public void useOut() { out(); } } public void out() { System.out.println("這是外部類方法"); } } class Test { public static void main(String[] args) { //實(shí)例化成員內(nèi)部類分兩步 //1、實(shí)例化外部類 Outer outObject = new Outer(); //2、通過(guò)外部類調(diào)用內(nèi)部類 Outer.Inner inObject = outObject.new Inner(); //測(cè)試,調(diào)用內(nèi)部類中的方法 inObject.in();//打印:這是內(nèi)部類方法 inObject.getId(); inObject.useOut(); } }
如果內(nèi)部類中的變量名和外部類的成員變量名一樣,要通過(guò)創(chuàng)建外部類對(duì)象 "."屬性來(lái)訪問(wèn)外部類屬性,通過(guò)this.屬性訪問(wèn)內(nèi)部類成員屬性
//在A類中申明了一個(gè)B類,此B類就在A的內(nèi)部,并且在成員變量的位置上,所以就稱為成員內(nèi)部類 public class Outer { private String id = "Outer Id"; class Inner { private String id = "Inner Id"; //這個(gè)id跟外部類的屬性id名稱一樣。 public void getInnerId() { System.out.println(id);//輸出Inner Id,內(nèi)部類中的變量會(huì)暫時(shí)將外部類的成員變量給隱藏 } public void getOuterId() { System.out.println(Outer.this.id);//輸出Outer Id,內(nèi)部類中的變量會(huì)暫時(shí)將外部類的成員變量給隱藏 } } public void out() { System.out.println("這是外部類方法"); } } class Test { public static void main(String[] args) { //實(shí)例化成員內(nèi)部類分兩步 //1、實(shí)例化外部類 Outer outObject = new Outer(); //2、通過(guò)外部類調(diào)用內(nèi)部類 Outer.Inner inObject = outObject.new Inner(); //測(cè)試,調(diào)用內(nèi)部類中的方法 inObject.getInnerId(); inObject.getOuterId(); } }
說(shuō)明:
如何調(diào)用外部類的成員變量呢?通過(guò)Outer.this,因?yàn)槿绻雽?shí)例化內(nèi)部類對(duì)象,就必須通過(guò)外部類對(duì)象,當(dāng)外部類對(duì)象new出內(nèi)部類對(duì)象時(shí),會(huì)把自己(外部類對(duì)象)的引用傳到了內(nèi)部類中,所以內(nèi)部類就可以通過(guò)Outer.this來(lái)訪問(wèn)外部類的屬性和方法,到這里,你也就可以知道為什么內(nèi)部類可以訪問(wèn)外部類 的屬性和方法,這里由于有兩個(gè)相同的屬性名稱,所以需要顯示的用Outer.this來(lái)調(diào)用外部類的屬性,平常如果屬性名 不重復(fù),那么我們?cè)趦?nèi)部類中調(diào)用外部類的屬性和方法時(shí),前面就隱式的調(diào)用了Outer.this。
1.2.4 借助成員內(nèi)部類,來(lái)總結(jié)內(nèi)部類(包括4種內(nèi)部類)的通用用法:
- 要想訪問(wèn)內(nèi)部類中的內(nèi)容,必須通過(guò)外部類對(duì)象來(lái)實(shí)例化內(nèi)部類。
- 能夠訪問(wèn)外部類所有的屬性和方法,原理就是在通過(guò)外部類對(duì)象實(shí)例化內(nèi)部類對(duì)象時(shí),外部類對(duì)象把自己的引用傳進(jìn)了內(nèi)部類,使內(nèi)部類可以用通過(guò)Outer.this去調(diào)用外部類的屬性和方法,一般都是隱式調(diào)用了,但是當(dāng)內(nèi)部類中有屬性或者方法名和外部類中的屬性或方法名相同的時(shí)候,就需要通過(guò)顯式調(diào)用Outer.this了。
到此這篇關(guān)于Java面向?qū)ο笾畠?nèi)部類案例講解的文章就介紹到這了,更多相關(guān)Java面向?qū)ο笾畠?nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟
這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02ShardingSphere數(shù)據(jù)分片算法及測(cè)試實(shí)戰(zhàn)
這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)分片算法及測(cè)試實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java 數(shù)據(jù)結(jié)構(gòu)與算法 (快速排序法)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)與算法(快速排序法),,快速排序法是實(shí)踐中的一種快速的排序算法,在c++或?qū)ava基本類型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下2022-02-02springboot的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-09Java8使用lambda實(shí)現(xiàn)Java的尾遞歸
這篇文章主要介紹了Java8使用lambda實(shí)現(xiàn)Java的尾遞歸的相關(guān)資料,需要的朋友可以參考下2017-10-10Java鎖升級(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