1. 程式人生 > >Java 內部類和匿名內部類

Java 內部類和匿名內部類

Java內部類和匿名內部類
1、內部類
一個類定義在另外一個類的內部,這個該類就被稱為內部類。內部類分為成員內部類(定義在外部類的成員位置)和區域性內部類(定義在外部類的方法裡面)。
(1)成員內部類

class Outer
{
	class Inner
	{
	//成員內部類
	}
}

成員內部類的特點:
1、成員內部類可以直接訪問外部類的成員,包括私有的,也可以通過外部類名.this.成員名呼叫外部成員。
2、外部類訪問非靜態成員內部類的成員,必須要建立成員內部類物件;外部類可以通過類名直接訪問靜態內部類的靜態成員,包括私有的。
3、成員內部類和外部類不存在繼承關係
4、其他類中生成成員內部類的方式:Outer.Inner oi = new Outer().new Inner();


(2)區域性內部類

class Outer
{
	public void method()
	{
		final int a = 10;
		class Inner
		{
			System.out.println(a);
			//區域性內部類
		}
	}
}


區域性內部類的特點:
     1、可以直接訪問外部類的成員
     2、在區域性位置可以建立區域性內部類物件,通過物件呼叫成員
注意:
    區域性內部類在訪問區域性變數時,被訪問的變數必須用 final 修飾,這是因為區域性變數隨著方法呼叫完畢就消失了,而內部類在堆記憶體中並不會立即消失,所以用 final 修飾,因為被 final 修飾的變數就成了常量,即使區域性變數消失了,但數值並不會消失。
2、匿名物件
沒有名字的物件

class Person
{
	public void show()
	{
		System.out.println(“Person”);
	}
}


用法:
    new Person() 就能夠得到一個 Person 物件,呼叫方法: new Person().show();
使用場景:
    適用於一個物件只使用一次的場景
好處:
    匿名物件使用完畢就變成垃圾被回收
注意:
    匿名物件可以作為實際引數傳遞
高階用法:

public abstract class Person
{
	public abstract void work();
}

new Person()
{
	public void work()
	{
		System.out.println(“work”);
	}
}.work();

可以通過這種方式得到抽象類 Person 的子類物件

同理,介面也可以使用相同的方法得到實現類物件:

public interface Phone
{
	public abstract void on();

	public abstract void off();
}

Phone p = new Phone()
{
	public void on()
	{
		System.out.println(“on”);
	}

	public void off()
	{
		System.out.println(“off”);
	}
};
p.on();
p.off();

3、匿名內部類

在一個類中獲取一個介面的實現類物件或者獲取一個抽象類的子類物件,以 abstract Person 和 interface Phone 為例:

class Outer
{
	public void method()
	{
		new Person()
		{
			public void work()
			{
				System.out.println(“work”);
			}
		}.work();
	}
}

new Outer().method();

class Outer
{
	public void method()
	{
		Phone p = new Phone()
		{
			public void on()
			{
				System.out.println("on");
			}


			public void off()
			{
				System.out.println("off");
			}
		};
		
		p.on();
		p.off();
	}
}

new Outer().method();