1. 程式人生 > 實用技巧 >java-內部類

java-內部類

概念:在一個類的內部再定義一個完整的類。

1.特點:

  編譯之後可分別生成獨立的位元組碼檔案

  內部類可以直接訪問外部類的私有成員,而不破壞封裝。

2.內部類在java中的型別:

  成員內部類,靜態內部類,區域性內部類,匿名內部類。

3.成員內部類:(在類的內部定義和成員變數、成員方法同級別的類,

package day13;

public class TestStaticClass {

	public static void main(String[] args) {
//		Outer2.StaticInner in3 =new Outer2.StaticInner();
//		in3.method();

	}

}

class Outer2 {
	private int a = 10;// 成員屬性
	private static int b = 20;

	public Outer2(int a) {
		this.a = a;
	}

	public void m() {
		final int x = 20;
		class LocalInner {
			private int o = 30;
//			private static int p = 40;error!

			public void method() {
				System.out.println(o);// 30
//				System.out.println(p);
				System.out.println(a);// 0
				System.out.println(b);// 20
				System.out.println(x);// 50
			}
		}// 內部類的定義不算是該Outer2類的程式碼,因為他在編譯時,單獨形成一個.class檔案
		LocalInner in = new LocalInner();
		in.method();
	}

	static class StaticInner {
		private int x = 10;

		public void method() {
			System.out.println(x);
//			System.out.println(a);
			System.out.println(b);
		}
	}
}

  

即是成員內部類)

  建立物件:先建立外部類物件,再通過外部類物件.new內部類類名() 建立內部類物件

  成員內部類依託於外部類而存在的。如Outer1.MemberInner in1=o1.new MemberInner();

  內部類可以直接訪問外部類的私有屬性,從而不破壞類的封裝性。

內部類訪問私有屬性例子:

package day13;

public class demo {

	public static void main(String[] args) {
		Outer1 o1 = new Outer1(10);
		Outer1.MemberInner in1 = o1.new MemberInner();
		in1.method();//30
		Outer1 o2 = new Outer1(20);
		Outer1.MemberInner in2 = o2.new MemberInner();
		in2.method();//30
	}

}

class Outer1 {
	private int a;

	public Outer1(int a) {
		this.a = a;
	}

	public void m() {
	}

	class MemberInner {
		private int a=30;
		public void method() {
		int a=40;
			System.out.println(a);//40
			System.out.println(this.a);//30
			System.out.println(Outer1.this.a);//10  20
		}
	}
}

4.靜態內部類

  靜態內部類只能訪問外部類的靜態成員。它不依賴與外部類(更獨立),用的時候比較方便。

程式碼例子:

package day13;

public class TestStaticClass {

	public static void main(String[] args) {
		Outer2.StaticInner in3 =new Outer2.StaticInner();
		in3.method();
	}

}
class Outer2 {
	private int a = 10;// 成員屬性
	private static int b=20;
	public Outer2(int a) {
		this.a = a;
	}

	public void m() {
		int x = 20;
		
	}
	static class StaticInner{
		private int x=10;
		public void method() {
			System.out.println(x);
//			System.out.println(a);
			System.out.println(b);
		}
	}
}

5.區域性內部類:定義在方法的內部(出了生命期就無法使用)

區域性變數:在方法範圍之內定義的變數。

區域性類:在方法裡定義的類。在方法裡定義後才能使用,出了該方法就無法使用。

  作用範圍:從定義開始。到程式碼塊結束。

  區域性內部類不能定義靜態成員

  區域性內部類可以訪問外部類的私有成員,還能訪問外部類的區域性變數,但是要加上final

程式碼例子

package day13;

public class TestTeacher {

	public static void main(String[] args) {
		Student1 t = new Student1();
		t.study();
	}

}

class School {
	public static Teacher getTeacher(int n) {
		class TeacherA implements Teacher {
			public void teach() {
				System.out.println("TeacherA 講課");
			}
		}

		class TeacherB implements Teacher {
			public void teach() {
				System.out.println("TeacherB 講課");
			}
		}
		if (n % 2 == 0)
			return new TeacherA();
		else
			return new TeacherB();
	}
}

class Student1 {
	public void study() {
//		TeacherA t = new TeacherA();
//		Teacher t =School.getTeacher();
//		t.teach();
//		Teacher t =new TeacherA();
		Teacher t = School.getTeacher(1);
//		Teacher t =new TeacherA();
		t.teach();
	}
}

interface Teacher {
	void teach();
}

6.區域性內部類訪問外部類區域性變數

package day13;

public class TestLocalInnerClass {

	public static void main(String[] args) {

	}

}
class A{
	public void method() {
		final int x=10;
		class B{
			public void print()
			{
				System.out.println(x);
			}
		}
	}
}

  虛擬機器記憶體:

    堆空間(存的是物件)

    棧空間(存放的是區域性變數)

    方法區:常量池,全域性性的屬性(如靜態屬性,全類公有)...