1. 程式人生 > >簡述java中的內部類及其用法

簡述java中的內部類及其用法

一、內部類的定義:在Java中,允許在一個類的內部定義類,這樣的類稱作內部類也叫做巢狀類,這個內部類所在的類稱作外部類。

二、內部類的建立:

語法:

     外部類名.內部類名 變數名=new 外部類名().new 內部類名();

舉例:

      假設A是外部類,B是內部類

      A.B b=new A().new B();

三、建立內部類物件時應注意:

 1.在外部類的內部可以直接使用inner s=newinner();(因為外部類知道inner是哪個類,所以可以生成物件。)

 2.在外部類的外部,要生成(new)一個內部類物件,需要首先建立一個外部類物件(外部類可用),然後在生成一個內部類物件

四、內部類的表現形式:

                 1.靜態內部類

                 2.成員內部類

                 3.方法內部類

                 4.匿名內部類

五、內部類的共性:

                1.內部類任然是一個獨立的類,在編譯之後會內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類命和$符號。

               2.內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變數,無論是否是private的。

六、內部類的優點:

                1

.內部類成員可以直接訪問外部類的成員(包括私有成員)。

                2.比類具有更好的封裝性

七、匿名內部類(Anonymous Inner Class)

1.匿名內部類的定義:沒有名字的內部類,表面上看起來那是它的名字,實際上不是它的名字。

2.使用匿名內部類的前提:必須繼承父類或者實現一個介面。

3.匿名內部類的分類:a.繼承式的匿名內部類

                    b.介面式的匿名內部類

                    c.引數式的匿名內部類

4.特點:匿名內部類一定是跟在new的後面,用其隱含實現一個介面或一個類,沒有類名,根據多型,我們使用其父類名。因為匿名內部類屬於區域性類,所以區域性類的所有限制對其生效。匿名內部類是唯一一種無構造方法的類。匿名內部類在編譯時,系統自動起名Out$1.class。如果一個物件編譯時的型別是介面,那麼其執行的型別為實現這個介面的類。

5.注意點:

        1.不能有構造方法

        2.不能有任何靜態成員、方法和類

        3.不能是public、private、protected和static型別

        4.只能建立匿名內部類的一個例項

6.匿名內部類的優點:

                   1.可以使命名變得簡潔

                   2.使程式碼更加緊湊、簡潔,封裝性比內部類好

                   3.一個類用於繼承其他類或是實現介面,無需增加其他的方法,只是對繼承方法實現覆蓋。

7.匿名內部類的缺點:可讀性差。

以下是具體程式碼例項有助於理解

一、基本形式:

public class Outer1 {
	    public class Inner{  
	    }  
}
二、內部類和外部類間的相互呼叫及其關係:
package com.yc.bean;

public class Outer {
	private int num=4;		//定義成員變數
	
	public void test(){
			Inner inner =new Inner();
			inner.show();
	}
	
	
	//下面的程式碼定義了一個成員內部類
	class Inner{
		void show(){
			//在成員內部類的方法中訪問外部類的成員變數
			System.out.println("num="+num);
		}
	}
}
三、內部類物件的新建及方法的呼叫:
package com.yc.bean;

public class Myclass {
	public Myclass() {  
        System.out.println("產生MyClass");  
    }  
  
    class M {  
        public M() {  
            System.out.println("產生M");  
        }  
    }  
  
    public static void main(String[] args) {  
  
        Myclass my = new Myclass();  
        // 內部類相當於外部類的屬性,內部類物件的產生要依賴於外部類物件,只要是屬性可以有的修飾符都可以修飾內部類。  
        // 內部類在編譯時同樣會產生class檔案。命名為:外部類名$內部類名.class  
        Myclass.M m = my.new M();  
    }  
}
               這是我所知道的一點皮毛希望對需要的朋友有幫助!!!!!!!!!!!!吐舌頭吐舌頭吐舌頭吐舌頭