Java基礎-內部類

Java基礎-內部類

零、知識點子查詢-如果能回答出以下問題,則不必往下看了

1.內部類的訪問特點?

2.成員內部類定義在哪裡?

3.成員內部類如何實現調用?提示:方法一、方法二

4.局部內部類定義在哪裡?

5.局部內部類如何實現調用?提示:方法一、方法二

6.匿名內部類本質?

7.匿名內部類如何實現調用?提示:方法一、方法二

一、內部類的訪問特點

1.內部類可以直接訪問外部類的成員,包括私有

2.外部類要訪問內部類的成員,必須創建對象

二、內部類的分類

1.成員內部類:定義在類內部

  • ​ 成員內部類,外界如何創建對象使用呢?
方法一:直接調用,內部類修飾為publlic
  • 格式:外部類名.內部類名 對象名=外部類對象.內部類對象
package chart6;

public class demo6_7 {
	private int num=10;
	public class Inner{
		public void show(){
			System.out.println(num);
		}

//	public void method(){
//		Inner inner=new Inner();
//		inner.show();
//	}
	
	public static void main(String[] args){
//		方法一
		demo6_7.Inner inner= new demo6_7().new Inner();
		inner.show();
//		方法二
//		demo6_7 demo6_7=new demo6_7();
//		demo6_7.method();
	}

}

方法二:間接調用,內部類修飾為private,不允許外部直接調用
  • ​ 在外部類建立method()方法通過new調用內部類
  • ​ 在主函數通過new方法調用外部類的method()方法,層層遞進
package chart6;

public class demo6_7 {
	private int num=10;
	public class Inner{
		public void show(){
			System.out.println(num);
		}
	}
	public void method(){
		Inner inner=new Inner();
		inner.show();
	}
	
	public static void main(String[] args){
//		方法一
//		demo6_7.Inner inner= new demo6_7().new Inner();
//		inner.show();
//		方法二
		demo6_7 demo6_7=new demo6_7();
		demo6_7.method();
	}	
}

2.局部內部類:定義在方法內部,外界無法直接訪問

主函數想要調用內部類需要使用間接調用

調用邏輯:主函數->外部類.method()->內部類.show()

package chart6;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Outer {
	private int num=10;
	int num2=20;
	public void  method(){		
		
		class Inner{
			public void show(){
				System.out.println(num);
				System.out.println(num2);
			}
		};
//		創建內部類對象,並調用方法
		Inner inner=new Inner();
		inner.show();
	};
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer outer=new Outer();
		outer.method();
	}
}

局部內部類是在方法中定義的類,所以外界是無法直接使用,需要在方法內部創建對象並使用,該類可以直接訪問外部類的成員,也可以訪問方法內的局部變量

3.匿名內部類:本質是一個繼承了該類或者實現了該接口的子類匿名的對象

前提:存在一個類或者接口,這裡的類可以是具體類也可以是抽象類

格式:

new 類名或者接口名(){
	重寫方法;
}

樣例前提:匿名內部類需要實現的接口

package chart6;

public interface Inter {
	void show();

}

方法一:匿名內部類.show()方法

在method方法內部直接通過new定義一個Inter類,主函數想要調用內部類的show()需要在匿名內部類的尾部追加【.show()】才能實現,這樣做,如果想重複調用,則實現起來繁瑣。

調用邏輯:主函數->外部類.method()->內部類.show()【通過.show()直接調用】

package chart6;

import com.sun.webkit.ContextMenu.ShowContext;

public class Outer2 {
	
	public void method(){
//		方法一
		new Inter(){
			public void show(){
				System.out.println("匿名內部類");
			}
		}.show();
//		方法二
//		Inter inter=new Inter(){
//			public void show(){
//				System.out.println("匿名內部類");
//			}
//		};
//		inter.show();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer2 outer2=new Outer2();
		outer2.method();
	}

}

方法二:類對象=匿名內部類

在method方法內部直接通過new定義一個Inter類,主函數想要調用內部類的show(),需要將匿名內部類賦值給一個對象變量,通過這個變量調用show方法

調用邏輯:主函數->外部類.method()->內部類變量.show()【內部類賦值給變量調用show()】

package chart6;

import com.sun.webkit.ContextMenu.ShowContext;

public class Outer2 {
	
	public void method(){
//		方法一
//		new Inter(){
//			public void show(){
//				System.out.println("匿名內部類");
//			}
//		}.show();
//		方法二
		Inter inter=new Inter(){
			public void show(){
				System.out.println("匿名內部類");
			}
		};
		inter.show();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer2 outer2=new Outer2();
		outer2.method();
	}

}

問題重現,如果回答不出來,請回看

1.內部類的訪問特點?

2.成員內部類定義在哪裡?

3.成員內部類如何實現調用?提示:方法一、方法二

4.局部內部類定義在哪裡?

5.局部內部類如何實現調用?提示:方法一、方法二

6.匿名內部類本質?

7.匿名內部類如何實現調用?提示:方法一、方法二