java 結合內部類與外部類的靜態(static)與非靜態的用法

        閱讀提示:如果覺得不好理解,可以按照我的思路自己操作一遍。不同元素的名稱區分的比較細,注意區分幾個概念:非靜態外部類、靜態和非靜態內部類、靜態和非靜態方法,靜態和非靜態屬性等。

         java中的靜態和非靜態主要由static關鍵字區分,static關鍵字可修飾成員內部類、方法和變量(屬性)三種內容。類可以分爲兩種,外部類和內部類,內部類是包含在外部類裏面的,也就是說一個內部類一定對應一個的外部類,內部類又分爲成員內部類、匿名內部類和局部內部類,本文僅涉及成員內部類。

1靜態與非靜態類構造

        用如下代碼測試:Eclipse爲非靜態外部類,Button爲非靜態內部類,Window爲靜態內部類,Eclipse和Window包含靜態變量、非靜態變量、靜態方法、非靜態方法。Button包含非靜態變量和方法。得出以下幾點:

1.1 static只能修飾內部類(例Window),不能修飾外部類(例Eclipse)。所以外部類只有非靜態外部類,內部類分爲靜態內部類和非靜態內部類。

1.2 非靜態外部類和靜態內部類可包含靜態變量和方法,非靜態內部類不包含靜態變量和方法

1.3 無論是非靜態外部類還是非靜態內部類以及靜態內部類,都可以包含非靜態變量和方法。

class Eclipse{//外部類
	String name;
	static String icon;	
	void getname() {		
	}
	
	static void geticon() {		
	}
	
	class Button{//按鈕內部類
		String name;
		static String icon;//報錯,非靜態類中不能聲明靜態變量和靜態方法
		
		void getname() {			
		}
		
		static void geticon() {//報錯	
		}
	}
	
	static class Window{//窗口內部類
		String name;
		static String icon;
	
		void getname() {			
		}
		
		static void geticon() {			
		}
	}
}

2靜態與非靜態類調用

        用如下代碼進一步測試,得出以下幾點:

2.1非靜態外部類調用:

2.1.1 非靜態外部類非靜態方法中,可以調用所有非靜態類和靜態類的非靜態、靜態方法、變量。

2.1.2 非靜態外部類靜態方法中,不可以調用非靜態外部類非靜態變量、方法和非靜態內部類的實例、方法、變量,可以調用靜態內部類的實例、實例.方法、實例.變量。

2.2內部類調用:

2.2.1.非靜態內部類只有非靜態方法,與非靜態外部類非靜態方法一樣,可以調用所有非靜態類和靜態類的非靜態、靜態方法、變量。

2.2.2.靜態內部類的靜態與非靜態方法,不可調用所有非靜態內部類的實例、方法、變量,可以調用所有非靜態外部類的實例、實例.方法、實例.變量。

public class InnerClass {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		new Eclipse().getname();
//		new Eclipse().geticon();
//		new Eclipse().new Button().getname();
//		new Eclipse().new Window().geticon();//報錯
		new Eclipse.Window().getname();
//		new Eclipse.Window().geticon();//與Eclipse.Window.geticon()等效
//		Eclipse.Window.geticon();

//              非靜態內部類和靜態內部類實例化的方法
//		Eclipse.Button btn=new Eclipse().new Button();
//		Eclipse.Window win=new Eclipse.Window();
	}


}


class Eclipse {// 外部類
	String name = "eclipsename";
	static String icon = "eclipseicon";


	void getname() {
		System.out.println(name);
//		new Button().getname();
//		new Window().getname();
//		new Window().geticon();
//		Window.geticon();
//		String btnname=new Button().name;
		
	}


	static void geticon() {
		System.out.println(icon);
//		getname();//報錯
//		System.out.println(name);//報錯
//		Button btn=new Button();//報錯
//		new Button().getname();//報錯
//		Window w=new Window();
//		new Window().getname();
//		new Window().geticon();	
//		Window.geticon();
	}


	 class Button {// 按鈕內部類
		String name = "buttonname";
		// static String icon;


	    void getname() {
//			System.out.println(name);
//			new Eclipse().getname();
//			Eclipse.this.getname();//非靜態內部類裏也用非靜態外部類名.this.方法實現調用實例方法的效果
//			new Eclipse().geticon();
//			Eclipse.geticon();			
//			new Window().getname();
//			new Window().geticon();
//			Window.geticon();
//			String ecname=new Eclipse().name;
//			String ecicon=new Eclipse().icon;
                        String s=Eclipse.this.name;//非靜態內部類裏也用非靜態外部類名.this.變量實現調用實例變量的效果
		}


		// static void geticon() {
		// }
	}


	 static class Window {// 窗口內部類
		String name = "windowname";
		static String icon = "windowicon";


		void getname() {
			System.out.println(name);
			new Eclipse().getname();
			new Eclipse().geticon();
//			new Button().getname();//報錯
			Eclipse.geticon();
			String ecname=new Eclipse().name;
			String ecicon=new Eclipse().icon;
		}


		static void geticon() {
  			System.out.println(icon);
//			new Eclipse().getname();
//			new Eclipse().geticon();
////		    new Button().getname();
//			Eclipse.geticon();
//			String ecname=new Eclipse().name;
//			String ecicon=new Eclipse().icon;
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章