首頁 >Java >Java面試題 >Java的基礎面試題目(3)

Java的基礎面試題目(3)

(*-*)浩
(*-*)浩原創
2019-12-03 15:14:052104瀏覽

Java的基礎面試題目(3)

String s = new String("xyz");建立了幾個StringObject?是否可以繼承String類別?

兩個或一個都有可能,”xyz”對應一個對象,這個對象放在字串常數緩衝區,常數”xyz”不管出現多少遍,都是緩衝區中的那一個。                    (建議學習:java訪談題目

NewString每寫一遍,就建立一個新的對象,它使用常數」xyz」物件的內容來創造出一個新String物件。如果以前就用過'xyz',那麼這裡就不會創建”xyz”了,直接從緩衝區拿,這時創建了一個StringObject;

#但如果以前沒有用過"xyz",那麼此時就會建立一個物件並放入緩衝區,這種情況它會建立兩個物件。至於String類別是否繼承,答案是否定的,因為String預設final修飾,是不可繼承的。

String和StringBuffer的區別

JAVA平台提供了兩個類別:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。這個String類別提供了數值不可改變的字串。而這個StringBuffer類別提供的字串可以進行修改。

當你知道字元資料要改變的時候就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態建構字元資料。

下面這條語句總共建立了多少個物件:String s="a" "b" "c" "d";

#對於以下程式碼:

String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");

第一條語句印出的結果為false,第二條語句印出的結果為true,這說明javac編譯可以對字串常數直接相加的表達式進行最佳化,不必要等到運行期再去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常數相連的結果。

題目中的第一行程式碼被編譯器在編譯時最佳化後,相當於直接定義了一個”abcd”的字串,所以,上面的程式碼應該只創建了一個String物件。

寫如下兩行程式碼:

String s ="a" + "b" +"c" + "d";
System.out.println(s== "abcd");

最終列印的結果應該為true。

try {}裡有一個return語句,那麼緊接在這個try後面的finally{}裡的code會不會被執行,什麼時候被執行,在return前還是後?

我們知道finally{}中的語句是一定會執行的,那麼這個可能正常脫口而出就是return之前,return之後可能就出了這個方法了,鬼知道跑哪裡去了,但更準確的應該是在return中間執行,請看下面程式碼的運行結果:

public classTest {
    public static void main(String[]args) {
       System.out.println(newTest().test());;
    }
    static int test()
    {
       intx = 1;
       try
       {
          returnx;
       }
       finally
       {
          ++x;
       }
    }
  
}

---------執行結果---------

1

運行結果是1,為什麼呢?

主函數呼叫子函數並得到結果的過程,好比主函數準備一個空罐子,當子函數要回傳結果時,先把結果放在罐子裡,然後再將程式邏輯回到主函數。

所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什麼結果可言,結果是在說這話之前放進罐子裡的。

final, finally, finalize的區別。

final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類別不可繼承。內部類別要存取局部變量,局部變數必須定義成final類型。

finally是例外處理語句結構的一部分,表示總是執行。

finalize是Object類別的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆寫此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。但是JVM不保證此方法總被呼叫

運行時異常與一般異常有何異同?

異常表示程式運作過程中可能出現的非正常狀態,運行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見運行錯誤。 java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。

error和exception有什麼區別?

#error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況。 exception表示一種設計或實作問題。也就是說,它表示如果程式運作正常,從不會發生的情況。

簡單說說Java中的異常處理機制的簡單原理和應用。

異常是指java程式運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等訊息,可以用一個物件來表示。

Java使用物件導向的方式來處理異常,它把程式中發生的每個異常也都分別封裝到一個物件來表示的,該物件中包含有異常的資訊。

Java對異常進行了分類,不同類型的異常分別以不同的Java類別表示,所有異常的根類別為java.lang.Throwable,Throwable下面又派生了兩個子類別:

Error和Exception,Error表示應用程式本身無法克服和恢復的一種嚴重問題,程式只有奔潰了,例如,說記憶體溢出和線程死鎖等系統問題。

Exception表示程式也能夠克服和復原的問題,其中又分為系統異常和普通異常:

系統異常是軟體本身缺陷所導致的問題,也就是軟體開發人員考慮不周所導致的問題,軟體使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟體系統繼續運作或讓軟體掛掉。

例如,陣列腳本越界(ArrayIndexOutOfBoundsException),空指標例外(NullPointerException)、類別轉換例外(ClassCastException);

普通例外是運作環境的變化或例外所導致的問題,是使用者能夠克服的問題,例如,網路斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。

java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,所以普通異常也稱為checked異常,而係統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws聲明,所以系統異常也稱為unchecked異常。

Java 中堆疊和堆疊有什麼不同?

JVM 中堆疊和堆疊屬於不同的記憶體區域,使用目的也不同。棧常用於保存方法幀和局部變量,而物件總是在堆上分配。棧通常都比堆小,也不會在多個執行緒之間共享,而堆被整個 JVM 的所有執行緒共享。

堆疊:在函數中定義的一些基本類型的變數和物件的參考變數都是在函數的堆疊記憶體中分配,當在一段程式碼區塊定義一個變數時,Java就在堆疊中為這個變數分配記憶體空間,當超過變數的作用域後,Java 會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作它用。

堆:堆記憶體用來存放由 new 建立的物件和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。

在堆中產生了一個數組或物件之後,還可以在堆疊中定義一個特殊的變量,讓堆疊中的這個變數的取值等於數組或物件在堆疊記憶體中的首地址,棧中的這個變數就成了數組或物件的引用變量,以後就可以在程式中使用堆疊中的引用變數來存取堆中的數組或者對象,引用變數就等於是為數組或是物件起的一個名稱。

能強制 int 轉換為 byte 類型的變數嗎?如果該值大於 byte 類型的範圍,會出現什麼現象?

我們可以做強制轉換,但Java 中int 是32 位元的,而byte 是8 位元的,所以,如果強制轉化,int 類型的高24 位元將會被丟棄,因為byte類型的範圍是從-128 到128。

以上是Java的基礎面試題目(3)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn