12-11java面向對象之內部類操作

在本次博客之後,進行的就是面向對象的高級操作。何爲高級呢?只是在基礎之上的擴充,所以要把基礎知識掌握牢固纔有可能進一步提高。爲了完成質疑任務,本週剩下的時間全部用來複習,溫故而知新。

在開始主題內部類之前,先簡單介紹一下代碼塊的基本概念。

1.代碼塊

在java中有的代碼可以直接使用{}將代碼括起來,主要包括一下幾種:
1.普通代碼塊:直接在方法之中編寫。

//代碼塊的測試
public class Test 
{
	public static void main(String[] args) 
	{
		{
			int x = 10;<span style="white-space:pre">			</span>
			System.out.println("x = " + x);
		}
		int x = 100;
		System.out.println("x = " + x);
	}	
} 
解釋:上述代碼int實例化,首先對x賦予局部變量,在基本代碼塊之後,進入全局變量。

2.構造塊:在類中定義的代碼塊。構造塊優先於構造方法執行,每個對象實例化之後,都會重複執行構造塊和構造方法。

//代碼塊的測試
class A
{
	{
		System.out.println("這是構造塊");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test 
{
	public static void main(String[] args) 
	{
		new A();
		new A();
		new A();
	}	
} 

3.靜態代碼塊。使用static定義的塊,他優先於構造塊執行,而且不管多少個實例化對象,他只執行一次。

//代碼塊的測試
class A
{
	static
	{
		System.out.println("這是靜態塊");
	}
	{
		System.out.println("這是構造塊");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test 
{
	public static void main(String[] args) 
	{
		new A();
		new A();
		new A();
	}	
} 

在主類之中定義的靜態塊優先於主方法執行。\

//代碼塊的測試
class A
{
	static
	{
		System.out.println("這是靜態塊");
	}
	{
		System.out.println("這是構造塊");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test 
{
	static
	{
		System.out.println("@@@@@@@@@@@");
	}
	public static void main(String[] args) 
	{
		new A();
		new A();
		new A();
	}	
} 

上面的這一程序提供了一個信息,可以不使用main()方法就能輸出信息,通過代碼塊來實現。

2.內部類

使用情況:

1.最早使用在圖形界面

2.開源框架

2.1概念

概念:在一個類的內部定義其他操作類

格式:

Class 外部類

{

屬性方法

Class 內部類

屬性方法

}

//內部類的測試
class Outer
{
	private String name1 = "hello";
	class Inner
	{
		private String name2 = "world";
		public void print()
		{
			System.out.println(name1);<span style="white-space:pre">	</span>//調用外部類屬性<span style="white-space:pre">	</span>
             <span style="background-color: rgb(255, 255, 51);">//System.out.println(Outer.this.name1);</span>
		}
	}
	public void f()<span style="white-space:pre">		</span><span style="font-family: 宋體;">			</span><span style="font-family: 宋體;">//</span><span style="font-family: 宋體;">外部類的方法,進行實例內部類並調用內部類的方法</span><span style="white-space:pre">
</span>	{
		Inner in = new Inner();
		in.print();
		System.out.println(in.name2);<span style="white-space:pre">		</span>//外部類方法調用內部類
	}
}
public class Test 
{	
	public static void main(String[] args) 
	{
		new Outer().f();
	}	
} 

優點:內外部類的私有操作可以互相訪問

缺點:破壞了類的結構

之前內部類的操作都是產生了外部類之後通過外部類提供的方法提供實例化內部類,才能進行內部類的方法的調用,能否在外部產生內部類的實例?

編譯程序之後出現了   Outer$Inner.class   

$在程序之中可以理解爲”.”,即內部類的名稱爲: “外部類.內部類”。

由於內部類的訪問需要操作外部類的資源和屬性,所以要想在外部實例化內部類的對象,格式:

外部類.內部類   內部類對象名= new 外部類().new內部類()

//內部類的測試
class Outer
{
	private String name1 = "hello";
	class Inner
	{	
		//內部類的方法
		public void print()
		{
			System.out.println(Outer.this.name1);
		}
	}
}
public class Test 
{	
	public static void main(String[] args) 
	{
		//外部類.內部類   內部類對象名= new 外部類().new內部類()
		Outer.Inner  in = new Outer().new Inner();
		in.print();
	}	
} 

2.2 static聲明內部類

可以使用static聲明內部類,但是不能聲明外部類  

例如  static A{  } 錯誤的提示: 錯誤此處不允許使用修飾符static

如果一個內部類用static聲明 則成爲了外部類

聲明格式:

外部類.內部類   內部類對象名= new 外部類.內部類()

//內部類的測試
class Outer
{
	private static String name1 = "hello";		//內部類變成static 只能訪問static資源
	static class Inner
	{	
		//內部類的方法
		public void print()
		{
			System.out.println(name1);
		}
	}
}

public class Test 
{	
	public static void main(String[] args) 
	{
		//static內部類則他又變成了外部類
		Outer.Inner  in = new Outer.Inner();
		in.print();
	}	
} 

2.3在方法中定義內部類

理論上內部類可以在任何地方定義,大多數在方法之中。在方法中定義內部類,可以直接訪問外部類的屬性

//內部類的測試
class Outer
{
	private static String name1 = "hello";		//內部類變成static 只能訪問static資源
	//外部類的方法
	public void fun()
	{
		//在方法中定義內部類
		class Inner
		{
			//內部類的方法
			public void print()
			{
				System.out.println(Outer.this.name1);
			}
		}
		Inner in = new Inner();
		in.print();
	}
}
public class Test 
{	
	public static void main(String[] args) 
	{
		new Outer().fun();
	}	
} 

注意:在方法中定義內部類時,也緊跟着實例化內部類方法。低版本的JDK中,內部類如果要調用方法的參數和變量時,需要final聲明,但是高版本不需要了

//內部類的測試
class Outer
{
	private static String name1 = "hello";		//內部類變成static 只能訪問static資源
	//外部類的方法
	public void fun(final int x)
	{
		final String name2 = "world";
		//在方法中定義內部類
		class Inner
		{
			//內部類的方法
			public void print()
			{
				System.out.println(Outer.this.name1);
				System.out.println(x);
				System.out.println(name2);
			}
		}
		Inner in = new Inner();
		in.print();
	}
}
public class Test 
{	
	public static void main(String[] args) 
	{
		new Outer().fun(1);
	}	
} 


今天到此結束,祝大家健健康康,快快樂樂。



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