1、使用final關鍵詞修飾一個變數時,是引用不能變,還是引用的變數不能變? 使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。例如,對於如下語句:final StringBuffer a=new StringBuffer("immutable"); ...
1、使用final關鍵詞修飾一個變數時,是引用不能變,還是引用的變數不能變?
使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。例如,對於如下語句:final StringBuffer a=new StringBuffer("immutable");
執行如下語句將報告編譯錯誤:a=new StringBuffer("");
但是執行如下則可以通過編譯:a.append("lallaal");
有人在定義方法的參數時,可能想採用如下形式來阻止方法內部修改傳進來的參數對象:
public void method(final StringBuffer param){},實際上,這是辦不到的,該方法在內部依舊可以修改對象參數。
2、靜態變數和實例變數的區別?
在語法定義上的區別:靜態變數需要static修飾,而實例變數則不需要。
在程式運行時的區別:實例變數屬於某個對象的屬性,必須創建了實例對象,其中的是合理變數才會被分配空間,才能使用這個實例變數。靜態變數不屬於某個實例對象,而是屬於類,也稱為類變數,只要程式載入了類的位元組碼,不用創建任何實例對象,靜態變數就會被分配記憶體空間,靜態變數就可以被使用。總之,實例變數必須創建對象後才可以通過這個對象使用,靜態變數則可以直接使類名引用。
3、是否可以從一個static方法內部發出對非static方法的調用?
不可以,因為非static方法是要和被創建對象關聯在一起的, 必須創建一個對象 後才可對非靜態方法調用,而static方法調用時不需要創建對象,可以直接調用。也就是說,當一個靜態方法被調用的時候,可能還沒創建任何實例對象,如果從static方法中發出對非static方法的調用,那非static方法無法確認是關聯到哪一個對象上。所以答案是不可以。
4、Integer和int的區別
int是java提供的8中原始數據類型之一。java為每一個原始數據類型提供了封裝類。Integer就是int的封裝類。int預設值為0,Integer預設值為null。前者無法表達出未賦值的狀態,後者可以區分。
5、Overload和Override的區別?Overloaded的方法是否可以改變返回值的類型?
Overload是重載,Overrid是覆蓋,也就是方法的重寫。
overload表示同一個類中可以有多個名稱相同的方法,但是這些方法的參數列表各不相同(參數個數或參數類型不同)。
重寫Override表示子類中的方法可以與父類中某個方法的名稱和參數完全相同,通過子類創建實例對象調用這個方式時,將調用子類中定義的方法,這相當於把父類中定義的方法完全覆蓋掉(這也是java多態一種體現)。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者比拋出父類異常的子類,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的許可權只能比父類更大,不能更小。如果父類中的方法時private修飾,子類則不存在覆蓋限制,相當於子類增加了一個全新的方法。
至於Overloaded的方法是否可以改變返回值的類型這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。但我估計你想問的問題是:如果兩個方法的參數列表完全一樣,是否可以讓它們的返回值不同來實現重載Overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候調用一個方法時也可以不定義返回結果變數,即不要關心其返回結果,例如,我們調用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變數,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調用哪個方法了,因為它無法通過返回結果類型來判斷。
覆蓋需要註意一下幾點:
a、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
b、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
c、覆蓋的方法所拋出的異常必須和被覆蓋方法所拋出的異常一致,或者是其子類;
d、被覆蓋的方法不能是被private修飾的方法,否則在其子類中只是定義了一個名字相同的新方法;
Overload需要註意的幾點:
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
6、abstractclass和interface語法上有什麼區別?
1.抽象類可以有構造方法,介面中不能有構造方法。
2.抽象類中可以有普通成員變數,介面中沒有普通成員變數
3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型可以是public,protected和(預設類型,雖然
eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public類型的,並且預設即為public abstract類型。
5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法
6. 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問類型可以任意,但介面中定義的變數只能是publicstatic final類型,並且預設即為publicstatic final類型。
7. 一個類可以實現多個介面,但只能繼承一個抽象類。
7、String、StringBuffer、StringBuilder的區別?
String字元串常量(final修飾,不可被繼承),String是常量,當創建之後即不可更改。
StringBuffer字元串變數,線程安全,也是final修飾,不允許被繼承,其中的絕大數方法都進行了同步處理,包括常用的appen方法也進行了同步處理(Synchronized),其toString方法會進行對象緩存,以減少元素的開銷。
1 public synchronized String toString() { 2 if (toStringCache == null) { 3 toStringCache = Arrays.copyOfRange(value, 0, count); 4 } 5 return new String(toStringCache, true); 6 }
StringBuilder字元串變數(非線程安全的)與StringBuffer一樣都繼承和實現了相同的介面和類,方法除了沒有進行同步處理(synchronize)以外基本一致,不同之處在於toString方法會返回一個對象
1 public String toString() { 2 // Create a copy, don’t share the array 3 return new String(value, 0, count); 4 }
8、ArrayList和LinkedList有什麼區別?
兩者都實現了list的介面,主要不同之處:
1、ArrayList是基於索引的數據介面,它的底層是數組,可以以O(1)的時間複雜度對元素進行隨機訪問,LinkedList是以元素列表的形式存儲它的數據,每一行元素否和它的前一個和後一個元素連接在一起,這種情況下查找的複雜度為O(n)。
2、相對ArrayList,LinkedList的插入、添加和刪除操作的速度快,因為元素被添加到集合中的任意位置是,不需要想數組那樣重新計算大小或者更新索引。
3、LinkedList比ArrayList更占記憶體,因為LinkedList為每一個節點存儲了兩個引用個,一個指向前一個元素,一個指向後一個元素。
9、講講類的實例化順序,比如父類靜態數據,構造函數,欄位,子類靜態數據,構造函數,欄位,當 new 的時候, 他們的執行順序。
父類的靜態變數-->父類的靜態代碼段-->子類的靜態變數-->子類的靜態代碼段-->父類的非靜態變數-->父類的構造函數-->子類的非靜態變數-->子類的構造函數。
10、