Java語言基礎:內部類

來源:互聯網
上載者:User

 

1.  普通內部類
  • 普通內部類的一個最簡單的例子:
// 外部類<br />class OutterClass {<br /> // 內部類<br /> public class InnerClass {<br /> private int i = 0;<br /> public int getInt(){<br /> return i;<br /> }<br /> }<br /> public void proc(){<br /> InnerClass inClass = new InnerClass();<br /> System.out.println(inClass.getInt());<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> outClass.proc();<br /> }<br />} 
  • 外部類可以訪問內部類的私人成員,內部類也可以訪問外部類的私人成員:
// 外部類<br />class OutterClass {<br /> private int mOut = 10;<br /> // 內部類<br /> public class InnerClass {<br /> private int mIn = 0;<br /> public void printOutPrivate(){<br /> // 直接列印外部類的成員<br /> System.out.println(mOut);<br /> }<br /> }<br /> public void printInPrivate(){<br /> InnerClass inClass = new InnerClass();<br /> // 直接列印內部類的私人成員<br /> System.out.println(inClass.mIn);<br /> }<br /> public void printOutPrivate(){<br /> InnerClass inClass = new InnerClass();<br /> inClass.printOutPrivate();<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> outClass.printInPrivate();<br /> outClass.printOutPrivate();<br /> }<br />} 
  • 如果外部類的成員變數與內部類的成員變數名字相同,當內部類要訪問外部類的該成員時,可以使用“OutClass.this.mem”來區分:
// 外部類<br />class OutterClass {<br /> private int mMem = 10;<br /> // 內部類<br /> public class InnerClass {<br /> private int mMem = 0;<br /> public void printOutPrivate(){<br /> // 直接列印外部類的成員<br /> System.out.println(OutterClass.this.mMem);<br /> }<br /> }<br />} 
  • 要建立普通內部類,必須先建立相應的外部類:
// 外部類<br />class OutterClass {<br /> private int mMem = 10;<br /> // 內部類<br /> public class InnerClass {<br /> private int mMem = 0;<br /> public void printOutPrivate(){<br /> // 直接列印外部類的成員<br /> System.out.println(OutterClass.this.mMem);<br /> }<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> OutterClass.InnerClass inClass = outClass.new InnerClass();<br /> inClass.printOutPrivate();<br /> }<br />} 也可以用下面的方式:
// 外部類<br />class OutterClass {<br /> private int mMem = 10;<br /> // 內部類<br /> public class InnerClass {<br /> private int mMem = 0;<br /> public void printOutPrivate(){<br /> // 直接列印外部類的成員<br /> System.out.println(OutterClass.this.mMem);<br /> }<br /> }<br /> public InnerClass newInnerClass() {<br /> return new InnerClass();<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> OutterClass.InnerClass inClass = outClass.newInnerClass();<br /> inClass.printOutPrivate();<br /> }<br />} 
2.  靜態內部類
普通內部類前面加上static修飾符,就成為靜態內部類,靜態內部類類似於C++的嵌套類,與普通內部類相比有如下區別:
  • 靜態內部類沒有指向外部類的引用,外部類對於它來說更像一個名字空間。
  • 普通內部類不能有靜態成員,靜態方法,或另一個靜態內部類;而靜態內部類可以有這一切。
  • 靜態內部類可以直接建立,不必先建立外部類:
// 外部類<br />class OutterClass {<br /> private int mMem = 0;<br /> // 靜態內部類<br /> static public class InnerClass {<br /> private int mMem = 0;<br /> public void printOutPrivate(){<br /> // 這是錯誤的<br /> // System.out.println(OutterClass.this.mMem);<br /> }<br /> }<br /> public void printInPrivate() {<br /> InnerClass inClass = new InnerClass();<br /> // 可以直接存取靜態內部類的成員<br /> System.out.println(inClass.mMem);<br /> }<br />}<br />public class Main {<br /> public static void main(String[] args) {<br /> // 直接建立靜態內部類<br /> OutterClass.InnerClass inClass = new OutterClass.InnerClass();<br /> inClass.printOutPrivate();<br /> }<br />} 
從上面描述可以看出,靜態內部類與一般類沒有太大區別,只不過它是放在一個類的裡面,這個類相當於它的名字空間,可以防止命名衝突。
3.  局部內部類
Java可以把一個類定義在一個方法裡面,甚至是一個{}塊裡面,它的範圍就在這個塊裡面: // 外部類<br />class OutterClass {<br /> public void testLocalInner() {<br /> if (true)<br /> {<br /> class LocalInner {<br /> public void proc() {<br /> System.out.println("hello");<br /> }<br /> }<br /> // 可以建立使用<br /> LocalInner localInner = new LocalInner();<br /> localInner.proc();<br /> }<br /> // 錯誤:超出類定義的範圍<br /> LocalInner localInner = new LocalInner();<br /> localInner.proc();<br /> }<br />} 局部內部類的一般用途是實現某個介面,並作為這個介面傳出方法被使用: // 介面<br />interface Talker {<br /> public void Talk();<br />}</p><p>// 外部類<br />class OutterClass {<br /> public Talker getTalker() {<br /> // 現實該介面的局部內部類<br /> class SomeTalker implements Talker {<br /> public void Talk() {<br /> System.out.println("hello");<br /> }<br /> }<br /> // 建立類執行個體並作為Talker返回<br /> SomeTalker talker = new SomeTalker();<br /> return talker;<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> Talker talker = outClass.getTalker();<br /> talker.Talk();<br /> }<br />} 
4.  匿名內部類
匿名內部類的文法如下: new InterfaceName(){......}; 或 new SuperclassName(){......};   它被認為是InterfaceName的實現者,或是SuperclassName的繼承類,匿名內部類沒有構建函數,如果SuperclassName有帶參數的建構函式,必須在建立匿名內部類時帶上這些參數,下面是匿名內部類最常見的使用場合: // 介面<br />interface Talker {<br /> public void Talk();<br />}</p><p>// 外部類<br />class OutterClass {<br /> public void Talk(Talker talker) {<br /> talker.Talk();<br /> }<br />}</p><p>public class Main {<br /> public static void main(String[] args) {<br /> OutterClass outClass = new OutterClass();<br /> // 直接產生一個匿名內部類<br /> outClass.Talk(new Talker(){<br /> public void Talk() {<br /> System.out.println("hello");<br /> }<br /> });<br /> }<br />} 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.