java 四種內部類和內部接口


/**
 * 常規內部類:常規內部類沒有用static修飾且定義在在外部類類體中。
 * 1.常規內部類中的方法可以直接使用外部類的實例變量和實例方法。
 * 2.在常規內部類中可以直接用內部類創建對象
 */
public class MyOuter {
	private int x = 100;
	
	class MyInner{
		private String y="Hello!";
		public void innerMethod(){
			System.out.println("內部類中 String ="+y);
			System.out.println("外部類中的x ="+x);
			outerMethod();
			System.out.println("x is "+MyOuter.this.x);
		}
	}
	
	public void outerMethod(){
		x++;
	}
	
	public void makeInner(){
		//在外部類方法中創建內部類實例
		MyInner in = new MyInner();
	}
	
	public static void main(String[] args){
		MyOuter mo = new MyOuter();
		//使用外部類構造方法創建 mo 常規內部類需要通過外部類實例來new
		MyOuter.MyInner inner = mo.new MyInner();
		inner.innerMethod();
	}
}

/**
 * 靜態內部類:與類的其他成員相似,可以用static修飾內部類,
 * 這樣的類稱為靜態內部類。靜態內部類與靜態內部方法相似,
 * 只能訪問外部類的static成員,
 * 不能直接訪問外部類的實例變量,與實例方法,只有通過對象引用才能訪問。
 */
public class MyOuter2 {
	
	public static int x=100;
	
	public static class Myinner{
		private String y="Hello!";
		/**
		 * 由於static內部類不具有任何對外部類實例的引用,
		 * 因此static內部類中不能使用this關鍵字來訪問外部類中的實例成員,
		 * 但是可以訪問外部類中的static成員。這與一般類的static方法相通
		 */
		public void innerMethod(){
			System.out.println("x="+x);
			System.out.println("y="+y);
		}
	}
	
	public static void main(String[] args){
		MyOuter2.Myinner si = new MyOuter2.Myinner();
		si.innerMethod();
	}
	
	
}
/**
 * 局部內部類:在方法體或語句塊(包括方法、構造方法、局部塊或靜態初始化塊)內部定義的類成為局部內部類。
 * 局部內部類不能加任何訪問修飾符,因為它只對局部塊有效。
 * 1.局部內部類只在方法體中有效,就想定義的局部變量一樣,在定義的方法體外不能創建局部內部類的對象
 * 2.在方法內部定義類時,應注意以下問題:
 *  1.方法定義局部內部類同方法定義局部變量一樣,不能使用private、protected、public等訪問修飾說明符修飾,
 *  也不能使用static修飾,但可以使用final和   abstract修飾
 *  2.方法中的內部類可以訪問外部類成員。對於方法的參數和局部變量,必須有final修飾才可以訪問。
 *  3.static方法中定義的內部類可以訪問外部類定義的static成員
 *
 */
public class MyOuter3 {
	private int size=5,y=7;
	
	public Object makeInner(int localVar){
		final int finalLocalVar = localVar;
		
		//創建內部類,該類只在makeInner()方法有效,就像局部變量一樣。
		//在方法體外部不能創建MyInner類的對象
		class Myinner{
			int y=4;
			public String toString(){
				return "OuterSize:"+size+" localVar:"+finalLocalVar+"\nthis.y="+this.y;
			}
		}
		
		return new Myinner();
	}
	
	public static void main(String[] args){
		Object obj = new MyOuter3().makeInner(47);
		System.out.println(obj.toString());
	}
}

/*匿名內部類:定義類的最終目的是創建一個類的實例,但是如果某個類的實例只是用一次,則可以將類的定義與類的創建,放到與一起完成,或者說在定義類的同時就創建一個類
  以這種方法定義的沒有名字的類成為匿名內部類。
   聲明和構造匿名內部類的一般格式如下:
   new ClassOrInterfaceName(){
    類體 }
   1.匿名內部類可以繼承一個類或實現一個接口,這里的ClassOrInterfaceName是匿名內部類所繼承的類名或實現的接口名。但匿名內部類不能同時實現一個接口和繼承一個類,
也不能實現多個接口。如果實現了一個接口,該類是Object類的直接子類,匿名類繼承一個類或實現一個接口,不需要extends和implements關鍵字。 2.由於匿名內部類沒有名稱,所以類體中不能定義構造方法,由於不知道類名也不能使用關鍵字來創建該類的實例。實際上匿名內部類的定義、構造、和第一次使用都發生在同樣一個地方。
此外,上式是一個表達式,返回的是一個對象的引用,所以可以直接使用或將其復制給一個對象變量。例: TypeName obj=new Name(){ 此處為類體 } 同樣,也可以將構造的對象作為調用的參數。例: someMethod(new Name(){ 此處為類體 });*/ public class MyOuter4 { private int size=5; public Object makeInner(int localvar){ final int finallocalvar = localvar; return new Object(){ public String toString(){ return "OuterSize="+size+"\nfinalLocalvar="+finallocalvar; } }; } public static void main(String args[]){ Object obj=new MyOuter4().makeInner(67); System.out.println(obj.toString()); } }

  

 5,內部接口:

為了弄清楚內部接口是如何工作的,我們可以拿它與內部類作比較。內部類可以被認為是一個外部類內部定義的一個常規方法。因為一個方法可以被聲明為靜態和非靜態,類似的內部類也可以被聲明為靜態和非靜態。靜態類類似於靜態方法,它只能訪問外部類的靜態成員屬性。非靜態方法可以訪問外部類的所有成員屬性。

  • 一種對那些在同一個地方使用的接口進行邏輯上分組;
  • 封裝思想的體現;
  • 因為接口是不能實例化的,內部接口只有當它是靜態的才有意義。因此,默認情況下,內部接口是靜態的,不管你是否手動加了static關鍵字。

  • public class MyOuter4 {
    	private int size=5;
    	private int id;
    	
    	public interface OnClickListener{
    		void onClick(int id);
    	}
    	
    	public void onClick(OnClickListener obj){
    		obj.onClick(this.id);
    	}
    	
    	public Object makeInner(int localvar){
    		final int finallocalvar = localvar;
    		return new Object(){
    			public String toString(){
    				return "OuterSize="+size+"\nfinalLocalvar="+finallocalvar;
    			}
    		};
    	}
    	
    	public static void main(String args[]){
    		Object obj=new MyOuter4().makeInner(67);
    		System.out.println(obj.toString());
    		
    		MyOuter4 m = new MyOuter4();
    		m.onClick(new OnClickListener() {
    			
    			@Override
    			public void onClick(int id) {
    				System.out.println(id);
    			}
    		});
    	}
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM