Java內(nèi)部類與匿名內(nèi)部類
一、內(nèi)部類
什么是內(nèi)部類
將一個(gè)類A定義在另一個(gè)類B里面,里面的那個(gè)類A就稱為內(nèi)部類,B則稱為外部類。
成員內(nèi)部類
成員內(nèi)部類 :定義在類中方法外的類。
定義格式:
class 外部類 {
class 內(nèi)部類{
}
}
在描述事物時(shí),若一個(gè)事物內(nèi)部還包含其他事物,就可以使用內(nèi)部類這種結(jié)構(gòu)。比如,電腦類Computer 中包含中央處理器類Cpu ,這時(shí), Cpu 就可以使用內(nèi)部類來描述,定義在成員位置。
代碼舉例:
class Computer { //外部類
class Cpu { //內(nèi)部類
}
}訪問特點(diǎn)
- 內(nèi)部類可以直接訪問外部類的成員,包括私有成員。
- 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對(duì)象。
創(chuàng)建內(nèi)部類對(duì)象格式:
外部類名.內(nèi)部類名 對(duì)象名 = new 外部類().new 內(nèi)部類();
訪問演示,代碼如下:
定義類:
public class Person {
private boolean live = true;
class Heart {
public void jump() {
// 直接訪問外部類成員
if (live) {
System.out.println("心臟在跳動(dòng)??");
} else {
System.out.println("心臟不跳了??");
}
}
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
}定義測試類:
public class InnerDemo {
public static void main(String[] args) {
// 創(chuàng)建外部類對(duì)象
Person p = new Person();
// 創(chuàng)建內(nèi)部類對(duì)象
Heart heart = p.new Heart();
// 調(diào)用內(nèi)部類方法
heart.jump();
// 調(diào)用外部類方法
p.setLive(false);
// 調(diào)用內(nèi)部類方法
heart.jump();
}
}輸出結(jié)果:
心臟在跳動(dòng)??
心臟不跳了??
??內(nèi)部類仍然是一個(gè)獨(dú)立的類,在編譯之后會(huì)內(nèi)部類會(huì)被編譯成獨(dú)立的.class文件,但是前面冠以外部類的類名和$符號(hào) 。比如,Person$Heart.class
二、匿名內(nèi)部類
匿名內(nèi)部類 :是內(nèi)部類的簡化寫法。它的本質(zhì)是一個(gè)帶具體實(shí)現(xiàn)的父類或者父接口的 匿名的 子類對(duì)象。開發(fā)中,最常用到的內(nèi)部類就是匿名內(nèi)部類了。以接口舉例,當(dāng)你使用一個(gè)接口時(shí),似乎得做如下幾步操作:
- 定義子類
- 重寫接口中的方法
- 創(chuàng)建子類對(duì)象
- 調(diào)用重寫后的方法
我們的目的,最終只是為了調(diào)用方法,那么能不能簡化一下,把以上四步合成一步呢?匿名內(nèi)部類就是做這樣的快捷方式。
前提
匿名內(nèi)部類必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)父接口。
格式
new 父類名或者接口名(){
// 方法重寫
@Override
public void method() {
// 執(zhí)行語句
}
};使用方式
以接口為例,匿名內(nèi)部類的使用,代碼如下:
定義接口:
public abstract class FlyAble{
public abstract void fly();
}創(chuàng)建匿名內(nèi)部類,并調(diào)用:
public class InnerDemo {
public static void main(String[] args) {
/**
1.等號(hào)右邊:是匿名內(nèi)部類,定義并創(chuàng)建該接口的子類對(duì)象
2.等號(hào)左邊:是多態(tài)賦值,接口類型引用指向子類對(duì)象
*/
FlyAble f = new FlyAble(){
public void fly() {
System.out.println("蕪湖,起飛!!??????");
}
};
//調(diào)用 fly方法,執(zhí)行重寫后的方法
f.fly();
}
}通常在方法的形式參數(shù)是接口或者抽象類時(shí),也可以將匿名內(nèi)部類作為參數(shù)傳遞。
代碼如下:
public class InnerDemo2 {
public static void main(String[] args) {
/**
1.等號(hào)右邊:是匿名內(nèi)部類,定義并創(chuàng)建該接口的子類對(duì)象
2.等號(hào)左邊:是多態(tài)賦值,接口類型引用指向子類對(duì)象
*/
FlyAble f = new FlyAble(){
public void fly() {
System.out.println("蕪湖,起飛?。??????");
}
};
// 將f傳遞給showFly方法中
showFly(f);
}
public static void showFly(FlyAble f) {
f.fly();
}
}以上兩步,也可以簡化為一步,代碼如下:
public class InnerDemo3 {
public static void main(String[] args) {
/**
創(chuàng)建匿名內(nèi)部類,直接傳遞給showFly(FlyAble f)
*/
showFly(new FlyAble(){
public void fly() {
System.out.println("蕪湖,起飛??!??????");
}
});
}
public static void showFly(FlyAble f) {
f.fly();
}
}執(zhí)行輸出如下:
蕪湖,起飛??!??????
到此這篇關(guān)于Java內(nèi)部類與匿名內(nèi)部類的文章就介紹到這了,更多相關(guān)Java匿名內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud客戶端的負(fù)載均衡Ribbon的實(shí)現(xiàn)
微服務(wù)架構(gòu),不可避免的存在單個(gè)微服務(wù)有多個(gè)實(shí)例,這篇文章主要介紹了SpringCloud客戶端的負(fù)載均衡Ribbon的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
spring boot 不連接數(shù)據(jù)庫啟動(dòng)的解決
這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫啟動(dòng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java創(chuàng)建多級(jí)目錄文件的實(shí)例講解
下面小編就為大家分享一篇java創(chuàng)建多級(jí)目錄文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
全解史上最快的JOSN解析庫alibaba Fastjson
這篇文章主要介紹了史上最快的JOSN解析庫alibaba Fastjson,對(duì)FastJson感興趣的同學(xué),一定要看一下2021-04-04
Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析
這篇文章主要介紹了Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析,對(duì)學(xué)習(xí)volatile關(guān)鍵字有一定的認(rèn)識(shí),有需要的可以了解一下。2016-11-11
org.springframework.dao.OptimisticLockingFailureException樂觀鎖
本文主要介紹了org.springframework.dao.OptimisticLockingFailureException樂觀鎖失敗的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Spring mvc Controller和RestFul原理解析
這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Spring Bean生命周期之Bean的實(shí)例化詳解
這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之Bean的實(shí)例化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

