java筆試題

  • 在基本JAVA類型中,如果不明確指定,整數型的默認是什么類型?帶小數的默認是什么類型?(int double)

  • 下列關于java 中的 wait()方法和 sleep()方法的區別描述錯誤的是?(D)

A.wait()方法屬于Object類,sleep()屬于Thread類
B.調用wait()方法的時候,線程會放棄對象鎖
C.調用sleep()方法的過程中,線程不會釋放對象鎖
D.sleep()方法導致了程序暫停執行指定的時間,讓出cpu給其他線程

解析:
sleep和wait的區別有:
1,這兩個方法來自不同的類分別是Thread和Object
2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞線程可以使用同步控制塊或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

  • 下列說法正確的是(B)

A.在類方法中可用this來調用本類的類方法
B.在類方法中調用本類的類方法時可直接調用
C.在類方法中只能調用本類中的類方法
D.在類方法中絕對不能調用實例方法

解析:所謂類的方法就是指類中用static 修飾的方法(非static 為實例方法),在類方法中不能有關鍵字

  • try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后

答:會執行,在return前執行

  • 以下代碼將打印出

public static void main (String[] args) {
String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
System.out.println(classFile);
}
A.com. jd
B.com/jd/MyClass.class
C./////////MyClass.class
D.com.jd.MyClass

解析:
C。由于replaceAll方法的第一個參數是一個正則表達式,而"."在正則表達式中表示任何字符,所以會把前面字符串的所有字符都替換成"/"。如果想替換的只是".",那么久要寫成"\.".

  • 代碼片段

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
關于上面代碼片段敘述正確的是(C)
A.輸出結果:13
B.語句:b6=b4+b5編譯出錯
C.語句:b3=b1+b2編譯出錯
D.運行期拋出異常
解析:被final修飾的變量是常量,這里的b6=b4+b5可以看成是b6=10;在編譯時就已經變為b6=10了
而b1和b2是byte類型,java中進行計算時候將他們提升為int類型,再進行計算,b1+b2計算后已經是int類型,賦值給b3,b3是byte類型,類型不匹配,編譯不會通過,需要進行強制轉換。
Java中的byte,short,char進行計算時都會提升為int類型。

  • Which are keywords in Java?(DE)

A.null
B.true
C.sizeof
D.implements
E.instanceof

解析

image.png

  • Java程序可以分為兩類:java application 和java applet。前者是完整的應用程序,需要獨立的解釋器來解釋運行;后者則是嵌在網頁中的非獨立程序,由瀏覽器所自帶的java解釋器來解釋運行。

  • 關于以下application,說法正確是什么?(B)

public class Test {
static int x=10;
static {x+=5;}
public static void main(String[] args) //4
{
System.out.println("x="+x);
}
static{x/=3;};
}//9

A.4行與9行不能通過編譯,因為缺少方法名和返回類型
B.編譯通過,執行結果是:x=5
C.編譯通過,執行結果是:x=3
D.9行不能通過編譯,因為只能有一個靜態初始化器

解析:靜態塊:用static申明,JVM加載類時執行,僅執行一次,且按聲明順序執行
構造塊:類中直接用{}定義,每一次創建對象時執行
執行順序優先級:靜態塊>main()>構造塊>構造方法

Java初始化順序:
1 繼承體系的所有靜態成員初始化(先父類,后子類)
2 父類初始化完成(普通成員的初始化-->構造函數的調用)
3 子類初始化(普通成員-->構造函數)

  • 如下代碼的 輸出結果是什么?(D)

public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}

A.0
B.1
C.2
D.編譯失敗

解析:靜態變量只能在類主體中定義,不能在方法中定義

  • 對Collection和Collections描述正確的是(BD)

A.Collection是java.util下的類,它包含有各種有關集合操作的靜態方法
B.Collection是java.util下的接口,它是各種集合結構的父接口
C.Collections是java.util下的接口,它是各種集合結構的父接口
D.Collections是java.util下的類,它包含有各種有關集合操作的靜態方法

解析:java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。
java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務于Java的Collection框架。

  • 下列正確的有( ACD)

A.call by value不會改變實際參數的數值
B.call by reference能改變實際參數的參考地址
C.call by reference不能改變實際參數的參考地址
D.call by reference能改變實際參數的內容

解析:引用數據類型是引用傳遞(call by reference),基本數據類型是值傳遞(call by value)

  • 下列關于Java語言中String和char的說法,正確的是(C)

A.String是Java定義的一種基本數據類型。
B.String是以“\0”結尾的char類型的數組char[]。
C.使用equals()方法比較兩個String是否內容一樣(即字符串中的各個字符都一樣)。
D.Char類型在Java語言里面存儲的是ASCII碼。

解析:A 基本數據類型包括byte,short,int,long,float,double,char,boolean,所以A錯。
B,C語言當中是這樣,java不是, String內部是用char[]數組實現的,不過結尾不用\0。
C 對,字符串內容比較用equals方法。
D char存儲的unicode碼,不僅可以存儲ascII碼,漢字也可以。

  • 下列Java代碼中的變量a、b、c分別在內存的____存儲區存放。(C)

class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}

A.堆區、堆區、堆區
B.堆區、棧區、堆區
C.堆區、棧區、棧區
D.堆區、堆區、棧區
E.靜態區、棧區、堆區
F.靜態區、棧區、棧區
解析:
a是類中的成員變量,存放在堆區
b、c都是方法中的局部變量,存放在棧區
堆區:只存放類對象,線程共享;
方法區:又叫靜態存儲區,存放class文件和靜態數據,線程共享;
棧區:存放方法局部變量,基本類型變量區、執行環境上下文、操作指令區,線程不共享;

  • 在Java語言中,下列關于字符集編碼(Character set encoding)和國際化(i18n)的問題,哪些是正確的?(CD)

A.每個中文字符占用2個字節,每個英文字符占用1個字節
B.假設數據庫中的字符是以GBK編碼的,那么顯示數據庫數據的網頁也必須是GBK編碼的。
C.Java的char類型,通常以UTF-16 Big Endian的方式保存一個字符。
D.實現國際化應用常用的手段是利用ResourceBundle類

解析:
A 顯然是錯誤的,Java一律采用Unicode編碼方式,每個字符無論中文還是英文字符都占用2個字節。
B 也是不正確的,不同的編碼之間是可以轉換的,通常流程如下:
將字符串S以其自身編碼方式分解為字節數組,再將字節數組以你想要輸出的編碼方式重新編碼為字符串。
例:String newUTF8Str = new String(oldGBKStr.getBytes("GBK"), "UTF8");
C 是正確的。Java虛擬機中通常使用UTF-16的方式保存一個字符
D 也是正確的。ResourceBundle能夠依據Local的不同,選擇性的讀取與Local對應后綴的properties文件,以達到國際化的目的。

  • 類中聲明的變量有默認初始值;方法中聲明的變量沒有默認初始值,必須在定義時初始化,否則在訪問該變量時會出錯。

boolean類型默認值是false

  • 結果是(B)

public class Example{
String str = new String("good");
char[] chs = {'a','b','c'};
public static void main(String[] args) //4
{
Example ex = new Example(); ex.change(ex.str, ex.chs);
System.out.print(ex.str+" and ");
System.out.print(ex.chs);
}
public void change(String str, char[] chs){
str= "test ok";
chs[0] = 'g';
}
}

A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
解析:
首先明確 這里str和數組都是對象都是引用傳遞
,首先得清楚類中的str和change方法中的str都是指向堆中的new String("
good"
)對象,但是它們不是同一個東西,類似于指向同一個對象的不同的指針。首先str="test ok"
使得change()中的str指向"test ok"這個常量字符串(也可以說這個字符串對象),根本的原因就是
由于java字符串對象是不能修改的,無法像數組一樣可以在原來的地址上對數組的值進行修改。
但是原來的類中的str指向的還是
new String("
good"
)這個對象,chs[0] = 'g',把原來chs[0]中的'a'改為'g'。
所以就會出現上面的結果

  • 以下關于final關鍵字說法錯誤的是(AC)

A.final是java中的修飾符,可以修飾類、接口、抽象類、方法和屬性
B.final修飾的類肯定不能被繼承
C.final修飾的方法不能被重載
D.final修飾的變量不允許被再次賦值

解析:
final修飾類、方法、屬性!不能修飾抽象類,因為抽象類一般都是需要被繼承的,final修飾后就不能繼承了。
final修飾的方法不能被重寫而不是重載!
final修飾屬性,此屬性就是一個常量,不能被再次賦值!

  • 關于sleep()和wait(),以下描述錯誤的一項是( D)

A.sleep是線程類(Thread)的方法,wait是Object類的方法;
B.sleep不釋放對象鎖,wait放棄對象鎖
C.sleep暫停線程、但監控狀態仍然保持,結束后會自動恢復
D.wait后進入等待鎖定池,只有針對此對象發出notify方法后獲得對象鎖進入運行狀態

解析:
Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處于可運行狀態,但是只有一個線程在運行。
共同點 :

  1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,并返回。
  2. wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀態 ,從而使線程立刻拋出InterruptedException。
    如果線程A希望立即結束線程B,則可以對線程B對應的Thread實例調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結束線程。
    需要注意的是,InterruptedException是線程自己從內部拋出的,并不是interrupt()方法拋出的。對某一線程調用 interrupt()時,如果該線程正在執行普通的代碼,那么該線程根本就不會拋出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()后,就會立刻拋出InterruptedException 。
    不同點 :
    1.每個對象都有一個鎖來控制同步訪問。Synchronized關鍵字可以和對象的鎖交互,來實現線程的同步。
    sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
    2.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
    3.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
    4.sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。
    5.wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
  • 下面這三條語句

System.out.println(“is ”+ 100 + 5);
System.out.println(100 + 5 +“ is”);
System.out.println(“is ”+ (100 + 5));
的輸出結果分別是? ( D)

A.is 1005, 1005 is, is 1005
B.is 105, 105 is, is 105
C.is 1005, 1005 is, is 105
D.is 1005, 105 is, is 105

解析:
1."is"說明后面的內容都會被強制轉換為string,所以是最后結果是拼接起來的
2.100+5先得到105,然后與is拼接
3.先算括號內的

  • 以下關于集合類 ArrayList 、 LinkedList 、 HashMap 描述錯誤的是:(C)

A.HashMap實現Map接口,它允許任何類型的鍵和值對象,并允許將null用作鍵或值
B.ArrayList和LinkedList均實現了List接口
C.添加和刪除元素時,ArrayList的表現更佳
D.ArrayList的訪問速度比LinkedList快

解析:
Hashtable不允許 null 值(key 和 value 都不可以),HashMap允許 null 值(key和value都可以)。 ArrayList和LinkedList均實現了List接口
ArrayList基于數組實現,隨機訪問更快
LinkedList基于鏈表實現,添加和刪除更快

  • 以下代碼結果是什么?(C)

public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer(“A”);
StringBuffer b=new StringBuffer(“B”);
operate(a,b);
System.out.println(a+”.”+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}

A.代碼可以編譯運行,輸出“AB.AB”。
B.代碼可以編譯運行,輸出“A.A”。
C.代碼可以編譯運行,輸出“AB.B”。
D.代碼可以編譯運行,輸出“A.B”。

解析:
這里簡單地說,a,b,x,y就是四個指針。y本來指向的是b所指向的對象,但是一個“=”,y就指向了x所指向的目標即是a指向的對象,因此原來b所指向的目標并沒有發生任何改變。與y不同的是,x進行的是對象操作,此時此對象在內存中是真正的本質上的改變。有點繞,但是手機打字,沒發畫圖,不然其實很容易理解。

  • Java類Demo中存在方法func0、func1、func2、func3和func4,請問該方法中,哪些是不合法的定義?( AD)

public class Demo{
  float func0()
  {
    byte i=1;
    return i;
  }
  float func1()
  {
    int i=1;
    return;
  }
  float func2()
  {
    short i=2;
    return i;
  }
  float func3()
  {
    long i=3;
    return i;
  }
  float func4()
  {
    double i=4;
    return i;
  }
}
A.func1
B.func2
C.func3
D.func4

解析:
數據類型的轉換,分為自動轉換和強制轉換。自動轉換是程序在執行過程中 “ 悄然 ” 進行的轉換,不需要用戶提前聲明,一般是從位數低的類型向位數高的類型轉換;強制類型轉換則必須在代碼中聲明,轉換順序不受限制。
自動數據類型轉換
自動轉換按從低到高的順序轉換。不同類型數據間的優先關系如下:
低 ---------------------------------------------> 高
byte,short,char-> int -> long -> float -> double
運算中,不同類型的數據先轉化為同一類型,然后進行運算,轉換規則如
下:

操作數 1 類型 操作數 2 類型 轉換后的類型
byte 、 short 、 char int int
byte 、 short 、 char 、 int long long
byte 、 short 、 char 、 int 、 long float float
byte 、 short 、 char 、 int 、 long 、 float double double

強制數據類型轉換
強制轉換的格式是在需要轉型的數據前加上 “( )” ,然后在括號內加入需要轉化的數據類型。有的數據經過轉型運算后,精度會丟失,而有的會更加精確

  • 對于同一類中的兩個方法 , 在判斷它們是不是重載方法時 , 不考慮(C)

A.參數個數
B.參數類型
C.返回值類型
D.參數順序

解析:
重載:類中可以創建多個方法,它們具有相同的名字,但具 有不同的參數和不同的定義。調用方法時通過傳遞 給它們的不同參數個數和參數類型 給它們的不同參數個數和參數類型 給它們的不同參數個數和參數類型 來決定具體使用哪個方法 , 這就是多態性。
重寫 Overriding 是父類與子類之間多態性的一種表現, 在子類中定義某方法與其父類有相同的名稱和參數。
重載 Overloading 是一個類中多態性 的一種表現。
重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同 也可以不相同。 無法以 返回型別 作為重載函數的區分標準。而且編譯的時候只有返回值不同,會報錯。及使不報錯,運行時無法區分調用哪個方法

  • 在使用super 和this關鍵字時,以下描述正確的是(A)

A.在子類構造方法中使用super()顯示調用父類的構造方法,super()必須寫在子類構造方法的第一行,否則編譯不通過
B.super()和this()不一定要放在構造方法內第一行
C.this()和super()可以同時出現在一個構造函數中
D.this()和super()可以在static環境中使用,包括static方法和static語句塊

解析:
使用super()或者this()方法是必須放在構造函數的第一行
由于this函數指向的構造函數默認有super()方法,所以規定this()和super()不能同時出現在一個構造函數中。
因為staic方法或者語句塊沒有實例時可以使用,而此時不需要構造實例,所以不能用this()和super()

  • 下面代碼的輸出是什么?(A)

Paste_Image.png

A.null
B.sub
C. base

解析:
new Sub();在創造派生類的過程中首先創建基類對象,然后才能創建派生類。
創建基類即默認調用Base()方法,在方法中調用callName()方法,由于派生類中存在此方法,則被調用的callName()方法是派生類中的方法,此時派生類還未構造,所以變量baseName的值為null

  • 權限表

Paste_Image.png
  • 下面程序的輸出結果是?(D)

Paste_Image.png

A.出錯
B.342
C.34234
D.3423

解析:
1、try中沒有拋出異常,則catch語句不執行,如果有finally語句,則接著執行finally語句,繼而接著執行finally之后的語句;
2、try中拋出異常,有匹配的catch語句,則catch語句捕獲,如果catch中有return語句,則要在finally執行后再執行;

  • Where statement is true(A)

void waitForSignal()
{
Object obj = new Object();
synchronized(Thread.currentThread())
{
obj.wait();
obj.notify();
}
}

A.This code may throw an InterruptedException
B.This code may throw an IllegalStateException
C.This code may throw a TimeOutException after ten minutes
D.This code will not compile unless”obj.wait()”is replaced with”(Thread)obj).wait()”
E.Reversing the order of obj.wait()and obj.notify()may cause this method to complete normally

解析:
第一,記住wait必須要進行異常捕獲
第二,記住調用wait或者notify方法必須采用當前鎖調用,即必須采用synchronized中的對象
void waitForSignal() {
Object obj = new Object();
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.notify();
}
}

  • 下列 java 程序輸出結果為______。(B)

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

A.true,false
B.true,true
C.false,true
D.false,false
E.對于不同的環境結果不同
G.程序無法執行

解析:
本題是一個自動拆裝箱的考題(自動拆裝箱JDK需在1.5上)
1、基本型和基本型封裝型進行“==”運算符的比較,基本型封裝型將會自動拆箱變為基本型后再進行比較,因此Integer(0)會自動拆箱為int類型再進行比較,顯然返回true;
2、兩個Integer類型進行“==”比較,如果其值在-128至127,那么返回true,否則返回false, 這跟Integer.valueOf()的緩沖對象有關,這里不進行贅述。
3、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
4、基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換為其封裝類型,再進行3中的比較。

  • Given the following code:

public class Test {
private static int j = 0;

private static Boolean methodB(int k) {
    j += k;
    return true;
}

public static void methodA(int i) {
    boolean b;
    b = i < 10 | methodB(4);
    b = i < 10 || methodB(8);

}

public static void main(String args[]) {
    methodA(0);
    System.out.println(j);
}

}

What is the result?(B)
A.The program prints”0”
B.The program prints”4”
C.The program prints”8”
D.The program prints”12”
E.The code does not complete.

  • 觀察下面的代碼

class A {}
class B extends A {}
class C extends A {}
class D extends B {}
Which four statements are true ?(A C D G)

A.The type List<A>is assignable to List.
B.The type List<B>is assignable to List<A>.
C.The type List<Object>is assignable to List<?>.
D.The type List<D>is assignable to List<?extends B>.
E.The type List<?extends A>is assignable to List<A>.
F.The type List<Object>is assignable to any List reference.
G.The type List<?extends B>is assignable to List<?extends A>.

解析:

  1. 只看尖括號里邊的??!明確點和范圍兩個概念
  2. 如果尖括號里的是一個類,那么尖括號里的就是一個點,比如List<A>,List<B>,List<Object>
  3. 如果尖括號里面帶有問號,那么代表一個范圍,<? extends A> 代表小于等于A的范圍,<? super A>代表大于等于A的范圍,<?>代表全部范圍
  4. 尖括號里的所有點之間互相賦值都是錯,除非是倆相同的點
  5. 尖括號小范圍賦值給大范圍,對,大范圍賦值給小范圍,錯。如果某點包含在某個范圍里,那么可以賦值,否則,不能賦值
  6. List<?>和List 是相等的,都代表最大范圍

7.補充:List既是點也是范圍,當表示范圍時,表示最大范圍

public static void main(String[] args) {
List<A> a;
List list;
list = a; //A對,因為List就是List<?>,代表最大的范圍,A只是其中的一個點,肯定被包含在內
List<B> b;
a = b; //B錯,點之間不能相互賦值
List<?> qm;
List<Object> o;
qm = o; //C對,List<?>代表最大的范圍,List<Object>只是一個點,肯定被包含在內
List<D> d;
List<? extends B> downB;
downB = d; //D對,List<? extends B>代表小于等于B的范圍,List<D>是一個點,在其中
List<?extends A> downA;
a = downA; //E錯,范圍不能賦值給點
a = o; //F錯,List<Object>只是一個點
downA = downB; //G對,小于等于A的范圍包含小于等于B的范圍,因為B本來就比A小,B時A的子類嘛
}

  • if(x=y)會報錯的

解析:
C語言中
當if語句中的條件為賦值語句時,實際上是將賦值后的結果與0進行比較
if(1) 由于1>0 所以認為是true
java語言中,雖然也用了左值,但是不再與0比較,而是直接將0放入if()中
但是int類型,不能轉換為boolean,所以會報錯

  • ava中關于繼承的描述正確的是(ACD)

A.一個子類只能繼承一個父類
B.子類可以繼承父類的構造方法
C.繼承具有傳遞性
D.父類一般具有通用性,子類更具體

解析:
在java中,子類構造器會默認調用super()(無論構造器中是否寫有super()),用于初始化父類成員,同時當父類中存在有參構造器時,必須提供無參構造器,子類構造器中并不會自動繼承有參構造器,仍然默認調用super(),使用無參構造器。因此,一個類想要被繼承必須提供無參構造器。
PS:方法沒有繼承一說,只有重載和重寫

  • 下面哪些賦值語句是正確的(ABD)

A.long test=012
B.float f=-412
C.int other =(int)true
D.double d=0x12345678
E.byte b=128

解析:
A和B中long和float,正常定義需要加l和f,但是long和float屬于基本類型,會進行轉化,所以不會報出異常。AB正確
boolean類型不能和任何類型進行轉換,會報出類型異常錯誤。所以C錯。
D選項可以這樣定義,D正確。
E選項中,byte的取值范圍是-128—127。報出異常: cannot convert from int to byte.所以E選項錯誤。
A:012默認是int類型,賦給long類型沒錯。 正確
B:-412默認也是int類型,賦給float沒錯。 正確
C:很明顯布爾類型不能強轉成其他數值類型。 錯誤
D:0x12345678默認應該是int類型,賦給double沒錯。 正確
E:128 > 127默認是int類型,byte默認范圍是(-128 ~ 127)。錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容