記錄一些遇到的不錯的筆試題
1、
下列 java 程式輸出結果為______。int i=0;Integer j = new Integer(0);System.out.println(i==j);System.out.println(j.equals(i));
答案:true true
解析:
本題是一個自動拆裝箱的考題(自動拆裝箱JDK需在1.5上)
1、基本型和基本型封裝型進行“==”運算子的比較,基本型封裝型將會自動拆箱變為基本型後再進行比較,因此Integer(0)會自動拆箱為int類型再進行比較,顯然返回true;
2、兩個Integer類型進行“==”比較,如果其值在-128至127,那麼返回true,否則返回false, 這跟Integer.valueOf()的緩衝對象有關,這裡不進行贅述。
3、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
4、基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換為其封裝類型,再進行3中的比較。
int a=257;Integer b=257;Integer c=257;Integer b2=57;Integer c2=57;System.out.println(a==b);//System.out.println(a.equals(b)); 編譯出錯,基本型不能調用equals()System.out.println(b.equals(257.0));System.out.println(b==c);System.out.println(b2==c2);
上面的代碼的結果因此為 true, false, false, true 2、
下面程式輸出結果是__
public class Test { public static void main(String [] args){ System.out.println(new B().getValue()); } static class A{ protected int value; public A(int v) { setValue(v); } public void setValue(int value){ this.value = value; } public int getValue(){ try{ value++; return value; } catch(Exception e){ System.out.println(e.toString()); } finally { this.setValue(value); System.out.println(value); } } } static class B extends A{ public B() { super(5); setValue(getValue() - 3); } public void setValue(int value){ super.setValue(2 * value); } } }
答案:22 34 17
解析:
最關鍵的一點是:super(5) //調用了父類構造器,其中建構函式裡面的setValue(value),由於子類有重寫,所以調用的是子類的setValue方法 3、
閱讀下列程式,選擇哪一個是正確的輸出結果
class HelloA{public HelloA() { System.out.println("I’m A class "); } static { System.out.println("static A"); }}public class HelloB extends HelloA{ public HelloB() { System.out.println("I’m B class"); } static{ System.out.println("static B"); } public static void main (String[] args){ new HelloB(); }}
結果:
static A static B I’m A class I’m B class
解析:
該題目中的執行順序:
父類的靜態變數和靜態塊賦值(按照聲明順序)
自身的靜態變數和靜態塊賦值(按照聲明順序)
父類成員變數和塊賦值(按照聲明順序)
父類構造器賦值
自身成員變數和塊賦值(按照聲明順序)
自身構造器賦值
類的靜態代碼塊是屬於類層級,執行優先順序高於普通代碼塊>建構函式。總結就是:父類的靜態代碼塊(包括靜態變數賦值)優先執行,然後執行自身的靜態代碼塊,然後執行父類的普通代碼塊,再執行父類的建構函式,然後執行自身的普通代碼塊,再執行自身的建構函式。 4、
關於下面程式碼片段敘述正確的是()
byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6);
A 、輸出結果:13
B 、語句:b6=b4+b5編譯出錯
C、語句:b3=b1+b2編譯出錯
D、運行期拋出異常
正確答案C。
解析:
為什麼不選擇B,是因為b4、b5被final修飾,所以在運算的時候,不會被升級為int類型,而b1和b2在啟動並執行 時候被升級成了int類型,而b3是byte類型,類型不符。 5、
以下代碼在編譯和運行過程中會出現什麼情況
public class TestDemo{ private int count; public static void main(String[] args) { TestDemo test=new TestDemo(88); System.out.println(test.count); } TestDemo(int a) { count=a; }}
A、編譯運行通過,輸出結果是88
B、編譯時間錯誤,count變數定義的是私人變數
C、編譯時間錯誤,System.out.println方法被調用時test沒有被初始化
D、編譯和執行時沒有輸出結果
正確答案:A
解析:
私人變數外部無法訪問,這個外部指的是類的外部,而這裡的main方法是在大類TestDemo的內部,所以說是可以訪問到的。有如下代碼:
public class Demo2 { private int count; public Demo2(int a){ count = a; } public static void main(String[] args) { Demo2 d = new Demo2(88); System.out.println(d.count);//正常運行,無報錯 P p = new P(88); System.out.println(p.count);//此行編譯期間報錯,私人變數訪問不到 }}class P{ private int count; public P(int a){ count = a; }}
6、
以下程式輸出結果是什麼。
class TestA { public void printValue(){ System.out.println("Test01"); }}class TestB extends TestA{ public void printValue(){ System.out.println("TestB"); }}public class Test01 { public static void main(String[] args) { TestB b = new TestB(); b.printValue(); TestA a = (TestA)b;//類型轉換 a.printValue(); }}
輸出結果:
TestB
TestB
解析:
這裡關鍵是類型轉換那一行,由於b本身的定義是TestB類型,這裡沒發轉成TestA類型,輸出仍然是“TestB”