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類來說就稱為內(nèi)部類,而A類相對(duì)B類來說就是外部類了。
- 內(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í)例化外部類,通過外部類去調(diào)用內(nèi)部類
// 代碼接上
class Test {
public static void main(String[] args) {
//實(shí)例化成員內(nèi)部類分兩步
//1、實(shí)例化外部類
Outer outObject = new Outer();
//2、通過外部類調(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ì)象,然后在通過該對(duì)象去使用內(nèi)部類。
1.2.3 【成員內(nèi)部類能干什么?】
訪問外部類的所有屬性(這里的屬性包括私有的成員變量,方法)
//在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)部類訪問外部類私有的成員變量
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、通過外部類調(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)部類中的變量名和外部類的成員變量名一樣,要通過創(chuàng)建外部類對(duì)象 "."屬性來訪問外部類屬性,通過this.屬性訪問內(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、通過外部類調(diào)用內(nèi)部類
Outer.Inner inObject = outObject.new Inner();
//測(cè)試,調(diào)用內(nèi)部類中的方法
inObject.getInnerId();
inObject.getOuterId();
}
}

說明:
如何調(diào)用外部類的成員變量呢?通過Outer.this,因?yàn)槿绻雽?shí)例化內(nèi)部類對(duì)象,就必須通過外部類對(duì)象,當(dāng)外部類對(duì)象new出內(nèi)部類對(duì)象時(shí),會(huì)把自己(外部類對(duì)象)的引用傳到了內(nèi)部類中,所以內(nèi)部類就可以通過Outer.this來訪問外部類的屬性和方法,到這里,你也就可以知道為什么內(nèi)部類可以訪問外部類 的屬性和方法,這里由于有兩個(gè)相同的屬性名稱,所以需要顯示的用Outer.this來調(diào)用外部類的屬性,平常如果屬性名 不重復(fù),那么我們?cè)趦?nèi)部類中調(diào)用外部類的屬性和方法時(shí),前面就隱式的調(diào)用了Outer.this。
1.2.4 借助成員內(nèi)部類,來總結(jié)內(nèi)部類(包括4種內(nèi)部類)的通用用法:
- 要想訪問內(nèi)部類中的內(nèi)容,必須通過外部類對(duì)象來實(shí)例化內(nèi)部類。
- 能夠訪問外部類所有的屬性和方法,原理就是在通過外部類對(duì)象實(shí)例化內(nèi)部類對(duì)象時(shí),外部類對(duì)象把自己的引用傳進(jìn)了內(nèi)部類,使內(nèi)部類可以用通過Outer.this去調(diào)用外部類的屬性和方法,一般都是隱式調(diào)用了,但是當(dāng)內(nèi)部類中有屬性或者方法名和外部類中的屬性或方法名相同的時(shí)候,就需要通過顯式調(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)文章
詳解java中Reference的實(shí)現(xiàn)與相應(yīng)的執(zhí)行過程
不知道大家知不知道特殊的reference對(duì)象都是被jvm專門處理的,所以這篇文章就相應(yīng)的工作流程和referencequeue之間的協(xié)作進(jìn)行梳理.有需要的朋友們可以參考借鑒。2016-09-09
Java8中利用stream對(duì)map集合進(jìn)行過濾的方法
這篇文章主要給大家介紹了關(guān)于Java8中利用stream對(duì)map集合進(jìn)行過濾的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能
接口簽名是一種重要的安全機(jī)制,用于確保 API 請(qǐng)求的真實(shí)性、數(shù)據(jù)的完整性以及防止重放攻擊,這篇文章主要介紹了SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能,需要的朋友可以參考下2025-04-04
SWT(JFace) 簡(jiǎn)易瀏覽器 制作實(shí)現(xiàn)代碼
SWT(JFace) 簡(jiǎn)易瀏覽器 制作實(shí)現(xiàn)代碼2009-06-06
ZooKeeper入門教程三分布式鎖實(shí)現(xiàn)及完整運(yùn)行源碼
本文是ZooKeeper入門系列教程,分布式鎖有多種實(shí)現(xiàn)方式,比如通過數(shù)據(jù)庫(kù)、redis都可實(shí)現(xiàn)。作為分布式協(xié)同工具ZooKeeper,當(dāng)然也有著標(biāo)準(zhǔn)的實(shí)現(xiàn)方式。本文介紹在zookeeper中如何實(shí)現(xiàn)排他鎖2022-01-01

