對於Java內部類,大家實際上了解不多。在這裏我們以實際代碼的形式,爲大家詳細介紹Java內部類在GUI設計的作用。
Java 內部類其實在J2EE編程中使用較少, 不過在窗口應用編程中特別常見,主要用來事件的處理。其實,做非GUI編程,內部類完全可以不用。
內部類的聲明、訪問控制等於外部類有所不同,要靈活使用內部類來編寫程序,還是有相當難度的,Java發明了這種難懂的玩意兒,在其他語言中是沒有 的,但是在Java中,內部類也相當的重要,尤其做GUI開發時候,事件的響應處理全靠內部類了。
內部類所做的功能使用外部類也同樣可以實現,只是有時候內部類做的更巧妙些。
內部類按照其所在位置不同,可分爲以下幾種:
1、(普通的)內部類(最常見的內部類,內部類的定義與類成員平級,)
2、方法內部類
3、匿名類
4、靜態內部類
5、接口內部類
一、內部類聲明與訪問
1、內部類直接在類的內部進行聲明。可以聲明爲private、protected、public或者默認訪問權限,這個訪問權限約定和外部類完全 一樣。
2、內部類自動擁有對其外圍類所有成員(方法、屬性)的訪問權。如果內部類和外部類成員的名字完全相同,在內部類方法中要訪問外部類成員,則需要使 用下面的方式來訪問:外部類名.this.外部成員名,例如Outer.this.i++; (看例子)
3、必須使用外部類對象來創建內部類對象,而不是直接去new一個。
格式爲:外部對象名.new 內部類構造方法
比如要創建一個內部類iner對象,需要這麼做:
- Outer outer = new Outer();
- Outer.Inner iner = outer. new Inner();
- /**
- * 內部類創建與初始化
- *
- * @author leizhimin 2009-7-17 13:51:52
- */
- public class Outer {
- private int i = 10 ;
- private int y = 8 ;
- Outer() {
- System.out.println( "調用Outer構造方法:outer" );
- }
- public void sayMsg() {
- System.out.println( "Outer class!" );
- }
- class Inner {
- int i = 1000 ;
- Inner() {
- System.out.println( "調用Inner構造方法:inner" );
- }
- void innerMsg() {
- System.out.println( ">>>>>Inner class!" );
- sayMsg();
- //訪問內部類自己的成員i,也可以寫成 this.i++
- this .i++;
- //訪問外部類的成員 i和y
- Outer. this .i++;
- y--;
- }
- int getI() {
- return i;
- }
- }
- public void test() {
- Inner in = new Inner();
- in.innerMsg();
- }
- public int getI() {
- return i;
- }
- public void setI( int i) {
- this .i = i;
- }
- }
- class Test1 {
- public static void main(String[] args) {
- Outer outer = new Outer();
- outer.test();
- System.out.println(outer.getI());
- System.out.println( "-------1--------" );
- Outer.Inner iner = outer. new Inner();
- iner.innerMsg();
- System.out.println(iner.getI());
- System.out.println( "-------2--------" );
- System.out.println(outer.getI());
- }
- }
運行結果:
調用Outer構造方法:outer
調用Inner構造方法:inner
- >>>>>Inner class !
- Outer class !
- 11
- ------- 1 --------
調用Inner構造方法:inner
- >>>>> Inner class!
- Outer class!
- 1001
- -------2--------
- 12
- Process finished with exit code 0
二、內部類與接口
1、內部類可以實現接口。
2、內部類之間相互可見,但並非內部類之間方法都可見。
- public interface Foo{
- void say();
- }
- public interface Bar {
- void readme();
- }
- /**
- * 內部類實現接口
- *
- * @author leizhimin 2009-7-17 14:57:50
- */
- public class Test2 {
- public static void main(String[] args) {
- Outer outer = new Outer();
- Foo f = outer.genFoo();
- Bar b = outer.genBar();
- f.say();
- b.readme();
- }
- }
- class Outer {
- private class FooImpl implements Foo {
- public void say() {
- System.out.println( "say foo!" );
- }
- }
- private class BarImpl implements Bar {
- public void readme() {
- System.out.println( "say bar!" );
- }
- }
- public Foo genFoo() {
- return new FooImpl();
- }
- public Bar genBar() {
- return new BarImpl();
- }
- }
輸入結果:
say foo!
say bar!
Process finished with exit code 0
三、訪問權限
外部類分兩種:
一種嵌入了內部類聲明代碼外部類,稱爲直接外部類。 另一種是與內部類沒有任何關係的外部類,稱爲外部類。
在同一個直接外部類中,內部類之間所有的方法都是相互可見的,包含在直接外部類的main()中可見。
在外部類中,要看到一個類的內部類成員,則至少要求這個內部類的class和成員權限大於或等於protected。
- /**
- * 內部類實現接口
- *
- * @author leizhimin 2009-7-17 14:57:50
- */
- public class Test2 {
- public static void main(String[] args) {
- Outer o = new Outer();
- Outer.Bar b = o.genBar();
- b.readme();
- }
- }
- class Outer {
- protected class Foo {
- protected void say() {
- System.out.println( "say foo!" );
- }
- private void test() {
- System.out.println( "----test------" );
- }
- }
- protected class Bar {
- protected void readme() {
- System.out.println( "say bar!" );
- new Foo().test();
- }
- }
- public Foo genFoo() {
- return new Foo();
- }
- public Bar genBar() {
- return new Bar();
- }
- }
本問轉自 http://developer.51cto.com/art/201002/183375.htm
感覺寫的不錯,收藏一下,希望對需要的朋友有幫助