天天看點

SCJP_104——題目分析(4)

14. which three are valid declaraction of a float? adf

a. float foo=-1;

b. float foo=1.0;

c. float foo=42e1;

d. float foo=2.02f;

e.

float foo=3.03d;

f. float foo=0x0123;

這一題考的是 java 的基本資料類型和類型轉換。

在 java 中規定,整數字面值預設為 int 類型,浮點數字面值預設為 double 類型。

a:-1 是 int 類型,可以自動轉換成 float 類型。

b:1.0 是 double 類型,高位向低位轉換,會丢失精度,java 不允許這樣的轉換,除非進行強制轉換。

c:42e1 是 double 了性,理由同上。

d:答案正确。

e:3.03d 是 double 類型。

f:0x0123 是整數291,會自動進行類型轉換。

是以答案是:adf

16.

1) public class test{

2) public static void main(string args[]){

3) int i=0xfffffff1;

4) int j=~i;

5)

6) }

7) }

which is decimal value of j at line 5? 

a. 0 b.1 c.14 d.-15 e.

compile error at line 3

這裡考察的是 java 中的進制轉換和位運算符

0xfffffff1 是十六進制,轉換成 2 進制是 1111 1111 1111 0001

同時 ~ 是取補碼的運算,也就是 0 變 1,1 變 0,運算後的結果是 0000 0000 0000 1110,轉換成 10 進制是 14。

是以正确答案是:c

17.

float f=4.2f;

float g=new float(4.2f);

double d=new

double(4.2);

which are true?

a. f==g     b. g==g    

 c. d==f      d. d.equals(f)     e d.equals(g)

    f. g.equals(4.2);

這裡考察了 java 中的對象引用、==、equals 的知識點

f 表示 float 變量的名字,g 表示對象的引用,是以 f == g ,這樣的比較是不合法的

g 是一個指向 double 的引用,g == g,g 肯定是等于 g,是以正确。

d == f 和 f == g 類似,也是不合法的

equals,這裡要注意,要和 == 區分開來,重點說明一下 == 和 equals 之間的差別。

首先要說 java 中的資料類型。在 java 中有兩種資料類型:基本資料類型和引用資料類型。

基本資料類型包括:

  byte、short、int、char、long、float、double、boolean

它們之間的比較應該用 == 進行比較,比較的是它們的值。

除了這 8 中基本資料類型以外的資料類型,都叫引用資料類型。所謂引用,就是記憶體中的位址。因為在 java

中,為了安全,用一個類似指針的東西來指向存放資料的記憶體位址。是以對引用資料類型來說,當使用 == 進行比較的時候,比較的是記憶體中的位址。

是以,除非兩個引用變量指向同一個記憶體位址,使用 == 進行比較才能得到 true,否則就是 false

java 當中所有的類都是繼承于object這個基類的,在object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的記憶體地

址,但在一些類庫當中這個方法被覆寫掉了,如string,integer,date在這些類當中equals有其自身的實作,而不再是比較類在堆記憶體中的存放位址了。 

下面說幾個例子,看看 equals 和 ==  差別

例子1:

輸出結果:

在稍微改動下程式

例子2:

輸出結果

結果為什麼會是這樣?

這裡涉及到了一個字元串緩存池的概念。

原來,程式在運作的時候,會建立一個字元串緩存池。當使用 string s2 = "monday"

建立一個字元串的時候,程式首先會在字元串緩沖池中尋找相同值的對象。而之前已經建立了一個 s1 對象,是以在 s2 被建立的時候,程式找到了具有相同值的

s1。這樣一來,s1 和 s2 就有了相同的位址。是以就有了例子 1 中的輸出結果。

在例子 2 中,s4 使用了關鍵字 new,在記憶體開辟了一個空間用來存放 "monday",s4 指向這個記憶體位置。是以結果就很明顯了。

參考資料:http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html

感謝參考資料作者的辛勤勞動