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(){
public void love() {
...
}
} ;
匿名內部類的本質:
就是繼承該抽象類或者實現了該介面的子類物件!