來源:北大青鳥飛迅校區(qū)|發(fā)布時間:2013-04-26 17:45:19
Java內(nèi)部類問題,在這給大家分享一下。 在說之前,我先列出幾個問題:
1.外部類(非主類)通過怎樣的方式訪問內(nèi)部類?
2.內(nèi)部類能不能訪問主類私有的屬性,為什么?
3.內(nèi)部類能不能繼承別的類和接口?
4.內(nèi)部類能不能是static的?
5.在主類的方法里面可不可以定義內(nèi)部類?
6.初始化主類的時候是不是也把內(nèi)部類給初始化了?為什么?
7.怎樣寫一個匿名的內(nèi)部類?
我目前想到的就這些,在我給大家陳述之前,希望大家好好想想,再往下看:
第一個問題:外部類是怎樣引用內(nèi)部類的?這個問題,我想,可能有的人就會這樣寫:
這是內(nèi)部類:InnerClass.
1publicclassMainClass {
2
3 publicclassInnerClass{
4 publicString name="name";
5
6 publicString getName() {
7 returnname;
8 }
9
10 publicvoidsetName(String name) {
11 this.name=name;
12 }
13 }
14}
以下是引用:
1publicclassCheckClass {
2 publicstaticvoidmain(String[] args) {
3 InnerClass innerClass=newInnerClass();
4 System.out.println(innerClass.getName());
5 }
6}
如果這樣寫的話,會報編譯錯誤。那么為什么會報錯呢?因為在Java的設(shè)計中,如果想訪問一個類的內(nèi)部類,你必須通過宿主類去取它,然后,再對它進(jìn)行操作,Java就是想這樣把內(nèi)部類給封閉起來的,好吧,正確的寫法,我給大家貼出來:
以下是內(nèi)部類的寫法:
1publicclassMainClass {
2 publicInnerClass getInnerClass() {
3 returnnewInnerClass();
4 }
5
6 publicclassInnerClass {
7 publicString name="name";
8
9 publicString getName() {
10 returnname;
11 }
12
13 publicvoidsetName(String name) {
14 this.name=name;
15 }
16 }
17}
如果你想訪問Java內(nèi)部類,你必須先拿到它的宿主類,這樣你才能對內(nèi)部類進(jìn)行操作:
1 public class CheckClass {
2 public static void main(String[] args) {
3 MainClass mainClass = new MainClass();
4 System.out.println(mainClass.getInnerClass().getName());
5 }
6 }
這樣的話,編譯就不會報錯了。
好了,該回答第二個問題了,就是內(nèi)部類能不能訪問宿主類的私有屬性?回答是可以的。如果,你會看JVM的源碼的話,你就會看到,在編譯內(nèi)部類調(diào)用主類私有變量時,會把它們轉(zhuǎn)換成一種特殊的符號,JVM會把這種符號解析成公有的,然后讓內(nèi)部類調(diào)用。代碼很簡單,我就不貼了。
全程面授,不高薪都難
申請成功后,我們將在24小時內(nèi)與您聯(lián)系
招生熱線: 4008-0731-86 / 0731-82186801
學(xué)校地址: 長沙市天心區(qū)團結(jié)路6號
Copyright © 2006 | 湖南大計信息科技有限公司 版權(quán)所有
湘ICP備14017520號-3