初探Java內(nèi)部類的使用
之前對(duì)內(nèi)部類的概念不太清晰,在此對(duì)內(nèi)部類與外部類之間的關(guān)系以及它們之間的調(diào)用方式進(jìn)行一個(gè)總結(jié)。
Java內(nèi)部類一般可以分為以下三種:
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 匿名內(nèi)部類
一、成員內(nèi)部類
內(nèi)部類的創(chuàng)建:成員內(nèi)部類的創(chuàng)建需要依賴于外部類對(duì)象,沒有創(chuàng)建外部類實(shí)例之前無法創(chuàng)建成員內(nèi)部類對(duì)象
若在main函數(shù)中直接創(chuàng)建成員內(nèi)部類則會(huì)報(bào)錯(cuò):
MemberInner memberInner = new MemberInner();
私有屬性訪問:成員內(nèi)部類可直接訪問外部類非靜態(tài)私有屬性,外部類訪問內(nèi)部類私有屬性則需要通過內(nèi)部類的對(duì)象來訪問
在memberInnerTest()方法中,可以直接訪問外部類中的私有test字段,若內(nèi)部類中有與外部類同名字段,調(diào)用外部類需要使用如下方法:
OuterTest.this.test
創(chuàng)建內(nèi)部類:
在外部類內(nèi)部創(chuàng)建內(nèi)部類對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類對(duì)象
private void createMemberInner(){ MemberInner memberInner = new MemberInner(); memberInner.memberInnerTest(); }
在外部類外部創(chuàng)建內(nèi)部類對(duì)象:需要先創(chuàng)建外部類對(duì)象,再通過外部類創(chuàng)建內(nèi)部類
OuterTest outerTest = new OuterTest(); MemberInner memberInner = outerTest.new MemberInner();
若不需要使用外部類,可以使用如下方式創(chuàng)建內(nèi)部類
MemberInner memberInner = new OuterTest().new MemberInner();
使用該方法創(chuàng)建內(nèi)部類需要注意:若外部類中有多個(gè)內(nèi)部類,這種方法會(huì)new出多個(gè)外部類對(duì)象,各個(gè)類對(duì)象都是獨(dú)立的,因此外部類的成員變量并不會(huì)在內(nèi)部類中共享。
如下代碼中,由于new出了兩個(gè)OuterVar類,所以InnerOne與InnerTwo類輸出的成員變量var均為0。若想InnerOne與InnerTwo類共享成員變量var,則需用如下方式創(chuàng)建:
OuterVar outerVar = new OuterVar(); InnerOne innerOne = outerVar.new InnerOne(); InnerTwo innerTwo = outerVar.new InnerTwo(); public class OuterVar { private int var = 0; class InnerOne{ private void innerOnePrint(){ System.out.println("innerOnePrint:"+var); var+=1; } } class InnerTwo{ private void innerTwoPrint(){ System.out.println("innerTwoPrint:"+var); } } public static void main(String[] args) { InnerOne innerOne = new OuterVar().new InnerOne(); InnerTwo innerTwo = new OuterVar().new InnerTwo(); innerOne.innerOnePrint(); innerTwo.innerTwoPrint(); } } /* 結(jié)果 innerOnePrint:0 innerTwoPrint:0 */
/*1、成員內(nèi)部類 2、靜態(tài)內(nèi)部類 3、匿名內(nèi)部類 */ public class OuterTest { /* 1、成員內(nèi)部類 */ private String test = "OuterTest"; private void createMemberInner(){ MemberInner memberInner = new MemberInner(); memberInner.memberInnerTest(); } class MemberInner{ private String test = "MemberInnerTest"; public void memberInnerTest(){ System.out.println("MemberInner"); System.out.println(test); System.out.println(OuterTest.this.test); } } public static void main(String[] args) { // 成員內(nèi)部類 OuterTest outerTest = new OuterTest(); MemberInner memberInner = outerTest.new MemberInner(); // MemberInner memberInner = new OuterTest().new MemberInner(); memberInner.memberInnerTest(); } } /* 結(jié)果 MemberInner MemberInnerTest OuterTest */
二、靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類定義在外部類的內(nèi)部,使用static關(guān)鍵字修飾,靜態(tài)內(nèi)部類不需要外部類對(duì)象產(chǎn)生就能使用,不能訪問外部類的成員域,但能訪問靜態(tài)域。
私有屬性訪問:靜態(tài)內(nèi)部類不可直接訪問外部類的非靜態(tài)屬性
創(chuàng)建內(nèi)部類:
在外部類內(nèi)部創(chuàng)建內(nèi)部類對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類對(duì)象
private void createStaticInner(){ StaticInner staticInner = new StaticInner(); staticInner.staticInnerTest(); }
在外部類外部創(chuàng)建內(nèi)部類對(duì)象:可以不創(chuàng)建外部類對(duì)象,直接創(chuàng)建內(nèi)部類對(duì)象
StaticInner staticInner = new StaticInner(); public class OuterTest { /* 2、靜態(tài)內(nèi)部類 */ private String test = "OuterTest"; private void createStaticInner(){ StaticInner staticInner = new StaticInner(); staticInner.staticInnerTest(); } static class StaticInner{ private String test = "StaticInnerTest"; public void staticInnerTest(){ System.out.println("StaticInner"); System.out.println(test); } } public static void main(String[] args) { // 靜態(tài)內(nèi)部類 StaticInner staticInner = new StaticInner(); staticInner.staticInnerTest(); } } /* 結(jié)果 StaticInner StaticInnerTest */
三、匿名內(nèi)部類
使用匿名內(nèi)部類的前提條件:必須繼承一個(gè)父類或?qū)崿F(xiàn)一個(gè)接口。 有以下一些特點(diǎn):
由于匿名內(nèi)部類是沒有類名,所以匿名內(nèi)部類不能有構(gòu)造方法
匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類
//匿名內(nèi)部類 interface Father{ public abstract void talk(); public abstract void eat(); } public class Test { public static void main(String[] args) { //匿名內(nèi)部類 Father father = new Father() { @Override public void talk() { System.out.println("I'm Father"); } @Override public void eat() { System.out.println("I'm eating"); } }; father.talk(); father.eat(); } } /* 結(jié)果 I'm Father I'm eating */
到此這篇關(guān)于初探Java內(nèi)部類的使用的文章就介紹到這了,更多相關(guān)Java內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決遇到Cannot resolve ch.qos.logback:logback-classic:
當(dāng)使用Maven配置項(xiàng)目依賴時(shí),可能會(huì)遇到無法解析特定版本的錯(cuò)誤,例如,logback-classic版本1.2.3可能無法在配置的倉庫中找到,解決方法包括檢查倉庫是否包含所需版本,或更新到其他可用版本,可通過Maven官網(wǎng)搜索并找到適用的版本,替換依賴配置中的版本信息2024-09-09Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類詳解
Java是面向?qū)ο笳Z言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒有可以直接操作內(nèi)存的工具類呢?有!Java中提供Unsafe類可以用來來直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類,需要的朋友可以參考下2021-06-06Java矩陣連乘問題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
這篇文章主要介紹了Java矩陣連乘問題(動(dòng)態(tài)規(guī)劃)算法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)矩陣連乘的算法原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11Maven 搭建SpringMVC+Hibernate項(xiàng)目詳解
本文主要介紹Maven 搭建SpringMVC+Hibernate的知識(shí),這里整理了詳細(xì)的資料,并附示例代碼,有興趣的小伙伴可以參考下2016-09-09java生成圖片驗(yàn)證碼返回base64圖片信息方式
這篇文章主要介紹了java生成圖片驗(yàn)證碼返回base64圖片信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08