1. 程式人生 > >Java基礎——面向物件(六)內部類

Java基礎——面向物件(六)內部類

一、概述

一個類巢狀在另一個類當中。編譯後生成檔案:類$內部類.class。

class Outer
{
    class Inner
    {
    }
}
編譯生成結果

 特點:

1.內部類可以直接訪問外部類中的成員。

2.外部類要訪問內部類,必須建立內部類的物件。

什麼時候使用?

一般用於類的設計。分析事物時,發現該實物描述中還有事物,而且這個事物還在訪問被描述事物的內容。

 二、修飾符與使用

1.內部類可以使用修飾符

static:此時內部類是靜態的,相當於一個外部類。注意:當內部類有靜態成員,內部類必須是靜態的。

2.使用格式

//外部訪問
class Demo{
    public static void main(String[] args){
        //如果是public
        Outer.Inner in = new Outer().new Inner();
        //如果是static
        Outer.Inner in = new Outer.Inner();
    }
}
//內部訪問
class Outer{
    class Inner{ }
    void Method(){
        Inner in = new Inner();
    }
}

三、實現細節

class Outer
{
	int num = 3;
	class Inner
	{
		int num = 4;
		void show()
		{
			int num = 5;
            //注意這裡Inner.this或者Outer.this表示的num不同
			System.out.println(Outer.this.num);
		}
	}
	void method()
	{
		new Inner().show();
	}
}


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

思考:為什麼內部類能直接訪問外部類中的成員呢?

那是因為內部類持有了外部類的成員。 外部類名.this

四、區域性內部類——方法中的類

class Outer
{
	int num = 3;
	Object method()
	{
		final int x = 9;
		class Inner
		{
			public String toString()
			{
				return "show ..."+x;//呼叫只能被final修飾的變數-》規則
			}
		}
		Object in = new Inner();
		return in;//0x0045
//		in.show();
	}
}
class InnerClassDemo3 
{
	public static void main(String[] args) 
	{
		Outer out = new Outer();
		Object obj = out.method();
		System.out.println(obj);

	}
}

上面的出規則:區域性內部類只能呼叫final修飾的區域性變數。

原因:方法執行完會被彈棧,但是申請到的物件還在主程式。

五、匿名內部類——內部類的簡寫格式

規則:內部類必須繼承或者實現一個外部類或者介面。 

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 父類or介面(){子類內容}

子類內容:需要全部實現

六、應用

 

	public void method()
	{
//		Inner in = new Inner();
//		in.show1();
//		in.show2();
		

		Inter in = new Inter()
		{
			public void show1()
			{
				
			}
			public void show2()
			{
			
			}
			
		};
		in.show1();
		in.show2();
	}

使用場景一:當函式引數是介面型別時,且介面中的方法不超過三個。可以使用匿名內部類作為實際引數進行傳遞。

//使用場景之一
interface Inter(){
    public void show1();
    public void show2();
}
class InnerClassDemo5 
{
	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
		show(new Inter()
		{
			public void show1(){}
			public void show2(){}
		});
	}

注意:main裡面需要的都是靜態的