public class Square { long width; public Square(long l) { width = l; } public static void main(String arg[]) { Square a, b, c; a = new Square(42L); b = new Square(42L); c = b; long s = 42L; } }
解答:html
這題考的是引用和內存。 //聲明瞭3個Square類型的變量a, b, c //在stack中分配3個內存,名字爲a, b, c Square a, b, c; //在heap中分配了一塊新內存,裏邊包含本身的成員變量width值爲48L,而後stack中的a指向這塊內存 a = new Square(42L); //在heap中分配了一塊新內存,其中包含本身的成員變量width值爲48L,而後stack中的b指向這塊內存 b = new Square(42L); //stack中的c也指向b所指向的內存 c = b; //在stack中分配了一塊內存,值爲42 long s = 42L;
來看4個選項:java
A: a == bthis
由圖能夠看出a和b指向的不是同一個引用,故A錯spa
B:s == acode
一個Square類型不能與一個long型比較,編譯就錯誤,故B錯htm
c:b == cblog
由圖能夠看出b和c指向的是同一個引用,故C正確內存
d:a equal s源碼
程序會把s封裝成一個Long類型,因爲Square沒有重寫Object的equals方法, 因此調用的是Object類的equals方法,源碼以下編譯
public boolean equals(Object obj) { return (this == obj); }
其實就是判斷兩個引用是否相等,故D也錯誤。