溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java 中引入內(nèi)部類的作用是什么

發(fā)布時(shí)間:2021-05-10 16:05:39 來源:億速云 閱讀:202 作者:Leah 欄目:編程語言

這篇文章給大家介紹Java 中引入內(nèi)部類的作用是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

Java的優(yōu)點(diǎn)是什么

1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應(yīng)用程序;2. 面向?qū)ο螅?. 分布性,Java是面向網(wǎng)絡(luò)的語言;4. 魯棒性,java提供自動(dòng)垃圾收集來進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時(shí)容易產(chǎn)生的錯(cuò)誤。;5. 安全性,用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須防止病毒的入侵。6. 體系結(jié)構(gòu)中立,只要安裝了Java運(yùn)行時(shí)系統(tǒng),就可在任意處理器上運(yùn)行。7. 可移植性,Java可以方便地移植到網(wǎng)絡(luò)上的不同機(jī)器。8.解釋執(zhí)行,Java解釋器直接對(duì)Java字節(jié)碼進(jìn)行解釋執(zhí)行。

能不用內(nèi)部類就不用內(nèi)部類。

實(shí)踐

我以前覺得內(nèi)部類用來有針對(duì)性地暴露外部類的特定接口,比一下子把整個(gè)對(duì)象都給人家要好。比如說下面代碼中的外部類Outer實(shí)現(xiàn)了三個(gè)接口方法,能跑,能飛,能思考。然后有三個(gè)方法getRunner(),getFlyer(),getThinker()有針對(duì)性地對(duì)外暴露部分功能接口。

 public interface Runnable{ public void run(); } public interface Flyable{ public void fly(); } public interface Thinkable{ public void think(); } public class Outer{
 public void run(){ //do something } 
 public void fly(){ //do something }
 public void think(){ //do something } 
public class Runner implements Runnable{ 
public void run(){Outer.this.run();} } 
public class Flyer implements Flyable{ 
public void fly(){Outer.this.fly();} } 
public class Thinker implements Thinkable{ 
public void think(){Outer.this.think();} } 
public Runner getRunner(){return new Runner();} public Flyer getFlyer(){return new Flyer();} 
public Thinker getThinker(){return new Thinker();} }

但實(shí)際上直接實(shí)現(xiàn)三個(gè)接口不是就很好嘛。用內(nèi)部類根本算不上優(yōu)雅,多了很多代碼。僅僅為了暴露接口根本不需要使用內(nèi)部類。

public interface Runnable{ public void run(); } public interface Flyable{ public void fly(); } public interface Thinkable{ public void think(); } public class Outer implements,Runnable,Flyable,Thinkable{ 
public void run(){ //do something } 
public void fly(){ //do something } 
public void think(){ //do something } }

再或者說常見的控制框架。我們定義個(gè)Event接口,必須有action()方法。在外部類里定義事件處理的流程。然后定義了幾個(gè)實(shí)現(xiàn)Event接口的內(nèi)部類。

public interface Event{ public void action(); } public class Controller{ 
private int id; 
private List<Event> list=new ArrayList<Event>(); 
public void prepare(){ //put new events into the list } 
public void doEvents(){ //do every events in the list } 
public class A implements Event{ 
public void action(){ //do something } } 
public class B implements Event{ 
public void action(){ //do something } } }

但這也不是非內(nèi)部類不可。獨(dú)立定義A,B類,最后再把Event對(duì)象組合到Controller里完全可以,而且更簡潔易讀。

另外,說到內(nèi)部類,經(jīng)常會(huì)提到閉包,回調(diào)。但內(nèi)部類也不是唯一的方案。簡單的繼承,組合都能實(shí)現(xiàn)同等的數(shù)據(jù)封裝效果。

但Java到底需不需要內(nèi)部類?答案還是需要的。Java引入內(nèi)部類的真正意義就在于,還是有很多情況,沒有內(nèi)部類是處理不了的,或者用內(nèi)部類處理起來更加優(yōu)雅。

還是第一個(gè)例子。如果外部類不止有一種接口實(shí)現(xiàn)方法。如果我實(shí)現(xiàn)了Runnable接口,就只能定義一個(gè)run()方法。這時(shí)候內(nèi)部類就派用場(chǎng)了。比如,企鵝既會(huì)跑,又會(huì)游泳。所以它的兩個(gè)內(nèi)部類實(shí)現(xiàn)兩種不同的run()??梢苑祷貎煞N不同的Runnable引用。

public interface Runnable{ public void run(); } public class Penguin{ 
public void run(){ //do something } 
public void swim(){ //do something } 
public class Running implements Runnable{
 public void run(){Penguin.this.run();} } 
public class Swimming implements Runnable{ 
public void run(){Penguin.this.swim();} } 
public Runner getRunner(){return new Running();} public Flyer getSwimmer(){return new Swimming();} }

另一種典型場(chǎng)景就是多繼承。如果外部類已經(jīng)繼承了某個(gè)基類,比如說企鵝繼承自鳥類。但Runnable這時(shí)候正好是一個(gè)abstract抽象類呢?Java不支持多繼承,內(nèi)部類可以解決這個(gè)問題。

public class Bird{ //some code here } 
public abstract class Runnable{ 
public abstract void run(); } 
public class Penguin extends Bird{ 
public class Runner extends Runnable{ //do something } 
public Runner penguinCanRun(){return new Runner();} }

剛才提到了控制框架可以不用內(nèi)部類。但實(shí)際上你看看事件驅(qū)動(dòng)的Swing里到處都是內(nèi)部類。為什么呢?因?yàn)橛写罅康氖录?,而且多?shù)事件的相應(yīng)方法只被用到了一次。用內(nèi)部類是為了控制類的數(shù)量,考慮的是更好地封裝。

內(nèi)部類另外一個(gè)好的特性就是它獨(dú)立于外部類,不會(huì)像組合一樣隨著外部類的初始化而一起被初始化。而是在我們需要它的時(shí)候再創(chuàng)建它。比如說容器里的迭代器,需要我們手動(dòng)創(chuàng)建。作為可選組件存在于外部類中,不會(huì)增加外部類的負(fù)擔(dān)。

關(guān)于Java 中引入內(nèi)部類的作用是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI