java什么内部类_Java的内部类学习
1.匿名內(nèi)部類
匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創(chuàng)建時(shí),作為new語句的一部分來聲明它們。這就要采用另一種形式的new語句,如下所示: new 這種形式的new語句聲明一個(gè)新的匿名類,它對一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。它還創(chuàng)建那個(gè)類的一個(gè)新實(shí)例,并把它作為語句的結(jié)果而返回。要擴(kuò)展的類和要實(shí)現(xiàn)的接口是new語句的操作數(shù),后跟匿名類的主體。如果匿名類對另一個(gè)類進(jìn)行擴(kuò)展,它的主體可以訪問類的成員、覆蓋它的方法等等,這和其他任何標(biāo)準(zhǔn)的類都是一樣的。如果匿名類實(shí)現(xiàn)了一個(gè)接口,它的主體必須實(shí)現(xiàn)接口的方法。
匿名內(nèi)部類的注意事項(xiàng)
注意匿名類的聲明是在編譯時(shí)進(jìn)行的,實(shí)例化在運(yùn)行時(shí)進(jìn)行。這意味著for循環(huán)中的一個(gè)new語句會創(chuàng)建相同匿名類的幾個(gè)實(shí)例,而不是創(chuàng)建幾個(gè)不同匿名類的一個(gè)實(shí)例。
在使用匿名內(nèi)部類時(shí),要記住以下幾個(gè)原則:
·匿名內(nèi)部類不能有構(gòu)造方法。
·匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類。
·匿名內(nèi)部類不能是public,protected,private,static。
·只能創(chuàng)建匿名內(nèi)部類的一個(gè)實(shí)例。
·一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類。
·因匿名內(nèi)部類為局部內(nèi)部類,所以局部內(nèi)部類的所有限制都對其生效。
·內(nèi)部類只能訪問外部類的靜態(tài)變量或靜態(tài)方法。
1
2 interfaceNoNameClass {3
4 voidprint();5
6 }7
8
9 classNoInnerClass {10
11
12 publicNoNameClass show() {13
14 return newNoNameClass() {15
16
17 @Override18
19 public voidprint() {20
21 System.out.println("hello world");22
23 }24
25 };26
27 }28
29 }30
31
32 public classNoNameInnerClass {33
34 public static voidmain(String[] args) {35
36 NoInnerClass innerClass = newNoInnerClass();37
38 innerClass.show().print();39
40 }41
42 }
2.靜態(tài)內(nèi)部類(嵌套類)(只有內(nèi)部類才能定義為staticclass)
靜態(tài)內(nèi)部類只能調(diào)用外部類的靜態(tài)變量和靜態(tài)方法
靜態(tài)內(nèi)部類中可以定義靜態(tài)或者非靜態(tài)的成員
1 classInnerClass {2
3 private static int a=7;4
5 public static voidshow()6
7 {8
9 System.out.println("show");10
11 }12
13 public static classstaticInner{14
15
16 public voidinfo()17
18 {19
20 System.out.println(a);21
22 show();23
24 }25
26 }27
28 }29
30
31 public classInnerClassTest32
33 {34
35 public static voidmain(String[] args) {36
37 InnerClass.staticInner innerClass=newInnerClass.staticInner();38
39 innerClass.info();40
41 }42
43 }
3.局部內(nèi)部類
成員內(nèi)部類可以調(diào)用外部類的靜態(tài)和非靜態(tài)變量和方法
但是成員內(nèi)部類內(nèi)部不能定義static?方法
1 classLocalClass {2
3 private int a = 1;4
5 private static int b = 2;6
7 voidinfo() {8
9 final int c = 4;10
11 classInner {12
13 int a = 3;14
15
16 voidprint() {17
18 System.out.println(a);//內(nèi)部類的變量
19
20 System.out.println(LocalClass.this.a);//外部類變量
21
22 System.out.println(b);//外部類的靜態(tài)變量
23
24 System.out.println(c);//只能訪問方法內(nèi)部的final變量
25
26 }27
28 }29
30 newInner().print();31
32 }33
34 }35
36
37 public classLocalInnerClass {38
39 public static voidmain(String[] args) {40
41 newLocalClass().info();42
43 }44
45 }
4.成員內(nèi)部類
成員內(nèi)部類可以調(diào)用外部類的靜態(tài)和非靜態(tài)變量和方法
但是成員內(nèi)部類內(nèi)部不能定義static?方法
classMemberClass {private int a = 2;private static int b = 3;private static voidshow() {
System.out.println("show");
}classInnerMember {private int a = 45;voidinfo() {
System.out.println(b);
System.out.println(a);//就近原則,a為當(dāng)前作用域內(nèi)的變量得不到外部類的a
System.out.println(MemberClass.this.a);//這樣可以訪問外部類的重名變量
show();
}
}
}public classMemberInnerClass {public static voidmain(String[] args) {
MemberClass.InnerMember innerMember= new MemberClass().new InnerMember();//有人會疑惑為什么和靜態(tài)內(nèi)部類實(shí)例化的時(shí)候不一樣呢//這是因?yàn)殪o態(tài)內(nèi)部類就像靜態(tài)方法一樣是屬于類的,而成員內(nèi)部類是屬于對象的,所以要
new MemberClass().newInnerMember()得到每個(gè)對象關(guān)于innerMember的實(shí)例對象
innerMember.info();
}
}
總結(jié)
以上是生活随笔為你收集整理的java什么内部类_Java的内部类学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java object monitor_
- 下一篇: 计算机中page up键有什么用