1. 程式人生 > >JAVA基礎(58)---內部類

JAVA基礎(58)---內部類

內部類

指的是定義在類的內部的類。

成員內部類

定義在類的內部,方法的外部的內部類,稱為成員內部類

區域性內部類

指的是定義在方法內的內部類,稱為區域性內部類。       

內部類的定義形式

                                                   class{
                                                            class{
           
                                                              }
                                                   }   

思考問題

       ①如何建立內部類的物件?
        外部類類名.內部類類名  物件名稱  = new 外部類().new 內部類();
        要產生內部類,首先需要產生外部類(內部類是外部類的一個成員,對於成員的訪問我們都需要物件)

       ②對於包含了內部類的類,編譯之後,會產生幾個.class位元組碼檔案?


          產生兩個位元組碼檔案
          內部類的位元組碼檔案的名稱為 外部類$內部類.class

      ③ 內部類能否訪問外部類的私有的成員屬性? 可以
           內部類的構成和普通類的構成是一樣,而且內部類能直接訪問外部類的成員,包括私有的成員

      ④ 內部類能否使用private  public  protected進行修飾


            可以。但是內部類使用private修飾之後,在其他類中訪問是不方便的

      ⑤對於內部類中宣告的變數,類似於外部類中的區域性變數,只能在內部類中使用,而不能在外部類中使用。

      ⑥區域性內部類不能在外部產生該內部類的物件,要產生該區域性內部類的物件,只能在方法內部產生。但是對於區域性內部類編譯之後也會產生兩個clas位元組碼檔案。對於區域性內部類,要想使用方法的區域性變數,那麼該變數一定是 final。jdk8 會自動為該變數新增 final 修飾

public class OutterClass {	
	private int num  = 10;
	private OutterClass.innerClass ic;
	
	public OutterClass() {
		
		System.out.println("outterclass  構造方法");
	}
	public void printInfo() {
		System.out.println(num );
		
	}
	
	
	private class innerClass{//成員內部類
		int a = 100;
		
		public innerClass() {
			System.out.println("innerClass  構造方法");
			
		}
		public void show() {
			num = 200;
			System.out.println(num);
			printInfo();
		}
		
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
	public OutterClass.innerClass getIc() {
		return ic;
	}
	public void setIc() {
		this.ic = new OutterClass().new innerClass();;
	}
	public static void main(String[] args) {
		OutterClass  oc = new OutterClass();
		OutterClass.innerClass ic = new OutterClass().new innerClass();
		System.out.println(oc);
		System.out.println(ic);
		System.out.println("-----------------------");
		ic.show();
	}
}
public class OutterClass2 {
	
	public void test() {
		
		final int num = 20;
		
		class methodInnerClass{
			public void show2() {
				System.out.println(num);
			}
			
		}
		methodInnerClass mc = new methodInnerClass();
		mc.show2();
		
	}
	
	public void demo() {

		
		
	}
	public static void main(String[] args) {
		OutterClass2 oc2 =new OutterClass2();
		oc2.test();
		
	}
}
public class Test {
	public static void main(String[] args) {
		OutterClass oc = new OutterClass();
		oc.setIc();
		Object obj = oc.getIc();
		System.out.println(obj);
	}
}