Java中內(nèi)部類使用方法實(shí)戰(zhàn)案例分析
本文實(shí)例講述了Java中內(nèi)部類使用方法。分享給大家供大家參考,具體如下:
一 點(diǎn)睛
分三種情況討論內(nèi)部類的使用:
1 在外部類內(nèi)部使用內(nèi)部類
2 在外部類以外使用非靜態(tài)內(nèi)部類
3 在外部類以外使用靜態(tài)內(nèi)部類
二 在外部類內(nèi)部使用內(nèi)部類
可以直接通過(guò)內(nèi)部類的類名來(lái)定義變量,通過(guò)new調(diào)用內(nèi)部構(gòu)造器來(lái)創(chuàng)建實(shí)例。
不要在外部類的靜態(tài)成員(包括靜態(tài)方法和靜態(tài)初始化塊)中使用非靜態(tài)內(nèi)部類,因?yàn)殪o態(tài)成員不能訪問(wèn)非靜態(tài)成員。
三 在外部類以外使用非靜態(tài)內(nèi)部類
1 點(diǎn)睛
private 修飾的內(nèi)部類只能在外部類內(nèi)部使用。所以要在外部類以外地方使用非靜態(tài)內(nèi)部類,必須使用其他修飾符。
省略訪問(wèn)控制符的內(nèi)部類:只能被與外部類處于同一個(gè)包中的其他類所訪問(wèn)。
使用protected修飾的內(nèi)部類:可被與外部類處于同一個(gè)包的其他類和外部類的子類所訪問(wèn)。
使用public修飾的內(nèi)部類:可被任意地方訪問(wèn)。
在外部類以外的地方定義內(nèi)部類(包括靜態(tài)和非靜態(tài)兩種)變量語(yǔ)法格式如下:
OuterClass.InnerClass varName
內(nèi)部類完整類名應(yīng)該是OuterClass.InnerClass。如果外部類有包名,則應(yīng)該增加包名前綴
在外部類以外的地方使用非靜態(tài)內(nèi)部類創(chuàng)建對(duì)象的語(yǔ)法如下:
OuterInstance.new InnerConstructor()
2 代碼
CreateInnerInstance.java
class Out { // 定義一個(gè)內(nèi)部類,不使用訪問(wèn)控制符, // 即只有同一個(gè)包中其他類可訪問(wèn)該內(nèi)部類 class In { public In(String msg) { System.out.println(msg); } } } public class CreateInnerInstance { public static void main(String[] args) { Out.In in = new Out().new In("測(cè)試信息"); /* 上面代碼可改為如下三行代碼: 使用OutterClass.InnerClass的形式定義內(nèi)部類變量 Out.In in; 創(chuàng)建外部類實(shí)例,非靜態(tài)內(nèi)部類實(shí)例將寄存在該實(shí)例中 Out out = new Out(); 通過(guò)外部類實(shí)例和new來(lái)調(diào)用內(nèi)部類構(gòu)造器創(chuàng)建非靜態(tài)內(nèi)部類實(shí)例 in = out.new In("測(cè)試信息"); */ } }
3 運(yùn)行
測(cè)試信息
4 代碼
SubClass.java
public class SubClass extends Out.In { //顯示定義SubClass的構(gòu)造器 public SubClass(Out out) { //通過(guò)傳入的Out對(duì)象顯式調(diào)用In的構(gòu)造器 out.super("hello"); } }
CreateInnerInstance.java
class Out { // 定義一個(gè)內(nèi)部類,不使用訪問(wèn)控制符, // 即只有同一個(gè)包中其他類可訪問(wèn)該內(nèi)部類 class In { public In(String msg) { System.out.println(msg); } } } public class CreateInnerInstance { public static void main(String[] args) { Out.In in = new Out().new In("測(cè)試信息"); /* 上面代碼可改為如下三行代碼: 使用OutterClass.InnerClass的形式定義內(nèi)部類變量 Out.In in; 創(chuàng)建外部類實(shí)例,非靜態(tài)內(nèi)部類實(shí)例將寄存在該實(shí)例中 Out out = new Out(); 通過(guò)外部類實(shí)例和new來(lái)調(diào)用內(nèi)部類構(gòu)造器創(chuàng)建非靜態(tài)內(nèi)部類實(shí)例 in = out.new In("測(cè)試信息"); */ SubClass subclass = new SubClass(new Out()); } }
5 運(yùn)行
測(cè)試信息
hello
6 說(shuō)明
非靜態(tài)內(nèi)部類In對(duì)象和SubClass對(duì)象都必須持有指向Outer對(duì)象的引用,區(qū)別是創(chuàng)建兩種對(duì)象時(shí)傳入Out對(duì)象的方式不同:當(dāng)創(chuàng)建非靜態(tài)內(nèi)部類In類的對(duì)象時(shí),必須通過(guò)Outer對(duì)象來(lái)調(diào)用new關(guān)鍵字,當(dāng)創(chuàng)建SubClass類的對(duì)象時(shí),必須使用Outer對(duì)象作為調(diào)用者來(lái)調(diào)用In類的構(gòu)造器。
非靜態(tài)內(nèi)部類的子類不一定是內(nèi)部類,它可以是一個(gè)外部類。但非靜態(tài)內(nèi)部類的子類實(shí)例一樣需要保留一個(gè)引用,該引用指向其父類所在外部類的對(duì)象。也就是說(shuō),如果有一個(gè)內(nèi)部類子類的對(duì)象存在,則一定存在與之對(duì)應(yīng)的外部類對(duì)象。
四 在外部類以外使用靜態(tài)內(nèi)部類
1 點(diǎn)睛
在外部類以外的地方使用靜態(tài)內(nèi)部類創(chuàng)建對(duì)象的語(yǔ)法如下:
new OuterClass.InnerConstructer();
2 代碼
class StaticOut { // 定義一個(gè)靜態(tài)內(nèi)部類,不使用訪問(wèn)控制符, // 即同一個(gè)包中其他類可訪問(wèn)該內(nèi)部類 static class StaticIn { public StaticIn() { System.out.println("靜態(tài)內(nèi)部類的構(gòu)造器"); } } } public class CreateStaticInnerInstance { public static void main(String[] args) { StaticOut.StaticIn in = new StaticOut.StaticIn(); /* 上面代碼可改為如下兩行代碼: 使用OutterClass.InnerClass的形式定義內(nèi)部類變量 StaticOut.StaticIn in; 通過(guò)new來(lái)調(diào)用內(nèi)部類構(gòu)造器創(chuàng)建靜態(tài)內(nèi)部類實(shí)例 in = new StaticOut.StaticIn(); */ } }
3 運(yùn)行
靜態(tài)內(nèi)部類的構(gòu)造器
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- C#匿名委托和Java匿名局部?jī)?nèi)部類使用方法示例
- Java局部?jī)?nèi)部類和匿名內(nèi)部類定義與用法實(shí)例分析
- Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用示例
- java匿名內(nèi)部類實(shí)例簡(jiǎn)析
- Java內(nèi)部類的繼承(全)
- java中關(guān)于內(nèi)部類的使用詳解
- java 內(nèi)部類(匿名類,匿名對(duì)象,靜態(tài)內(nèi)部類)詳解及實(shí)例
- 在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法
- Java內(nèi)部類之間的閉包和回調(diào)詳解
- JAVA 內(nèi)部類詳解及實(shí)例
- Java局部?jī)?nèi)部類原理與用法實(shí)例分析
相關(guān)文章
JPA添加Pageable實(shí)現(xiàn)翻頁(yè)時(shí)報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決JPA添加Pageable實(shí)現(xiàn)翻頁(yè)時(shí)報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java 采用反射獲取class屬性值的實(shí)現(xiàn)代碼
以下是對(duì)在Java中采用反射獲取class屬性值的實(shí)現(xiàn)代碼進(jìn)行了分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08Java線程的調(diào)度與優(yōu)先級(jí)詳解
這篇文章主要為大家詳細(xì)介紹了Java線程的調(diào)度與優(yōu)先級(jí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03SpringBoot實(shí)現(xiàn)Excel文件批量上傳導(dǎo)入數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)Excel文件批量上傳導(dǎo)入數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11關(guān)于Java項(xiàng)目讀取resources資源文件路徑的那點(diǎn)事
這篇文章主要介紹了關(guān)于Java項(xiàng)目讀取resources資源文件路徑的那點(diǎn)事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07springboot登陸過(guò)濾功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot登陸過(guò)濾功能的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12