內部類——嵌套類

1、概述

    static修飾內部類的含義:java

    一、普通內部類通常有一個指向外部類的隱式引用,若內部類用static修飾,此關係將消失,嵌套類也將不須要經過外部引用實例進行建立;測試

    二、不能從嵌套類中訪問非靜態的外圍類成員;this

    三、普通內部類的字段和方法只能放到類的外層層次上,即普通內部類不能含有靜態數據(字段、方法和嵌套類);而嵌套類是能夠包含靜態數據的。spa

2、代碼說明

    一、公共接口

            Contents.java

package com.lh.innerclass.class4;

public interface Contents {
	int value();
}

            Destination.java

package com.lh.innerclass.class4;

public interface Destination {
	String readLabel();
}

    二、嵌套類測試Parcel.java

package com.lh.innerclass.class4;

public class Parcel {
	private static class ParcelContents implements Contents{
		private int i=11;
		
		public int value(){
			return this.i;
		}
	}
	
	//普通內部類中不能有靜態成員!!!
	protected static class ParcelDestination implements Destination{
		private String label;
		
		//內部類的構造器通常設置爲私有
		private ParcelDestination(String whereTo){
			this.label = whereTo;
		}
		
		private static int x = 10;
		
		public String readLabel(){
			return this.label;
		}
		
		static void f(){
			System.out.println("ParcelDestination.f()");
		}
		
		//嵌套類中能夠有嵌套類
		static class AnotherLevel{
			private static int x = 10;
			
			static void f(){
				System.out.println("ParcelDestination.AnotherLevel.f()");
			}
		}
		
		//嵌套類中也能夠有普通內部類
		private class InnerClass{
			private int x = 10;
			
			//普通內部類中不能定義靜態字段
//			private static String aa = "a";
			private String a;
			
			void f(){
				System.out.println("ParcelDestination.InnerClass.f()");
			}
			
			//普通內部類中不能定義靜態方法
//			static void ff(){
//				System.out.println("ParcelDestination.InnerClass.f()");
//			}
		}
	}
	
	static Contents contents(){
		return new ParcelContents();
	}
	
	static Destination destination(String s){
		return new ParcelDestination(s);
	}

	public static void main(String[] args) {
		Parcel.contents();
		Parcel.destination("Tasmania");
	}

}

    三、接口內部類測試ClassInInterface.java

package com.lh.innerclass.class4;

/****
 * 
 * 接口內部的類:默認帶有static關鍵字的嵌套類!
 * 
 * @author Liu
 *
 */
public interface ClassInInterface {
	void howdy();
	
	//默認帶有static關鍵字的嵌套類!
	class Test implements ClassInInterface{

		public void howdy() {
			System.out.println("howdy!");
		}
		
		public static void main(String[] args) {
			new Test().howdy();
		}
		
	}
}

    注:在接口中定義的嵌套類默認是public的且帶關鍵字staticcode

    四、多層嵌套內部類的使用MultiNestingAccess.java

package com.lh.innerclass.class4;

/****
 * 
 * 從多層嵌套類中訪問外部類的成員
 * 此處嵌套類含義:普通內部類
 * 
 * @author Liu
 *
 */
class MNA{
	 void f(){
		System.out.println("MNA.f()");
	 }
	 class A{
		void g(){
			System.out.println("MNA.A.g()");
		}
		
		class B{
			void h(){
				System.out.println("MNA.A.B.h()");
				A.this.g();
				MNA.this.f();
			}
		}
	}
}

public class MultiNestingAccess {

	public static void main(String[] args) {
		new MNA().new A().new B().h();
	}

}
相關文章
相關標籤/搜索