天天看點

Java基礎面試題-4

(1)抽象類中可以定義構造函數,接口不能定義構造函數;

(2)抽象類中可以有抽象方法和具體方法,而接口中隻能有抽象方法(public abstract);

(3)抽象類中的成員權限可以是public、default、protected(抽象類中抽象方法就是為了重寫,是以不能用private修飾);而接口中的成員隻可以是public(方法預設:public abstract、成員變量預設:public static final);

(4)抽象類中可以包含靜态方法,而接口中不可以包含靜态方法;

(1)在JDK8中,允許在接口中包含帶有具體實作的方法,使用default修飾,這類方法就是預設方法。

(2)在JDK8中,接口可以包含靜态方法(之前不可以包含靜态方法是因為,接口不能實作方法,隻可以定義方法,而靜态方法必須實作在接口中。)現在可以包含了,也隻能直接用接口調用靜态方法。但仍然不可以包含靜态代碼塊。靜态方法與.class 檔案相關,隻能使用接口名調用,不可以通過實作類的類名或者實作類的對象調用。

靜态變量:是被static修飾的變量,也稱為類變量,它屬于類,是以不管建立多少對象,靜态變量在記憶體中有且僅有一個拷貝;靜态變量可以實作讓多個對象共享記憶體。

執行個體變量:屬于某一執行個體,需要先建立對象,然後通過對象才能通路到它。

對于short s1 = 1; s1 = s1+1;來說,在s1+1運算時會自動提升表達式的類型為int,那麼将int型值指派給short型變量,s1會出現類型轉換錯誤。

對于short s1 = 1; s1 += 1;來說,+=是Java語言規定的運算符,Java編譯器會對它進行特殊處理,是以可以正确編譯。

(1)int是Java的八種基本資料類型之一,而Integer是Java為int類型提供的封裝類;

(2)int型變量的預設值是0,Integer變量的預設值是null;

(3)Integer變量必須執行個體化後才可以使用,而int不需要;

(1)由于Integer變量實際上是對一個Integer對象的飲用,是以兩個通過new生成的Integer變量永遠是不相等的,因為其記憶體位址是不同的;

(2)Integer變量和int變量比較時,隻要兩個變量的值是相等的,則結果為true。因為包裝類Integer和基本資料類型int類型進行比較時,Java會自動拆包類為int,然後進行比較,實際上就是兩個int型變量進行比較;

(3)非new生成的Integer變量和new Integer() 生成的變量進行比較時,結果為false。因為非new生成的Integer變量指向的是Java常量池中的對象,而new Integer() 生成的變量指向堆中建立的對象,兩者在記憶體中的位址不同;

(4)對于兩個非new生成的Integer對象進行比較時,如果兩個變量的值在區間[-128,127]之間,則比較結果為true,否則為false。Java在編譯Integer i = 100時,會編譯成Integer i = Integer.valueOf(100), 而Integer類型的源碼如下所示:

從上面的代碼中可以看出:Java對于[-128,127]之間的數會進行緩存,比如:Integer i = 127,會将127進行緩存,下次再寫Integer j = 127時,就會從緩存中取出,而對于這個區間之外的數就需要new了。

Boolean:全部緩存

Byte:全部緩存

Character:<= 127 緩存

Short:-128 — 127 緩存

Long:-128 — 127 緩存

Integer:-128 — 127 緩存

Float:沒有緩存

Double:沒有緩存

自動裝箱是Java編譯器在基本資料類型和對應的包裝類之間做的一個轉換。例如:将int轉換成Integer、double轉換成Double等等。反之則為自動拆箱。

基本資料類型:boolean、char、byte、short、int、long、float、double

封裝類型:Boolean、Character、Byte、Short、Integer、Long、Float、Double

文法:

參數:

i -- Integer 對象的整數。

s -- Integer 對象的字元串。

radix --在解析字元串 s 時使用的進制數,用于指定使用的進制數。

傳回值:

Integer valueOf(int i):傳回一個表示指定的 int 值的 Integer 執行個體。

Integer valueOf(String s):傳回儲存指定的 String 的值的 Integer 對象。

Integer valueOf(String s, int radix): 傳回一個 Integer 對象,該對象中儲存了用第二個參數提供的基數進行解析時從指定的 String 中提取的值。

執行個體

編譯以上程式,輸出結果為:

注意:

在這裡隻解釋一下為什麼Double類的valueOf方法會采用與Integer類的valueOf方法不同的實作。很簡單:在某個範圍内的整型數值的個數是有限的,而浮點數卻不是。

Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實作是類似的。

Double、Float的valueOf方法的實作是類似的。

xxxValue() 方法用于将 Number 對象轉換為 xxx 資料類型的值并傳回。

相關的方法有:

類型

方法及描述

byte

byteValue() :以 byte 形式傳回指定的數值。

abstract double

doubleValue() :以 double 形式傳回指定的數值。

abstract float

floatValue() :以 float 形式傳回指定的數值。

abstract int

intValue() :以 int 形式傳回指定的數值。

abstract long

longValue() :以 long 形式傳回指定的數值。

short

shortValue() :以 short 形式傳回指定的數值。

以上各函數不接受任何的參數。

轉換為 xxx 類型後該對象表示的數值。