初探Java內(nèi)部類的使用
之前對內(nèi)部類的概念不太清晰,在此對內(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)建需要依賴于外部類對象,沒有創(chuàng)建外部類實(shí)例之前無法創(chuàng)建成員內(nèi)部類對象
若在main函數(shù)中直接創(chuàng)建成員內(nèi)部類則會(huì)報(bào)錯(cuò):
MemberInner memberInner = new MemberInner();
私有屬性訪問:成員內(nèi)部類可直接訪問外部類非靜態(tài)私有屬性,外部類訪問內(nèi)部類私有屬性則需要通過內(nèi)部類的對象來訪問
在memberInnerTest()方法中,可以直接訪問外部類中的私有test字段,若內(nèi)部類中有與外部類同名字段,調(diào)用外部類需要使用如下方法:
OuterTest.this.test
創(chuàng)建內(nèi)部類:
在外部類內(nèi)部創(chuàng)建內(nèi)部類對象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類對象
private void createMemberInner(){
MemberInner memberInner = new MemberInner();
memberInner.memberInnerTest();
}
在外部類外部創(chuàng)建內(nèi)部類對象:需要先創(chuàng)建外部類對象,再通過外部類創(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è)外部類對象,各個(gè)類對象都是獨(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)部類不需要外部類對象產(chǎn)生就能使用,不能訪問外部類的成員域,但能訪問靜態(tài)域。
私有屬性訪問:靜態(tài)內(nèi)部類不可直接訪問外部類的非靜態(tài)屬性
創(chuàng)建內(nèi)部類:
在外部類內(nèi)部創(chuàng)建內(nèi)部類對象:使用new關(guān)鍵字創(chuàng)建內(nèi)部類對象
private void createStaticInner(){
StaticInner staticInner = new StaticInner();
staticInner.staticInnerTest();
}
在外部類外部創(chuàng)建內(nèi)部類對象:可以不創(chuàng)建外部類對象,直接創(chuàng)建內(nèi)部類對象
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法
本文主要介紹了詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
SpringBoot項(xiàng)目使用mybatis-plus代碼生成的實(shí)例詳解
mybatis-plus是mybatis的增強(qiáng),不對mybatis做任何改變,涵蓋了代碼生成,自定義ID生成器,快速實(shí)現(xiàn)CRUD,自動(dòng)分頁,邏輯刪除等功能。本文就來講講SpringBoot項(xiàng)目如何使用mybatis-plus實(shí)現(xiàn)代碼生成,需要的可以了解一下2022-10-10
SpringBoot深入探究@Conditional條件裝配的使用
這篇文章主要為大家介紹了SpringBoot底層注解@Conditional的使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
javabean?中使用@Transient屬性處理臨時(shí)字段
@Transient表示該屬性并非一個(gè)到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性,本文給大家介紹javabean?中臨時(shí)字段的處理:@Transient,感興趣的朋友跟隨小編一起看看吧2023-08-08
基于JavaMail實(shí)現(xiàn)簡單郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了基于JavaMail實(shí)現(xiàn)簡單郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Java?8中讀取文件內(nèi)容?Files.lines()方法使用示例
這篇文章主要介紹了Java?8中讀取文件內(nèi)容Files.lines()方法如何使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
UrlDecoder和UrlEncoder使用詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了UrlDecoder和UrlEncoder使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

