物件導向之內部類

檮杌墨色發表於2020-10-17

1.許可權修飾符的許可權問題

分別闡述一下四個許可權修飾符在不同情況下的訪問許可權問題?

	private(私有的):只能在同一個包下的本類中使用
	預設修飾符:只能在同一個包下的本類和子類中使用
	piotected(受保護的):可以再同一個包下的本類和子類中,也可以在不同包下的子類中	
	public(公共的,訪問許可權最大):在相同包中和不同包中都可以使用

2.包中的編譯執行

描述下在同一個包下和在包下針對Java原始檔進行編譯和執行的過程
	
	在同一個包下:
		手動:
			1)先進入到xxx.java檔案所在的目錄中,使用javac對java原始檔進行編譯,會產生xxx.class檔案
			2)手動方式建立對應包目錄,
			3)1)編譯後的 xxx.class檔案放在2)中的子資料夾中
			4)執行(帶上包執行)
		自動:
			1)針對原始檔進行編譯,javac -d(跟上引數).java原始檔,class檔案儲存到指定的包下
			2)直接執行即可,java 包名.類名
	在不同包下:
			1)將當前被匯入的類進行編譯
			2)進入到當前目錄下
			3)直接執行java包名.類名

3.形式引數與返回值是引用型別

形式引數如果是具體類,抽象類,以及介面型別,實際引數如何傳遞
	
	  形式引數是具體類:實際引數需要傳遞具體類的物件
	  形式引數是抽象類:實際引數需要傳遞該抽象類的具體實現子類物件
	  形式引數是介面:實際引數需要傳遞介面類具體子實現類物件
          
          
返回值是具體類,抽象類,以及介面型別,該方法如何返回?          
	  返回值是具體類:需要返回該具體類物件
	  返回值是抽象類:需要返回該抽象類的具體實現子類物件
	  返回值是介面:需要返回該介面的具體子實現類物件

4.內部類問題

訪問的方式:
        內部類的成員直接可以訪問外部類的成員包括私有!

        外部類的成員向訪問成員內部類的成員的時候,不能直接訪問,而要通過內部類物件訪問
		
想訪問外部類中的成員內部類的成員方法的訪問方式:
 
  	固定格式:
    外部類名.內部類名 物件名  = 外部類物件.內部類物件;
    
    
    
成員內部類中的修飾符:
		private:保證的資料安全性
  

static修飾: 有什麼特點?
  
  		將靜態的成員內部類看成是外部類的靜態成員!
  
  		靜態的成員內部類的成員方法(靜態的還是非靜態),只能訪問外部類的靜態成員!
 
         如果成員內部類是一個靜態的,通過外部類訪問靜態的成員內部類的成員方法,訪問方式:
        外部類名.內部類名 物件名  = new 外部類名.內部類名() ;
 
 
靜態的內部成員類:
 	外部類名.內部類名 物件名  = new 外部類名.內部類名() ;

5.內部類的另一種形式

內部類另一種形式:
  		區域性內部類:在區域性位置中定義的類
  
   區域性內部類的成員可以直接訪問外部類的成員,包括私有
  
   外部類成員方法如何訪問區域性內部類的成員?
   在當前外部類的成員方法中,只需要建立內部類物件呼叫它的方法
  

6.面試題

區域性內部類訪問區域性變數的時候,為什麼JDK7(JDK7以前,包含JDK7版本)將區域性變數使用final修飾?
  								JDK8版本已經區域性變數做了優化(已經定義了final修飾)
  
區域性變數的生命週期:隨著方法呼叫而存在,隨著方法呼叫完畢而消失,
    由於當前區域性內部類中的成員方法還在使用區域性變數,間接通過了外部類的成員方法中建立內部類物件
    訪問內部類的成員方法---訪問區域性變數,物件不會立即被回收,需要等待GC空閒時候回收,內部類的成員方法
    還在訪問,需要將當前區域性變數定義為常量---記憶體中固定值!

7.匿名內部類

匿名內部類:
 		它是內部類的一種簡化格式
    沒有具體類名
  
格式:
  		new 類名(抽象類類名)/介面名(){
  
  				重寫方法....
  		};
  舉例:
  		new Person(){  //Person:抽象類   
  				//重寫方法
  				public void love() {
  						...
 				}
  		} ;
  
  
  
匿名內部類的本質:
  	就是繼承該抽象類或者實現了該介面的子類物件!

相關文章