本文實(shí)例講述了java內(nèi)部類(lèi)原理、概述與用法。分享給大家供大家參考,具體如下:
內(nèi)部類(lè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
|
/* 內(nèi)部類(lèi)概述: 把類(lèi)定義在其他類(lèi)的內(nèi)部,這個(gè)類(lèi)就被稱為內(nèi)部類(lèi)。 舉例:在類(lèi)a中定義了一個(gè)類(lèi)b,類(lèi)b就是內(nèi)部類(lèi)。 內(nèi)部的訪問(wèn)特點(diǎn): a:內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的成員,包括私有。 b:外部類(lèi)要訪問(wèn)內(nèi)部類(lèi)的成員,必須創(chuàng)建對(duì)象。 */ class outer { private int num = 10 ; class inner { public void show() { //內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的成員,包括私有。 system.out.println(num); } } public void method() { //找不到符號(hào) //show(); //外部類(lèi)要訪問(wèn)內(nèi)部類(lèi)的成員,必須創(chuàng)建對(duì)象。 inner i = new inner(); i.show(); } } class innerclassdemo { public static void main(string[] args) { } } |
內(nèi)部類(lèi)位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/* 內(nèi)部類(lèi)位置 成員位置:在成員位置定義的類(lèi),被稱為成員內(nèi)部類(lèi)。 局部位置:在局部位置定義的類(lèi),被稱為局部?jī)?nèi)部類(lèi)。 成員位置:在成員位置定義的類(lèi),被稱為成員內(nèi)部類(lèi)。 */ class outer { private int num = 10; //成員位置 /* class inner { } */ public void method() { //局部位置 class inner { } } } class innerclassdemo2 { public static void main(string[] args) { } } |
如何直接訪問(wèn)成員內(nèi)部類(lèi)的成員
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/* 成員內(nèi)部類(lèi): 如何直接訪問(wèn)內(nèi)部類(lèi)的成員。 外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)對(duì)象.內(nèi)部類(lèi)對(duì)象; */ class outer { private int num = 10 ; class inner { public void show() { system.out.println(num); } } } class innerclassdemo3 { public static void main(string[] args) { //需求:我要訪問(wèn)inner類(lèi)的show()方法 //格式:外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)對(duì)象.內(nèi)部類(lèi)對(duì)象; outer.inner oi = new outer(). new inner(); oi.show(); } } |
成員內(nèi)部類(lè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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
/* 成員內(nèi)部類(lèi)的修飾符: private 為了保證數(shù)據(jù)的安全性 static 為了方便訪問(wèn)數(shù)據(jù) 注意:靜態(tài)內(nèi)部類(lèi)訪問(wèn)的外部類(lèi)數(shù)據(jù)必須用靜態(tài)修飾。 案例:我有一個(gè)人(人有身體,身體內(nèi)有心臟。) class body { private class heart { public void operator() { system.out.println("心臟搭橋"); } } public void method() { if(如果你是外科醫(yī)生) { heart h = new heart(); h.operator(); } } } 按照我們剛才的講解,來(lái)使用一下 body.heart bh = new body().new heart(); bh.operator(); //加了private后,就不能被訪問(wèn)了,那么,怎么玩呢? body b = new body(); b.method(); */ class outer { private int num = 10 ; private static int num2 = 100 ; //內(nèi)部類(lèi)用靜態(tài)修飾是因?yàn)閮?nèi)部類(lèi)可以看出是外部類(lèi)的成員 public static class inner { public void show() { //system.out.println(num); system.out.println(num2); } public static void show2() { //system.out.println(num);//報(bào)錯(cuò)。靜態(tài)內(nèi)部類(lèi)訪問(wèn)的外部類(lèi)數(shù)據(jù)必須用靜態(tài)修飾。 system.out.println(num2); } } } class innerclassdemo4 { public static void main(string[] args) { //使用內(nèi)部類(lèi) // 限定的新靜態(tài)類(lèi) //outer.inner oi = new outer().new inner();//這個(gè)訪問(wèn)方式錯(cuò)誤 //oi.show(); //oi.show2(); //成員內(nèi)部類(lèi)被靜態(tài)修飾后的訪問(wèn)方式是: //格式:外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = new 外部類(lèi)名.內(nèi)部類(lèi)名(); outer.inner oi = new outer.inner(); oi.show(); oi.show2(); //show2()的另一種調(diào)用方式。因?yàn)殪o態(tài)方法,可以通過(guò)類(lèi)名調(diào)用。 outer.inner.show2(); } } |
內(nèi)部類(lèi)和外部類(lèi)沒(méi)有繼承關(guān)系。
通過(guò)外部類(lèi)名限定this對(duì)象
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
|
/* 案例: 要求請(qǐng)?zhí)羁辗謩e輸出30,20,10。 注意: 1:內(nèi)部類(lèi)和外部類(lèi)沒(méi)有繼承關(guān)系。 2:通過(guò)外部類(lèi)名限定this對(duì)象 outer.this */ class outer { public int num = 10 ; class inner { public int num = 20 ; public void show() { int num = 30 ; system.out.println(num); system.out.println( this .num); //system.out.println(new outer().num); system.out.println(outer. this .num); } } } class innerclasstest { public static void main(string[] args) { outer.inner oi = new outer(). new inner(); oi.show(); } } |
局部位置的內(nèi)部類(lèi)訪問(wèn)局部變量問(wèn)題
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
33
34
35
36
|
/* 局部?jī)?nèi)部類(lèi) a:可以直接訪問(wèn)外部類(lèi)的成員 b:在局部位置,可以創(chuàng)建內(nèi)部類(lèi)對(duì)象,通過(guò)對(duì)象調(diào)用內(nèi)部類(lèi)方法,來(lái)使用局部?jī)?nèi)部類(lèi)功能 注意事項(xiàng): 局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量的注意事項(xiàng)? a:局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量必須用final修飾 b:為什么呢? 局部變量是隨著方法的調(diào)用而調(diào)用,隨著調(diào)用完畢而消失。 而堆內(nèi)存inner的內(nèi)容并不會(huì)立即消失。所以,我們加final修飾。 加入final修飾后,這個(gè)變量就成了常量。既然是常量。你消失了。 我在內(nèi)存中存儲(chǔ)的是數(shù)據(jù)20,所以,我還是有數(shù)據(jù)在使用。 */ class outer { private int num = 10 ; public void method() { //int num2 = 20; final int num2 = 20 ; //局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量必須用final修飾 class inner { public void show() { system.out.println(num); //從內(nèi)部類(lèi)中訪問(wèn)本地變量num2; 需要被聲明為最終類(lèi)型 system.out.println(num2); //20 } } //system.out.println(num2); inner i = new inner(); i.show(); } } class innerclassdemo5 { public static void main(string[] args) { outer o = new outer(); o.method(); } } |
匿名內(nèi)部類(lèi)格式,方法調(diào)用
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
33
34
35
36
|
/* 匿名內(nèi)部類(lèi) 就是內(nèi)部類(lèi)的簡(jiǎn)化寫(xiě)法。 前提:存在一個(gè)類(lèi)或者接口 這里的類(lèi)可以是具體類(lèi)也可以是抽象類(lèi)。 格式: new 類(lèi)名或者接口名(){ 重寫(xiě)方法; } 本質(zhì)是什么呢? 是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)的匿名對(duì)象。 */ interface inter { public abstract void show(); public abstract void show2(); } class outer { public void method() { inter i = new inter() { //多態(tài) public void show() { system.out.println( "show" ); } public void show2() { system.out.println( "show2" ); } }; i.show(); //是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)的匿名對(duì)象。所以可以調(diào)用方法 i.show2(); } } class innerclassdemo6 { public static void main(string[] args) { outer o = new outer(); o.method(); } } |
匿名內(nèi)部類(lèi)在開(kāi)發(fā)中的使用
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
33
34
35
36
37
38
39
40
41
42
|
/* 匿名內(nèi)部類(lèi)在開(kāi)發(fā)中的使用 */ interface person { public abstract void study(); } class persondemo { //接口名作為形式參數(shù) //其實(shí)這里需要的不是接口,而是該接口的實(shí)現(xiàn)類(lèi)的對(duì)象 public void method(person p) { p.study(); } } //實(shí)現(xiàn)類(lèi) class student implements person { public void study() { system.out.println( "好好學(xué)習(xí),天天向上" ); } } class innerclasstest2 { public static void main(string[] args) { //測(cè)試 persondemo pd = new persondemo(); person p = new student(); pd.method(p); system.out.println( "--------------------" ); //匿名內(nèi)部類(lèi)在開(kāi)發(fā)中的使用 //匿名內(nèi)部類(lèi)的本質(zhì)是繼承類(lèi)或者實(shí)現(xiàn)了接口的子類(lèi)匿名對(duì)象 //用完一次就消失 person ss = new person(){ public void study() { system.out.println( "好好學(xué)習(xí),天天向上" ); } }; pd.method(ss); // pd.method(new person(){ // public void study() { // system.out.println("好好學(xué)習(xí),天天向上"); // } // }); } } |
案例
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
33
34
35
36
37
|
/* 案例: 按照要求,補(bǔ)齊代碼 interface inter { void show(); } class outer { //補(bǔ)齊代碼 } class outerdemo { public static void main(string[] args) { outer.method().show(); } } 要求在控制臺(tái)輸出”helloworld” */ interface inter { void show(); //記得默認(rèn)有 public abstract } class outer { //補(bǔ)齊代碼 public static inter method() { //子類(lèi)對(duì)象 -- 子類(lèi)匿名對(duì)象 return new inter() { public void show() { system.out.println("helloworld"); } }; } } class outerdemo { public static void main(string[] args) { outer.method().show(); /* 1:outer.method()可以看出method()應(yīng)該是outer中的一個(gè)靜態(tài)方法。 2:outer.method().show()可以看出method()方法的返回值是一個(gè)對(duì)象。 又由于接口inter中有一個(gè)show()方法,所以我認(rèn)為method()方法的返回值類(lèi)型是一個(gè)接口。 */ } } |
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
原文鏈接:https://www.cnblogs.com/baiyangyuanzi/p/6831624.html