本文實例講述了java內部類原理與用法。分享給大家供大家參考,具體如下:
一、非靜態(tài)內部類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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)內部類 class innerclass { // 2.0非靜態(tà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內部類做為外部類的實例成員,可以隨意訪問其他外部類成員 system.out.println(outclass. this .name); } } public static void main(string[] args) { outclass out = new outclass(); out.show(); out.innershow(); // 1.0下面一行編譯報錯,靜態(tài)方法無法訪問this指針 // 因為等同于this.innerclass inner=new this.innerclass(); // innerclass inner=new innerclass(); } } |
運行結果:
outclass
innerclass
outclass
1.外部類不能直接訪問非靜態(tài)內部類,必須在外部類中保存內部類的引用間接訪問。
2.非靜態(tài)內部類中不能有靜態(tài)屬性。
個人理解:非靜態(tài)內部類是外部類的實例成員,它屬于外部類的實例對象所擁有,若內部類有靜態(tài)屬性,那么屬性必定屬于內部類所有,即所有的內部類實例對象都共享這個屬性。但是這個內部類已經(jīng)屬于外部類的實例對象所擁有了,貌似是1:1的關系,除非外部類的對象保存了n多份內部類實例的引用,那這樣內部類的靜態(tài)屬性才有存在的必要,可這么做就沒有什么意義了。
3.非靜態(tài)內部類可以隨意訪問外部類的成員,因為它們都是外部類的成員,等級一樣。
4.若要得到內部類的實例,可以
1
|
outclass.innerclass inner= new outclass(). new innerclass(); |
二、靜態(tài)內部類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class outclass { private string name = "outclass" ; private static int age = 10 ; // 靜態(tà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(); } } |
運行結果:
10
outclass
1.靜態(tài)內部類不能隨意訪問外部類的實例成員,必須引用外部類的對象。
2.靜態(tài)內部類可以隨意訪問外部類的類成員。
3.若要獲取靜態(tài)內部類的實例,則形式如
1
|
outclass.innerclass inner= new outclass.innerclass(); |
注意與非靜態(tài)內部類獲取實例的區(qū)別:
1
|
outclass.innerclass inner= new outclass(). new innerclass(); |
三、局部類
1.匿名內部類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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..." ); } }); } } |
運行結果:
i'm drawing...
在調用多態(tài)形式的方法createcircle(idraw obj)
時,參數(shù)用到了new idraw(){ }
,做為接口來說是不能直接實例化的,這里的new idraw()
并不是直接實例化,而是創(chuàng)建了匿名內部類。
2.閉包與回調
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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(); } } |
運行結果:
private name
內部類可以像其他類一樣靈活的實現(xiàn)各種接口和繼承,并且可以將外部類的屬性和方法綁定到自身中,形成閉包。而在外部類中提供了方法供外界獲取內部類的引用,因為內部類的方法靈活的訪問了外部類的許多信息,甚至是私有信息,獲得了這個對象后可以反過來調用外部類的方法和函數(shù)形成回調。
其實上面只是有閉包的形式,并不算是真正的閉包,閉包的定義里主要是綁定方法里的變量,但是java是無法實現(xiàn)方法里的內部類還能訪問方法變量的,因為無法實現(xiàn)真正的閉包。
java內部類有許多用處,比如利用內部類實現(xiàn)多個接口可以模擬多繼承;比如讓內部類成為輔助外部類的工具類,來幫助外部類實現(xiàn)更好的邏輯與擴展。
希望本文所述對大家java程序設計有所幫助。
原文鏈接:https://blog.csdn.net/kkkkkxiaofei/article/details/17957669