1. 程式人生 > >黑馬程式設計師----java之內部類

黑馬程式設計師----java之內部類

---------------------- ASP.Net+Android+IO開發S.Net培訓、期待與您交流! ----------------------

今天學習了內部類,對學習作下筆記。

內部類訪問特點:
1.內部類可以直接訪問外部類中的成員。
2.外部類要訪問內部類,必須建立內部類的物件。


如果內部類是靜態的,相當於一個外部類.
如果內部類中定義了靜態成員,該內部類必須是靜態的


一般用於類的設計。
分析事物時,發現該事物描述中海油事物。而且這個事物還在訪問被描述事物的內容。
這時就是還有事物定義成內部類來描述。

class Outer
{
	private int num=3;
	static class Inner
	{
		void show(){
			System.out.println("show run..."+num);
		}

		static void function(){//如果內部類中定義了靜態成員,該內部類必須是靜態的
			System.out.println("function run..."+num);
		}
	}

	publci void method(){
		Inner in=new Inner();
		in.show();
	}
}




class InnerClassDemo 
{
	public static void main(String[] args) 
	{
		//Outer o=new Outer();
		//o.method();
		//直接訪問外部類中的內部類中的成員。
		//Outer.inner in=new Outer().new inner();
		//in.show();

		//如果內部類是靜態的,相當於一個外部類
//		Outer.Inner in=new Outer.Inner();
//		in.show();
		//如果內部類是靜態的,成員是靜態的
		Outer.Inner.function();
	}
}

為什麼內部類能直接訪問外部類中的成員呢?
那是因為內部類持有了外部類的引用。外部類名.this

class Outer
{
	int num=3;
	class Inner
	{
		int num=4;
		void show(){
			int num=5;
			System.out.println(num);//列印5,this.num列印4,Outer.this.num列印3
		}
	}
	void method(){
		new Inner().show();
	}
}


class InnerClassDemo2
{
	public static void main(String[] args) 
	{
		new Outer().method();
	}
}

內部類可以存放在區域性位置上,
內部類在區域性位置上只能訪問區域性中被final修飾的區域性變數。
class Outer
{
	int num=3;
	void method(){
		final int num=9;//必須加final
		class Inner
		{
			void show(){
				System.out.println("show..."+num);
			}
		}
		Inner in=new Inner();
		in.show();
	}
}


匿名內部類.就是內部類的簡寫格式。
必須有前提:
內部類必須繼承或者實現一個外部類或者介面。
匿名內部類:其實就是一個匿名子類物件。

abstract class Demo
{
	abstract void show();
}

class Outer
{
	int num=4;
	/*
	class Inner extends Demo
	{
		void show(){
			System.out.println("show..."+num);
		}
	}
	*/
	public void method(){
		//new Inner().show();
		new Demo(){
			void show(){
				System.out.println("show...."+num);
			}
		}.show();//如果有匿名內部類有多個方法,則new一個父類物件,用父類物件呼叫。但是向上轉型了,注意不能訪問特有方法。
	}
}

class Outer
{
	void method(){
		Object obj=new Object(){
			public void show(){
				System.out.println("show run");
			}
		};
		obj.show();
		//因為匿名內部類這個子類物件被向上轉型為了Object型別。
		//這樣就不能在使用子類特有的方法了。
	}
}


---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------