來源:北大青鳥飛迅校區(qū)|發(fā)布時(shí)間:2013-04-26 17:45:19
Java內(nèi)部類問題,在這給大家分享一下。 在說之前,我先列出幾個(gè)問題:
1.外部類(非主類)通過怎樣的方式訪問內(nèi)部類?
2.內(nèi)部類能不能訪問主類私有的屬性,為什么?
3.內(nèi)部類能不能繼承別的類和接口?
4.內(nèi)部類能不能是static的?
5.在主類的方法里面可不可以定義內(nèi)部類?
6.初始化主類的時(shí)候是不是也把內(nèi)部類給初始化了?為什么?
7.怎樣寫一個(gè)匿名的內(nèi)部類?
我目前想到的就這些,在我給大家陳述之前,希望大家好好想想,再往下看:
第一個(gè)問題:外部類是怎樣引用內(nèi)部類的?這個(gè)問題,我想,可能有的人就會(huì)這樣寫:
這是內(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}
如果這樣寫的話,會(huì)報(bào)編譯錯(cuò)誤。那么為什么會(huì)報(bào)錯(cuò)呢?因?yàn)樵贘ava的設(shè)計(jì)中,如果想訪問一個(gè)類的內(nèi)部類,你必須通過宿主類去取它,然后,再對(duì)它進(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)部類,你必須先拿到它的宿主類,這樣你才能對(duì)內(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 }
這樣的話,編譯就不會(huì)報(bào)錯(cuò)了。
好了,該回答第二個(gè)問題了,就是內(nèi)部類能不能訪問宿主類的私有屬性?回答是可以的。如果,你會(huì)看JVM的源碼的話,你就會(huì)看到,在編譯內(nèi)部類調(diào)用主類私有變量時(shí),會(huì)把它們轉(zhuǎn)換成一種特殊的符號(hào),JVM會(huì)把這種符號(hào)解析成公有的,然后讓內(nèi)部類調(diào)用。代碼很簡單,我就不貼了。
全程面授,不高薪都難
申請(qǐng)成功后,我們將在24小時(shí)內(nèi)與您聯(lián)系
招生熱線: 4008-0731-86 / 0731-82186801
學(xué)校地址: 長沙市天心區(qū)團(tuán)結(jié)路6號(hào)
Copyright © 2006 | 湖南大計(jì)信息科技有限公司 版權(quán)所有
湘ICP備14017520號(hào)-3