一、 Java Application 中的主類需包含main方法,以下哪項是main方法的正確形參?( )
A.String args
B.String[] args
C.Char arg
D.StringBuffer[] args
答案:B
解析:
- main函數的形式為 public static void main(String[] args)
- String[] args 還有一種等價的寫法: String... args
1.前者為數組形式, 后者為可變參數形式。
2.前者用得較多, 但是看到后者也應認識。
二、 java socket如何獲取本地ip地址?
A.getInetAddress()
B.getLocalAddress()
C.getReuseAddress()
D.getLocalPort()
答案:B
解析:
三、下面代碼運行結果是()
public class Test{
public int add(int a,int b){
try {
return a+b;
}
catch (Exception e) {
System.out.println("catch語句塊");
}
finally{
System.out.println("finally語句塊");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
A.catch語句塊;和是:43
B.編譯異常
C.finally語句塊;和是:43
D.和是:43;finally語句塊
答案:C
解析:
先來看一段代碼:
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally(){
int a = 0;
try{
a = 1;
return a;
}finally{
a = 2;
}
}
}
- 從結果上看,貌似
finally
里的語句是在return
之后執行的,其實不然,實際上finally
里的語句是在在return
之前執行的。那么問題來了,既然是在之前執行,那為什么a
的值沒有被覆蓋了? - 實際過程是這樣的:當程序執行到try{}語句中的return方法時,它會干這么一件事,將要返回的結果存儲到一個臨時棧中,然后程序不會立即返回,而是去執行finally{}中的程序, 在執行
a = 2
時,程序僅僅是覆蓋了a的值,但不會去更新臨時棧中的那個要返回的值 。執行完之后,就會通知主程序“finally的程序執行完畢,可以請求返回了”,這時,就會將臨時棧中的值取出來返回。這下應該清楚了,要返回的值是保存至臨時棧中的。
再來看一個例子,稍微改下上面的程序:
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally(){
int a = 0;
try{
a = 1;
return a;
}finally{
a = 2;
return a;
}
}
}
- 在這里,finally{}里也有一個return,那么在執行這個return時,就會更新臨時棧中的值。同樣,在執行完finally之后,就會通知主程序請求返回了,即將臨時棧中的值取出來返回。故返回值是2.
結論:
finally{}代碼塊比return先執行。
多個return是按順序執行的的,多個return執行了一個后,后面的return就不會執行了。
記住一點,不管有不有異常拋出,finally都會在return返回前執行。
四、在基本JAVA類型中,如果不明確指定,整數型的默認是什么類型?帶小數的默認是什么類型?
int double
解析:
-
整數類型 默認為 int
帶小數的默認為double - 如果要指定長整型加L;如果要指定為單精度加F
五、關于PreparedStatement與Statement描述錯誤的是()
A.一般而言,PreparedStatement比Statement執行效率更高
B.PreparedStatement會預編譯SQL語句
C.Statement每次都會解析/編譯SQL,確立并優化數據獲取路徑
D.Statement執行掃描的結果集比PreparedStatement大
答案:D
解析(一):
創建時的區別:
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);
執行的時候:
ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery();
由上可以看出,PreparedStatement有預編譯的過程,已經綁定sql,之后無論執行多少遍,都不會再去進行編譯,
而 statement 不同,如果執行多遍,則相應的就要編譯多少遍sql,所以從這點看,PreparedStatement 的效率會比 Statement要高一些
解析(二):
Statement 和 PreparedStatement 有什么區別?哪個性能更好?
與 Statement 相比,
①PreparedStatement 接口代表預編譯的語句,它主要的優勢在于可
以減少 SQL 的編譯錯誤并增加 SQL 的安全性(減少 SQL 注射攻擊的可能性);
②PreparedStatement 中的 SQL 語句是可以帶參數的,避免了用字符串連接拼接 SQL 語句的麻煩和不安全;
③當批量處理 SQL 或頻繁執行相同的查詢時,PreparedStatement 有明顯的性能上的優勢,由于數據庫可以將編譯優化后的 SQL 語句緩存起來,下次執行相同結構的語句時就會很快(不用再次編譯和生成執行計劃)。
補充:
①為了提供對存儲過程的調用,JDBC API 中還提供了 CallableStatement 接口。
②存儲過程(Stored Procedure)是數據庫中一組為了完成特定功能的 SQL 語句的集合,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。
③雖然調用存儲過程會在網絡開銷、安全性、性能上獲得很多好處,但是存在如果底層數據庫發生遷移時就會有很多麻煩,因為每種數據庫的存儲過程在書寫上存在不少的差別
六、 Java 多線程有幾種實現方法?( )
繼承Thread類; 實現Runnable接口; 實現Callable接口
七、int,String,*point,union哪些不是 Java 的數據類型?(不定項)
A.int
B.String
C.*point
D.union
答案:C D
解析:
- 題目是說數據類型,并沒有說基本數據類型,所有包括了引用數據類型,String為字符串類,屬于引用數據類型
八、java中關于繼承的描述正確的是()?(不定項)
A.一個子類只能繼承一個父類
B.子類可以繼承父類的構造方法
C.繼承具有傳遞性
D.父類一般具有通用性,子類更具體
答案: A C D
解析:
在java中,子類構造器會默認調用super()(無論構造器中是否寫有super()),用于初始化父類成員,同時當父類中存在有參構造器時,必須提供無參構造器,子類構造器中并不會自動繼承有參構造器,仍然默認調用super(),使用無參構造器。因此,一個類想要被繼承必須提供無參構造器。
PS:方法沒有繼承一說,只有重載和重寫
九、下面哪些寫法能在 java8 中編譯執行()(不定項)
A.
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B.dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C.dir.listFiles((_.getName().endsWith(“.Java”)));
D.dir.listFiles( f->f.getName().endsWith(“.Java”));
答案:A D
解析:
Lanbda表達式的主要作用就是代替匿名內部類的繁瑣語法, 它由三部分組成:
- 形參列表。
- 箭頭(→)。必須通過英文中畫線和大于符號組成。
- 代碼塊。
Lanbda表達式簡單實例:
十、下面哪些類可以被繼承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader(不定項)
A.
Thread
B.Number
C.Double
D.Math
E.ClassLoader
答案: A B E
解析:
- A.Thread可以被繼承,用于創建新的線程
- B.Number類可以被繼承,Integer,Float,Double等都繼承自Number類
-
C.Double類的聲明為 Double類
-
D.Math類的聲明為Math類
final聲明的類不能被繼承
- E.ClassLoader可以被繼承,用戶可以自定義類加載器