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
感謝參考資料作者的辛勤勞動