新手初學Java的內部類

Java的內部類

概念:

  • 內部類就是在一個類的內部定義一個類,比如,A類中定義一個B類,那麼B類相對於A類來說就是稱為內部類,而A類相對於B類來說就是外部類。
  • 成員內部類
  • 靜態內部類
  • 局部內部類
  • 匿名內部類

特點:

  • 內部類編譯之後可以生成獨立的字節碼文件。
  • 內部類可以直接訪問外部類的私有成員,而不破壞封裝。
  • 內部類可為外部類提供必要的內部功能組件。
  • 外部類要訪問內部類的成員,必須要建立內部類的對象

成員內部類

在內的內部定義,與實例變量、實例方法同級別的類。

成員內部類中不能包含靜態成員,但可以包含靜態常量。

package com.cnblogs;
//這個類用於實現
public class Application {
	public static void main(String[] args) {
		Outer outer = new Outer();//實例化  外部類
		Outer.Inner inner = outer.new Inner();//實例化  內部類
        //一步到位實例化內部類
        //Inner inner = new Outer().new Inner();
		//外部類的屬性
		System.out.println(outer.age);//21
		//外部類方法
		outer.out1();//這是外部類的方法
		//內部類屬性
		System.out.println(inner.in);//內部類屬性
		//內部類方法
		inner.inner();//這是內部類方法
		//內部類獲取外部類的私有屬性
		inner.getName();//獲取到瞭外部類的私有屬性:柒
		//內部類獲取外部類的私有方法
		inner.getMethod();//這是外部類的私有方法
	}
}
package com.cnblogs;
/*
 * 本類用於測試內部類可以直接訪問外部類的私有成員
 */
public class Outer {
	//外部類的私有屬性
	private String name = "柒";
	//外部類的屬性
	public int age = 21;
	//外部類的私有方法
	private void out() {
		System.out.println("這是外部類的私有方法");
	}
	//外部類的方法
	public void out1() {
		System.out.println("這是外部類的方法");
	}
	 class Inner{
		//內部類屬性
		public String in = "內部類屬性";
		//內部類方法
		public void inner() {
			System.out.println("這是內部類方法");
		} 
		//獲取外部類的私有屬性
		public void getName() {
			System.out.println("獲取到瞭外部類的私有屬性:" + name);
		}
		//獲取外部類的私有方法
		public void getMethod() {
			out();
		}
	}
}

註意:當外部類、內部類存在重名屬性時,會優先訪問內部類屬性

package com.cnblogs;
import com.cnblogs.Outer.Inner;
/*
 * 本類用於實現
 */
public class Application {
	public static void main(String[] args) {
		Inner inner = new Outer().new Inner();
		inner.show();
	}
}
package com.cnblogs;
/*
 * 本類用於測試內部類和外部類的同名屬性
 */
public class Outer {
	//外部類屬性
	private String name = "張三";
	class Inner{
		//內部類屬性 
		private  String name = "柒";
		//內部類方法,用於打印
		public void show() {
			//這裡打印出的是內部類的屬性:柒
			System.out.println(name);
			//這是打印外部類的屬性:張三
			System.out.println(Outer.this.name);
		}
	}
}

靜態內部類

不依賴外部類對象,可直接創建或通過類名訪問,可聲明靜態成員

package com.cnblogs;
import com.cnblogs.Outer2.Inner;
/*
 * 本類用於實現
 */
public class Application {
	public static void main(String[] args) {
		//直接創建內部類對象
		Inner inner = new Outer2.Inner();
		//調用方法
		inner.show();
	}
}
package com.cnblogs;
/*
 * 本類用於測速靜態內部類
 */
//外部類
public class Outer2 {
	private String name = "柒";
	private int age = 21;
	//靜態內部類 用法和外部類一樣
	static class Inner{
		private String in = "靜態內部類屬性";
		private int inner = 99;
		//靜態成員
		private static int inners = 999;
		//調用方法
		public void show() {
			//調用外部類屬性,先創建外部類對象
			Outer2 outer = new Outer2();
			//再調用外部類屬性
			System.out.println(outer.name);//柒
			System.out.println(outer.age);//21
			//調用靜態內部類屬性
			System.out.println(in);//靜態內部類屬性
			System.out.println(inner);//99
			//調用靜態內部類的靜態成員
			System.out.println(inners);//999
			System.out.println(Inner.inners);//999
		}
	}
}

局部內部類

定義在外部類方法中,作用范圍和創建對象范圍僅限於當前方法。

局部內部類訪問外部類當前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final。

限制類的使用范圍。

package com.cnblogs;
//這個類用於實現
public class Application {
	public static void main(String[] args) {
		Outer3 outer = new Outer3();
		outer.show();
	}
}
package com.cnblogs;
/*
 * 本類用於測試局部內部類
 */
//外部類
public class Outer3 {
	private String name = "柒";
	private int age = 21;
	public void show() {
		//定義局部變量
		String in = "蘇州";
		//局部內部類:不能加任何訪問修飾符
		class Inner{
			//局部內部類的屬性
			private String phone = "10086";
			//局部內部類方法
			public void show2() {
				//訪問外部類屬性
				System.out.println(name);//Outer3.this.name
				System.out.println(age);
				//訪問內部類屬性
				System.out.println(phone);//this.phone
				//訪問局部變量:jdk1.7要求 變量必須是常量final,jdk1.8自動添加final
				System.out.println(in);
			}
		}
		//創建內部類對象
		Inner inner = new Inner();
		inner.show2();
	}
}

匿名內部類

沒有類名的局部內部類(一切特征都與內部類相同)。

必須繼承一個父類或者實現一個接口。

定義類、實現類、創建對象的語法合並,隻能創建一個該類的對象。

  • 優點:減少代碼量
  • 缺點:可讀性較差
package com.cnblogs;
/*
 * 本類用於實現局部內部類
 */
public class TestUsb {
	public static void main(String[] args) {
		//創建接口類型的變量
//		Usb usb = new Mouse();
//		usb.service();
		//局部內部類
//		class Fan implements Usb{
//
//			@Override
//			public void service() {
//				System.out.println("鏈接成功,可以使用!!!!");
//				
//			}
//			
//		}
		//使用局部內部類創建對象
//		Usb usb = new Fan();
//		usb.service();
		//使用匿名內部類優化(相當於創建瞭一個局部內部類)
		Usb usb = new Usb() {
			@Override
			public void service() {
				System.out.println("鏈接成功,可以使用!!!!");
			}
		};
		usb.service();
	}
}
package com.cnblogs;
//接口
public interface Usb {
	//服務
	void service();
}
package com.cnblogs;
//實現接口
public class Mouse implements Usb{
	@Override
	public void service() {
		System.out.println("鏈接成功,可以使用!!!!!");
	}
}

總結

本篇文章就到這裡瞭,希望能給你帶來幫助,也希望你能夠多多關註WalkonNet的更多內容!

推薦閱讀: