Java內(nèi)部類原理與用法實(shí)例總結(jié)
本文實(shí)例講述了Java內(nèi)部類原理與用法。分享給大家供大家參考,具體如下:
一、非靜態(tài)內(nèi)部類
public class OutClass { private String name = "outclass"; public void show() { System.out.println(this.name); } public void innerShow() { InnerClass inner = new InnerClass(); inner.show(); inner.outShow(); } // 非靜態(tài)內(nèi)部類 class InnerClass { // 2.0非靜態(tài)內(nèi)部類不能有靜態(tài)變量的聲明 // public static int age=0; private String name = "innerclass"; public void show() { System.out.println(this.name); } public void outShow() { // 3.0內(nèi)部類做為外部類的實(shí)例成員,可以隨意訪問其他外部類成員 System.out.println(OutClass.this.name); } } public static void main(String[] args) { OutClass out = new OutClass(); out.show(); out.innerShow(); // 1.0下面一行編譯報(bào)錯,靜態(tài)方法無法訪問this指針 // 因?yàn)榈韧趖his.InnerClass inner=new this.InnerClass(); // InnerClass inner=new InnerClass(); } }
運(yùn)行結(jié)果:
outclass
innerclass
outclass
1.外部類不能直接訪問非靜態(tài)內(nèi)部類,必須在外部類中保存內(nèi)部類的引用間接訪問。
2.非靜態(tài)內(nèi)部類中不能有靜態(tài)屬性。
個人理解:非靜態(tài)內(nèi)部類是外部類的實(shí)例成員,它屬于外部類的實(shí)例對象所擁有,若內(nèi)部類有靜態(tài)屬性,那么屬性必定屬于內(nèi)部類所有,即所有的內(nèi)部類實(shí)例對象都共享這個屬性。但是這個內(nèi)部類已經(jīng)屬于外部類的實(shí)例對象所擁有了,貌似是1:1的關(guān)系,除非外部類的對象保存了n多份內(nèi)部類實(shí)例的引用,那這樣內(nèi)部類的靜態(tài)屬性才有存在的必要,可這么做就沒有什么意義了。
3.非靜態(tài)內(nèi)部類可以隨意訪問外部類的成員,因?yàn)樗鼈兌际峭獠款惖某蓡T,等級一樣。
4.若要得到內(nèi)部類的實(shí)例,可以
OutClass.InnerClass inner=new OutClass().new InnerClass();
二、靜態(tài)內(nèi)部類
public class OutClass { private String name = "outclass"; private static int age = 10; // 靜態(tài)內(nèi)部類 static class InnerClass { public void show() { // 1.0 System.out.println(new OutClass().name); } public void outShow() { // 2.0 System.out.println(age); } } public static void main(String[] args) { // 3.0 OutClass.InnerClass inner = new OutClass.InnerClass(); inner.outShow(); inner.show(); } }
運(yùn)行結(jié)果:
10
outclass
1.靜態(tài)內(nèi)部類不能隨意訪問外部類的實(shí)例成員,必須引用外部類的對象。
2.靜態(tài)內(nèi)部類可以隨意訪問外部類的類成員。
3.若要獲取靜態(tài)內(nèi)部類的實(shí)例,則形式如
OutClass.InnerClass inner=new OutClass.InnerClass();
注意與非靜態(tài)內(nèi)部類獲取實(shí)例的區(qū)別:
OutClass.InnerClass inner=new OutClass().new InnerClass();
三、局部類
1.匿名內(nèi)部類
interface IDraw { void draw(); } public class OutClass { public void createCircle(IDraw obj) { obj.draw(); } public static void main(String[] args) { OutClass out = new OutClass(); out.createCircle(new IDraw() { public void draw() { System.out.println("i'm drawing..."); } }); } }
運(yùn)行結(jié)果:
i'm drawing...
在調(diào)用多態(tài)形式的方法createCircle(IDraw obj)
時,參數(shù)用到了new IDraw(){ }
,做為接口來說是不能直接實(shí)例化的,這里的new IDraw()
并不是直接實(shí)例化,而是創(chuàng)建了匿名內(nèi)部類。
2.閉包與回調(diào)
interface IDraw { void draw(); } public class OutClass { private String name = "private name"; public Closure getClosure() { return new Closure(); } class Closure implements IDraw { public void draw() { System.out.println(OutClass.this.name);// name } } public static void main(String[] args) { OutClass out = new OutClass(); out.getClosure().draw(); } }
運(yùn)行結(jié)果:
private name
內(nèi)部類可以像其他類一樣靈活的實(shí)現(xiàn)各種接口和繼承,并且可以將外部類的屬性和方法綁定到自身中,形成閉包。而在外部類中提供了方法供外界獲取內(nèi)部類的引用,因?yàn)閮?nèi)部類的方法靈活的訪問了外部類的許多信息,甚至是私有信息,獲得了這個對象后可以反過來調(diào)用外部類的方法和函數(shù)形成回調(diào)。
其實(shí)上面只是有閉包的形式,并不算是真正的閉包,閉包的定義里主要是綁定方法里的變量,但是java是無法實(shí)現(xiàn)方法里的內(nèi)部類還能訪問方法變量的,因?yàn)闊o法實(shí)現(xiàn)真正的閉包。
java內(nèi)部類有許多用處,比如利用內(nèi)部類實(shí)現(xiàn)多個接口可以模擬多繼承;比如讓內(nèi)部類成為輔助外部類的工具類,來幫助外部類實(shí)現(xiàn)更好的邏輯與擴(kuò)展。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
javaweb中ajax請求后臺servlet(實(shí)例)
下面小編就為大家?guī)硪黄猨avaweb中ajax請求后臺servlet(實(shí)例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06IDEA中Spring項(xiàng)目的工程構(gòu)建
這篇文章主要介紹了IDEA中Spring項(xiàng)目的工程構(gòu)建,Spring框架是輕量級的JavaEE框架,可以解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性,有兩個核心部分:IOC和Aop,今天來學(xué)習(xí)如何構(gòu)建spring項(xiàng)目,需要的朋友可以參考下2023-05-05Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解
這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解,在使用Netty進(jìn)行TCP消息傳輸時,為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導(dǎo)致的問題,一般可以通過消息定長、將回車換行符作為消息結(jié)束符,需要的朋友可以參考下2023-12-12Spring Boot 集成Shiro的多realm配置過程
這篇文章主要介紹了Spring Boot 集成Shiro的多realm配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10