天天看點

Java内部類分類總結内部類(Inner Class)學習知識點總結:

内部類(Inner Class)學習知識點總結:

1、概念

把一個類定義到另一個類的内部的類就叫内部類,内部類可以看作是外部類的一個成員(與類的屬性和方法類似)。

内部類一樣可以有自己的子類,可以被繼承。

2、分類

①靜态内部類(static inner class)

靜态内部類是指被static修飾的内部類,它可以不依賴與外部OuterClass類的執行個體而執行個體化,類似與靜态函數,靜态變量一樣,随着類加載而被建立。另外靜态内部類不能與外部類有相同的名字,不能通路外部類的普通成員變量,隻能通路外部類中靜态成員和靜态方法(根據靜态成員不能通路非靜态成員的規則)。靜态内部類的成員方法(包含類方法和執行個體方法)不能通路外部類的執行個體方法。(執行個體方法指非靜态方法)

②成員内部類(member inner class)

成員内部類中可以通路外部類的所有成員變量和方法,包括靜态和非靜态。

成員内部類(非靜态内部類)的使用權限:
  • ①private修飾:隻能在外部類的内部使用
  • ②預設修飾:隻能被與外部類處于同一包中的其他類所通路
  • ③protected修飾:可以被與外部類處于同一包的其他類以及外部類的子類通路
  • ④public修飾:可以在任何地方使用

③局部内部類(local inner class)

局部内部類中可以通路外部類的所有成員變量和方法,包括靜态和非靜态。

④匿名内部類(anonymous inner class)

匿名内部類可以通路外部類的靜态成員變量和靜态方法,不能通路非靜态成員變量和方法。

3、匿名内部類同時需要注意幾個方面:

1)匿名内部了不能有構造函數

2)匿名内部類不能定義靜态成員、靜态方法和類

3)匿名内部類不能是 public、protected、private、static。

4)隻能建立匿名内部類的一個執行個體。

5)一個匿名内部類一定是在new 的後面,這個匿名内部類必須內建一個父類或是實作一個接口。(下面的代碼執行個體是實作了一個接口的方式定義匿名内部類)

4、各個内部類定義執行個體如下:

interface Inner {
	void say();
}

class OuterClass {
	int a;
	static int b = 10;
    String name = "OuterName";
	static class StaticInnerClass {
		void test(){
//			System.out.println("a="+a);//不可以通路非靜态變量
			System.out.println("b="+b);
		}
	}//靜态内部類

	class MemberInnerClass {
        private String name = "InnerClass";
		void test(){
			System.out.println("a="+a);
			System.out.println("b="+b);
		}
        public void setName(String name){
           System.out.println(name);//調用形參的name屬性
           System.out.println(this.name);//調用内部類的name同名屬性
           System.out.println(OuterClass.this.name);//調用外部類的同名屬性 
       }
	}//成員内部類

	public void method() {
		class LocalInnerClass {	
			void test(){
				System.out.println("a="+a);
				System.out.println("b="+b);
			}
		}//局部内部類
	}

	public void method1(Inner inner1) {
		System.out.println("實體函數");
	}

	public static void main(String[] args) {
		new OuterClass().method1(new Inner() {//匿名内部類
			@Override
			public void say() {}
			void test(){
//				System.out.println("a="+a);//不可以通路非靜态變量
				System.out.println("b="+b);
			}
		});
	}
}
           

5.内部類在外部類外使用方法:

①非靜态内部類:

  • 在外部類的内部:In in = new In();//與平常用的類沒有太大差別
  • 在外部類的外部:Out.In in =  new Out().new In();//因成員内部類是外部類的成員,是以要依附外部類的對象上使用

②靜态内部類:

  • 在外部類的内部:In in = new In();//與平常用的類沒有太大差別
  • 在外部類的外部:Out.In in =  new Out.In();//因成員内部類是外部類的成員,是以要依附外部類的對象上使用