初探Java內(nèi)部類(lèi)的使用
之前對(duì)內(nèi)部類(lèi)的概念不太清晰,在此對(duì)內(nèi)部類(lèi)與外部類(lèi)之間的關(guān)系以及它們之間的調(diào)用方式進(jìn)行一個(gè)總結(jié)。
Java內(nèi)部類(lèi)一般可以分為以下三種:
- 成員內(nèi)部類(lèi)
- 靜態(tài)內(nèi)部類(lèi)
- 匿名內(nèi)部類(lèi)
一、成員內(nèi)部類(lèi)
內(nèi)部類(lèi)的創(chuàng)建:成員內(nèi)部類(lèi)的創(chuàng)建需要依賴(lài)于外部類(lèi)對(duì)象,沒(méi)有創(chuàng)建外部類(lèi)實(shí)例之前無(wú)法創(chuàng)建成員內(nèi)部類(lèi)對(duì)象
若在main函數(shù)中直接創(chuàng)建成員內(nèi)部類(lèi)則會(huì)報(bào)錯(cuò):
MemberInner memberInner = new MemberInner();
私有屬性訪(fǎng)問(wèn):成員內(nèi)部類(lèi)可直接訪(fǎng)問(wèn)外部類(lèi)非靜態(tài)私有屬性,外部類(lèi)訪(fǎng)問(wèn)內(nèi)部類(lèi)私有屬性則需要通過(guò)內(nèi)部類(lèi)的對(duì)象來(lái)訪(fǎng)問(wèn)
在memberInnerTest()方法中,可以直接訪(fǎng)問(wèn)外部類(lèi)中的私有test字段,若內(nèi)部類(lèi)中有與外部類(lèi)同名字段,調(diào)用外部類(lèi)需要使用如下方法:
OuterTest.this.test
創(chuàng)建內(nèi)部類(lèi):
在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類(lèi)對(duì)象
private void createMemberInner(){ MemberInner memberInner = new MemberInner(); memberInner.memberInnerTest(); }
在外部類(lèi)外部創(chuàng)建內(nèi)部類(lèi)對(duì)象:需要先創(chuàng)建外部類(lèi)對(duì)象,再通過(guò)外部類(lèi)創(chuàng)建內(nèi)部類(lèi)
OuterTest outerTest = new OuterTest(); MemberInner memberInner = outerTest.new MemberInner();
若不需要使用外部類(lèi),可以使用如下方式創(chuàng)建內(nèi)部類(lèi)
MemberInner memberInner = new OuterTest().new MemberInner();
使用該方法創(chuàng)建內(nèi)部類(lèi)需要注意:若外部類(lèi)中有多個(gè)內(nèi)部類(lèi),這種方法會(huì)new出多個(gè)外部類(lèi)對(duì)象,各個(gè)類(lèi)對(duì)象都是獨(dú)立的,因此外部類(lèi)的成員變量并不會(huì)在內(nèi)部類(lèi)中共享。
如下代碼中,由于new出了兩個(gè)OuterVar類(lèi),所以InnerOne與InnerTwo類(lèi)輸出的成員變量var均為0。若想InnerOne與InnerTwo類(lèi)共享成員變量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)部類(lèi) 2、靜態(tài)內(nèi)部類(lèi) 3、匿名內(nèi)部類(lèi) */ public class OuterTest { /* 1、成員內(nèi)部類(lè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)部類(lè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)部類(lèi)
靜態(tài)內(nèi)部類(lèi)定義在外部類(lèi)的內(nèi)部,使用static關(guān)鍵字修飾,靜態(tài)內(nèi)部類(lèi)不需要外部類(lèi)對(duì)象產(chǎn)生就能使用,不能訪(fǎng)問(wèn)外部類(lèi)的成員域,但能訪(fǎng)問(wèn)靜態(tài)域。
私有屬性訪(fǎng)問(wèn):靜態(tài)內(nèi)部類(lèi)不可直接訪(fǎng)問(wèn)外部類(lèi)的非靜態(tài)屬性
創(chuàng)建內(nèi)部類(lèi):
在外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類(lèi)對(duì)象
private void createStaticInner(){ StaticInner staticInner = new StaticInner(); staticInner.staticInnerTest(); }
在外部類(lèi)外部創(chuàng)建內(nèi)部類(lèi)對(duì)象:可以不創(chuàng)建外部類(lèi)對(duì)象,直接創(chuàng)建內(nèi)部類(lèi)對(duì)象
StaticInner staticInner = new StaticInner(); public class OuterTest { /* 2、靜態(tài)內(nèi)部類(lè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)部類(lèi) StaticInner staticInner = new StaticInner(); staticInner.staticInnerTest(); } } /* 結(jié)果 StaticInner StaticInnerTest */
三、匿名內(nèi)部類(lèi)
使用匿名內(nèi)部類(lèi)的前提條件:必須繼承一個(gè)父類(lèi)或?qū)崿F(xiàn)一個(gè)接口。 有以下一些特點(diǎn):
由于匿名內(nèi)部類(lèi)是沒(méi)有類(lèi)名,所以匿名內(nèi)部類(lèi)不能有構(gòu)造方法
匿名內(nèi)部類(lèi)不能定義任何靜態(tài)成員、方法和類(lèi)
//匿名內(nèi)部類(lèi) interface Father{ public abstract void talk(); public abstract void eat(); } public class Test { public static void main(String[] args) { //匿名內(nèi)部類(lè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)部類(lèi)的使用的文章就介紹到這了,更多相關(guān)Java內(nèi)部類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java內(nèi)部類(lèi)之成員內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)和匿名內(nèi)部類(lèi)用法及說(shuō)明
- Java匿名內(nèi)部類(lèi)導(dǎo)致內(nèi)存泄露的原因與解決方案詳解
- Java內(nèi)部類(lèi)持有外部類(lèi)導(dǎo)致內(nèi)存泄露的原因與解決方案詳解
- Java面向?qū)ο笾畠?nèi)部類(lèi)詳解
- 一文帶你真正理解Java中的內(nèi)部類(lèi)
- 詳解Java中static關(guān)鍵字和內(nèi)部類(lèi)的使用
- 關(guān)于JavaEE內(nèi)部類(lèi)的部分注意事項(xiàng)
相關(guān)文章
解決遇到Cannot resolve ch.qos.logback:logback-classic:
當(dāng)使用Maven配置項(xiàng)目依賴(lài)時(shí),可能會(huì)遇到無(wú)法解析特定版本的錯(cuò)誤,例如,logback-classic版本1.2.3可能無(wú)法在配置的倉(cāng)庫(kù)中找到,解決方法包括檢查倉(cāng)庫(kù)是否包含所需版本,或更新到其他可用版本,可通過(guò)Maven官網(wǎng)搜索并找到適用的版本,替換依賴(lài)配置中的版本信息2024-09-09Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解
Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下2021-06-06Java 內(nèi)存安全問(wèn)題的注意事項(xiàng)
內(nèi)存安全問(wèn)題是每個(gè)程序員開(kāi)發(fā)時(shí)都需要面對(duì)的問(wèn)題,本文介紹了JVM管理內(nèi)存的原理以及內(nèi)存安全問(wèn)題需要注意的地方,有此需求的朋友可以參考下本文2021-06-06Java矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
這篇文章主要介紹了Java矩陣連乘問(wèn)題(動(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