教面試官ReentrantLock源碼
632
2025-04-04
一、成員變量和局部變量的區別:
1:成員變量直接定義在類中。
局部變量定義在方法中,參數上,語句中。
2:成員變量在這個類中有效。
局部變量只在自己所屬的大括號內有效,大括號結束,局部變量失去作用域。
3:成員變量存在于堆內存中,隨著對象的產生而存在,消失而消失。
局部變量存在于棧內存中,隨著所屬區域的運行而存在,結束而釋放。
二、構造函數的定義和特點
定義:用于給對象進行初始化,是給與之對應的對象進行初始化,它具有針對性,函數中的一種。
特點:
1:構造函數的名稱和所在類的名稱相同。
2:不需要定義返回值類型。
3:該函數沒有具體的返回值。
記住:所有對象創建時,都需要初始化才可以使用。
注意事項:一個類在定義時,如果沒有定義過構造函數,那么該類中會自動生成一個空參數的構造函數,為了方便該類創建對象,完成初始化。如果在類中自定義了構造函數,那么默認的構造函數就沒有了。
三、構造函數和一般函數有什么區別呢?
1:兩個函數定義格式不同。
2:構造函數是在對象創建時,就被調用,用于初始化,而且初始化動作只執行一次。
一般函數,是對象創建后,需要調用才執行,可以被調用多次。
四、成員變量和靜態變量的區別:
1,成員變量所屬于對象。所以也稱為實例變量。
靜態變量所屬于類。所以也稱為類變量。
2,成員變量存在于堆內存中。
靜態變量存在于方法區中。
3,成員變量隨著對象創建而存在。隨著對象被回收而消失。
靜態變量隨著類的加載而存在。隨著類的消失而消失。
4,成員變量只能被對象所調用 。
靜態變量可以被對象調用,也可以被類名調用。
==所以,成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。==
五、靜態代碼塊:就是一個有靜態關鍵字標示的一個代碼塊區域,定義在類中。
作用:可以完成類的初始化。靜態代碼塊隨著類的加載而執行,而且只執行一次(new 多個對象就只執行一次)。如果和主函數在同一類中,優先于主函數執行。
Public:訪問權限最大。
static:不需要對象,直接類名即可。
void:主函數沒有返回值。
Main:主函數特定的名稱。
(String[] args):主函數的參數,是一個字符串數組類型的參數,jvm調用main方法時,傳遞的實際參數是 new String[0]。
六、繼承的好處(面向對象特征之一)
好處:
1:提高了代碼的復用性。
2:讓類與類之間產生了關系,提供了另一個特征多態的前提。
父類的由來:其實是由多個類不斷向上抽取共性內容而來的。
java中對于繼承,java只支持單繼承。java雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。
七、為什么不支持多繼承呢?
因為當一個類同時繼承兩個父類時,兩個父類中有相同的功能,那么子類對象調用該功能時,運行哪一個呢?因為父類中的方法中存在方法體。
但是java支持多重繼承。A繼承B B繼承C C繼承D。
多重繼承的出現,就有了繼承體系。體系中的頂層父類是通過不斷向上抽取而來的。它里面定義的該體系最基本最共性內容的功能。
所以,一個體系要想被使用,直接查閱該系統中的父類的功能即可知道該體系的基本用法。那么想要使用一個體系時,需要建立對象。建議建立最子類對象,因為最子類不僅可以使用父類中的功能。還可以使用子類特有的一些功能。
==簡單說:對于一個繼承體系的使用,查閱頂層父類中的內容,創建最底層子類的對象。 ==
八、super和this的用法
當子父類中出現一樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。
如果想要調用父類中的屬性值,需要使用一個關鍵字:super
This:代表是本類類型的對象引用。
Super:代表是子類所屬的父類中的內存空間引用。
注意:子父類中通常是不會出現同名成員變量的,因為父類中只要定義了,子類就不用再定義了,直接繼承過來用就可以了。
九、super( )和this( )是否可以同時出現的構造函數中?
兩個語句只能有一個定義在第一行,所以只能出現其中一個。
十、super( )或者this( )為什么一定要定義在第一行?
因為super( )或者this( )都是調用構造函數,構造函數用于初始化,所以初始化的動作要先完成。
十一、final的特點
1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。
2:被final修飾的類是一個最終類,不可以被繼承。
3:被final修飾的方法是一個最終方法,不可以被覆蓋。
4:被final修飾的變量是一個常量,只能賦值一次。
其實這樣的原因的就是給一些固定的數據起個閱讀性較強的名稱。 不加final修飾不是也可以使用嗎?那么這個值是一個變量,是可以更改的。加了final,程序更為嚴謹。
常量名稱定義時,有規范,所有字母都大寫,如果由多個單詞組成,中間用_ 連接。
十二、抽象類的特點
1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以描述類和方法,不可以描述變量)。
2:抽象方法只定義方法聲明,并不定義方法實現。
3:抽象類不可以被創建對象(實例化)。
4:只有通過子類繼承抽象類并覆蓋了抽象類中的所有抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。
十三、接口都用于設計上的特點:(可以理解主板上提供的接口)
1:接口是對外提供的規則。
2:接口是功能的擴展。
3:接口的出現降低了耦合性。
十四、抽象類與接口的定義
抽象類:一般用于描述一個體系單元,將一組共性內容進行抽取,特點:可以在類中定義抽象內容讓子類實現,可以定義非抽象內容讓子類直接使用。它里面定義的都是一些體系中的基本內容。
接口:一般用于定義對象的擴展功能,是在繼承之外還需這個對象具備的一些功能。
十五、抽象類和接口的區別和聯系
抽象類和接口的共性:都是不斷向上抽取的結果。
抽象類和接口的區別:
1:抽象類只能被繼承,而且只能單繼承。
接口需要被實現,而且可以多實現。
2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。
接口中都有抽象方法,需要子類去實現。
3:抽象類使用的是 is a 關系。
接口使用的 like a 關系。
4:抽象類的成員修飾符可以自定義。
接口中的成員修飾符是固定的。全都是public的。
十六、多 態(面向對象特征之一)★★★★★
函數本身就具備多態性,某一種事物有不同的具體的體現。
體現:父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();
多態的好處:提高了程序的擴展性。
多態的弊端:當父類引用指向子類對象時,雖然提高了擴展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產生的功能,即訪問的局限性)
多態的前提:
1:必須要有關系,比如繼承、實現。
2:通常會有覆蓋操作。
十七、Object類
所有類的直接或者間接父類,Java認為所有的對象都具備一些基本的共性內容,這些內容可以不斷的向上抽取,最終就抽取到了一個最頂層的類中的,該類中定義的就是所有對象都具備的功能。
具體方法:
1,boolean equals(Object obj):用于比較兩個對象是否相等,其實內部比較的就是兩個對象地址。
而根據對象的屬性不同,判斷對象是否相同的具體內容也不一樣。所以在定義類時,一般都會復寫equals方法,建立本類特有的判斷對象是否相同的依據。
public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p = (Person)obj; return this.age == p.age; }
2,String toString():將對象變成字符串;默認返回的格式:類名@哈希值 = getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
為了對象對應的字符串內容有意義,可以通過復寫,建立該類對象自己特有的字符串表現形式。
public String toString(){ return "person : "+age; }
3,Class getClass():獲取任意對象運行時的所屬字節碼文件對象。
4,int hashCode():返回該對象的哈希碼值。支持此方法是為了提高哈希表的性能。
==通常equals,toString,hashCode,在應用中都會被重寫,建立具體對象的特有的內容。==
十八、匿名內部類
沒有名字的內部類。就是內部類的簡化形式。一般只用一次就可以用這種形式。匿名內部類其實就是一個匿名子類對象。想要定義匿名內部類:需要前提,內部類必須繼承一個類或者實現接口。
匿名內部類的格式:new 父類名&接口名(){ 定義子類成員或者覆蓋父類方法 }.方法。
匿名內部類的使用場景:
當函數的參數是接口類型引用時,如果接口中的方法不超過3個。可以通過匿名內部類來完成參數的傳遞。
其實就是在創建匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個以內。
//1 new Object(){ void show(){ System.out.println("show run"); } }.show(); //2 Object obj = new Object(){ void show(){ System.out.println("show run"); } }; obj.show();
1和2的寫法正確嗎?有區別嗎?說出原因。
寫法是正確的,1和2都是在通過匿名內部類建立一個Object類的子類對象。
區別: 第一個可是編譯通過,并運行。 第二個編譯失敗,因為匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提升為了 Object類型,而編譯時檢查Object類中是否有show方法,所以編譯失敗。
十九、異 常★★★★
異常:就是不正常。程序在運行時出現的不正常情況。其實就是程序中出現的問題。這個問題按照面向對象思想進行描述,并封裝成了對象。因為問題的產生有產生的原因、有問題的名稱、有問題的描述等多個屬性信息存在。當出現多屬性信息最方便的方式就是將這些信息進行封裝。異常就是java按照面向對象的思想將問題進行對象封裝。這樣就方便于操作問題以及處理問題。
出現的問題有很多種,比如下標越界,空指針等都是。就對這些問題進行分類。而且這些問題都有共性內容比如:每一個問題都有名稱,同時還有問題描述的信息,問題出現的位置,所以可以不斷的向上抽取。形成了異常體系。
try {
需要被檢測的代碼;
}
catch(異常類 變量名){
異常處理代碼;
}
fianlly{
一定會執行的代碼;
}
二十、throw 和throws關鍵字的區別
throw用于拋出異常對象,后面跟的是異常對象;throw用在函數內。
throws用于拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。throws用在函數上。
通常情況:函數內容如果有throw,拋出異常對象,并沒有進行處理,那么函數上一定要聲明,否則編譯失敗。但是也有特殊情況。
二十一、有哪些異常,它們的區別
異常的分類:
1:編譯時被檢查的異常,只要是Exception及其子類都是編譯時被檢測的異常。
2:運行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是運行異常,也就說這個異常是編譯時不被檢查的異常。
編譯時被檢查的異常和運行時異常的區別:
編譯被檢查的異常在函數內被拋出,函數必須要聲明,否編譯失敗。
聲明的原因:是需要調用者對該異常進行處理。
運行時異常如果在函數內被拋出,在函數上不需要聲明。
不聲明的原因:不需要調用者處理,運行時異常發生,已經無法再讓程序繼續運行,所以,不讓調用處理的,直接讓程序停止,由調用者對代碼進行修正。
==常見異常:==
1、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串;
2、空指針異常(NullPointerException)
3、類型轉換異常:ClassCastException
4、沒有這個元素異常:NullPointerException
5、不支持操作異常;
異常要盡量避免,如果避免不了,需要預先給出處理方式。比如家庭備藥,比如滅火器。
二十二、訪問修飾符的范圍
菩提本無樹,明鏡亦非臺。本來無疑物,何處染塵埃。--六祖慧能
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。