1.假設 a 是一個由線程 1 和線程 2 共享的初始值爲 0 的全局變量,
則線程 1 和線程 2 同時執行下面的代碼,最終 a 的結果不可能是()
-1 -2 0 1 正確答案: D
boolean isOdd = false;
for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = true;
else isOdd = false;
a+=i*(isOdd?1:-1);
}
解析:
isOdd=false-->i=1-->isOdd=true-->a +1
-->i=2-->isOdd=false-->a -2
線程一: +1 -2 +1 -2 +1 -2
線程二: +1 -2 +1 -2 +1 -2
可能結果:1)兩個線程同時運行 a+1-2=-1;
2)一個線程的第二次覆蓋另一個線程的寫入 a+1+1-2=0;
3)一個線程完全落後另一個線程 a+1-2+1-2=-2;
則線程 1 和線程 2 同時執行下面的代碼,最終 a 的結果不可能是()
-1 -2 0 1 正確答案: D
boolean isOdd = false;
for(int i=1;i<=2;++i)
{
if(i%2==1)isOdd = true;
else isOdd = false;
a+=i*(isOdd?1:-1);
}
解析:
isOdd=false-->i=1-->isOdd=true-->a +1
-->i=2-->isOdd=false-->a -2
線程一: +1 -2 +1 -2 +1 -2
線程二: +1 -2 +1 -2 +1 -2
可能結果:1)兩個線程同時運行 a+1-2=-1;
2)一個線程的第二次覆蓋另一個線程的寫入 a+1+1-2=0;
3)一個線程完全落後另一個線程 a+1-2+1-2=-2;
2.關於Float,下列說法錯誤的是() 正確答案: C
Float是一個類
Float在java.lang包中
Float a=1.0是正確的賦值方法
Float a= new Float(1.0)是正確的賦值方法
解析:Float是類,float不是類.
8種基本類型都在java.lang包中
Float正確複製方式是Float f=1.0f,若不加f會被識別成double型,
double無法向float隱式轉換.
Float a= new Float(1.0)是正確的賦值方法,但是在1.5及以上版本
引入自動裝箱拆箱後,會提示這是不必要的裝箱的警告,
通常直接使用Float f=1.0f.
Float是一個類
Float在java.lang包中
Float a=1.0是正確的賦值方法
Float a= new Float(1.0)是正確的賦值方法
解析:Float是類,float不是類.
8種基本類型都在java.lang包中
Float正確複製方式是Float f=1.0f,若不加f會被識別成double型,
double無法向float隱式轉換.
Float a= new Float(1.0)是正確的賦值方法,但是在1.5及以上版本
引入自動裝箱拆箱後,會提示這是不必要的裝箱的警告,
通常直接使用Float f=1.0f.
3.以下哪個式子有可能在某個進制下成立()?
正確答案: A
13*14=204 12*34=568 14*14=140 1+1=3
正確答案: A
13*14=204 12*34=568 14*14=140 1+1=3
4.以下哪個接口的定義是正確的?( )
正確答案: D
interface B
{ void print() { } ;}
interface B
{ static void print() ;}
abstract interface B extends A1, A2 //A1、A2爲已定義的接口
{ abstract void print(){ };}
interface B
{ void print();}
解析:接口中的方法默認爲public abstract,屬性默認爲public static final。接口中的方法不能有實現,Java中類只支持單繼承,而接口可以支持多繼承。
A、C中方法不能有方法體,B中方法前不能有static ;
正確答案: D
interface B
{ void print() { } ;}
interface B
{ static void print() ;}
abstract interface B extends A1, A2 //A1、A2爲已定義的接口
{ abstract void print(){ };}
interface B
{ void print();}
解析:接口中的方法默認爲public abstract,屬性默認爲public static final。接口中的方法不能有實現,Java中類只支持單繼承,而接口可以支持多繼承。
A、C中方法不能有方法體,B中方法前不能有static ;
5.關於類的敘述正確的是()。
正確答案: B
在類中定義的變量稱爲類的成員變量,在別的類中可以直接使用
局部變量的作用範圍僅僅在定義它的方法內,或者是在定義它的控制流塊中
使用別的類的方法僅僅需要引用方法的名字即可
只要沒有定義不帶參數的構造函數,JVM都會爲類生成一個默認構造函數
解析:
A在類中定義的變量稱爲類的成員變量,在別的類中不可以直接使用局部變量的,
類是一個封裝,類的成員只能在類內部使用,外部需要 “對象名.變量名” 來引用。
C使用別的類的方法需要通過該類的對象引用方法的名字
D如果類沒有構造方法,JVM會生成一個默認構造方法,
如果定義了任意類型的構造方法,編譯器都不會自動生成構造方法。
正確答案: B
在類中定義的變量稱爲類的成員變量,在別的類中可以直接使用
局部變量的作用範圍僅僅在定義它的方法內,或者是在定義它的控制流塊中
使用別的類的方法僅僅需要引用方法的名字即可
只要沒有定義不帶參數的構造函數,JVM都會爲類生成一個默認構造函數
解析:
A在類中定義的變量稱爲類的成員變量,在別的類中不可以直接使用局部變量的,
類是一個封裝,類的成員只能在類內部使用,外部需要 “對象名.變量名” 來引用。
C使用別的類的方法需要通過該類的對象引用方法的名字
D如果類沒有構造方法,JVM會生成一個默認構造方法,
如果定義了任意類型的構造方法,編譯器都不會自動生成構造方法。
6.閱讀下列程序,選擇哪一個是正確的輸出結果
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();
}
}
正確答案: C
static A I’m A class static B I’m B class
I’m A class I’m B class static A static B
static A static B I’m A class I’m B class
I’m A class static A I’m B class static B
解析:該題目中的執行順序:
父類的靜態變量和靜態塊賦值(按照聲明順序)
自身的靜態變量和靜態塊賦值(按照聲明順序)
父類成員變量和塊賦值(按照聲明順序)
父類構造器賦值
自身成員變量和塊賦值(按照聲明順序)
自身構造器賦值
類的靜態代碼塊是屬於類級別,執行優先級高於普通代碼塊>構造函數。
總結就是:父類的靜態代碼塊(包括靜態變量賦值)優先執行,
然後執行自身的靜態代碼塊,然後執行父類的普通代碼塊,
再執行父類的構造函數,然後執行自身的普通代碼塊,
再執行自身的構造函數。
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();
}
}
正確答案: C
static A I’m A class static B I’m B class
I’m A class I’m B class static A static B
static A static B I’m A class I’m B class
I’m A class static A I’m B class static B
解析:該題目中的執行順序:
父類的靜態變量和靜態塊賦值(按照聲明順序)
自身的靜態變量和靜態塊賦值(按照聲明順序)
父類成員變量和塊賦值(按照聲明順序)
父類構造器賦值
自身成員變量和塊賦值(按照聲明順序)
自身構造器賦值
類的靜態代碼塊是屬於類級別,執行優先級高於普通代碼塊>構造函數。
總結就是:父類的靜態代碼塊(包括靜態變量賦值)優先執行,
然後執行自身的靜態代碼塊,然後執行父類的普通代碼塊,
再執行父類的構造函數,然後執行自身的普通代碼塊,
再執行自身的構造函數。
7.下面有關servlet service描述錯誤的是?
正確答案: B
不管是post還是get方法提交過來的連接,都會在service中處理
doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的
service()是在javax.servlet.Servlet接口中定義的
service判斷請求類型,決定是調用doGet還是doPost方法
解析:doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實現的
正確答案: B
不管是post還是get方法提交過來的連接,都會在service中處理
doGet/doPost 則是在 javax.servlet.GenericServlet 中實現的
service()是在javax.servlet.Servlet接口中定義的
service判斷請求類型,決定是調用doGet還是doPost方法
解析:doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實現的
8.如果希望監聽TCP端口9000,應該怎樣創建socket?
正確答案: B
new Socket("localhost",9000);
new ServerSocket(9000);
new Socket(9000);
new ServerSocket("localhost",9000);
解析: ServerSocket(int port) 是服務端綁定port端口,
調accept()監聽等待客戶端連接,它返回一個連接隊列中的一個socket。
Socket(InetAddress address , int port)是創建客戶端
連接主機的socket流,其中InetAddress是用來記錄主機的類,
port指定端口。
正確答案: B
new Socket("localhost",9000);
new ServerSocket(9000);
new Socket(9000);
new ServerSocket("localhost",9000);
解析: ServerSocket(int port) 是服務端綁定port端口,
調accept()監聽等待客戶端連接,它返回一個連接隊列中的一個socket。
Socket(InetAddress address , int port)是創建客戶端
連接主機的socket流,其中InetAddress是用來記錄主機的類,
port指定端口。
9.true、false、null、sizeof、goto、synchronized 哪些是Java關鍵字?
正確答案:goto,synchronized
解析:1. const和goto既是保留字又是關鍵字
2. 除了const和goto,其餘保留字和關鍵字是嚴格區分開的。
1,Java 關鍵字列表 (依字母排序 共50組):
abstract, assert, boolean, break, byte, case, catch, char, class,
const(保留關鍵字), continue, default, do, double, else, enum,
extends, final, finally, float, for, goto(保留關鍵字), if,
implements, import, instanceof, int, interface, long, native,
new, package, private, protected, public, return, short, static,
strictfp, super, switch, synchronized, this, throw, throws,
transient, try, void, volatile, while
2,保留字列表 (依字母排序 共14組),Java保留字是指現有Java版本
尚未使用,但以後版本可能會作爲關鍵字使用:
byValue, cast, false, future, generic, inner, operator, outer,
rest, true, var, goto (保留關鍵字) , const (保留關鍵字) , null
正確答案:goto,synchronized
解析:1. const和goto既是保留字又是關鍵字
2. 除了const和goto,其餘保留字和關鍵字是嚴格區分開的。
1,Java 關鍵字列表 (依字母排序 共50組):
abstract, assert, boolean, break, byte, case, catch, char, class,
const(保留關鍵字), continue, default, do, double, else, enum,
extends, final, finally, float, for, goto(保留關鍵字), if,
implements, import, instanceof, int, interface, long, native,
new, package, private, protected, public, return, short, static,
strictfp, super, switch, synchronized, this, throw, throws,
transient, try, void, volatile, while
2,保留字列表 (依字母排序 共14組),Java保留字是指現有Java版本
尚未使用,但以後版本可能會作爲關鍵字使用:
byValue, cast, false, future, generic, inner, operator, outer,
rest, true, var, goto (保留關鍵字) , const (保留關鍵字) , null
10.
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*語句1*/
b6=b4+b5; /*語句2*/
b8=(b1+b4); /*語句3*/
b7=(b2+b5); /*語句4*/
System.out.println(b3+b6);
下列代碼片段中,存在編譯錯誤的語句是()
正確答案: B C D
語句2
語句1
語句3
語句4
解析:
Java表達式轉型規則由低到高轉換:
1、所有的byte,short,char型的值將被提升爲int型;
2、如果有一個操作數是long型,計算結果是long型;
3、如果有一個操作數是float型,計算結果是float型;
4、如果有一個操作數是double型,計算結果是double型;
5、被fianl修飾的變量不會自動改變類型,當2個final修飾相操作時,結果會根據左邊變量的類型而轉化。
--------------解析--------------
語句1錯誤:b3=(b1+b2);自動轉爲int,所以正確寫法爲b3=(byte)(b1+b2);或者將b3定義爲int;
語句2正確:b6=b4+b5;b4、b5爲final類型,不會自動提升,所以和的類型視左邊變量類型而定,即b6可以是任意數值類型;
語句3錯誤:b8=(b1+b4);雖然b4不會自動提升,但b1仍會自動提升,所以結果需要強轉,b8=(byte)(b1+b4);
語句4錯誤:b7=(b2+b5); 同上。同時注意b7是final修飾,即只可賦值一次,便不可再改變。
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*語句1*/
b6=b4+b5; /*語句2*/
b8=(b1+b4); /*語句3*/
b7=(b2+b5); /*語句4*/
System.out.println(b3+b6);
下列代碼片段中,存在編譯錯誤的語句是()
正確答案: B C D
語句2
語句1
語句3
語句4
解析:
Java表達式轉型規則由低到高轉換:
1、所有的byte,short,char型的值將被提升爲int型;
2、如果有一個操作數是long型,計算結果是long型;
3、如果有一個操作數是float型,計算結果是float型;
4、如果有一個操作數是double型,計算結果是double型;
5、被fianl修飾的變量不會自動改變類型,當2個final修飾相操作時,結果會根據左邊變量的類型而轉化。
--------------解析--------------
語句1錯誤:b3=(b1+b2);自動轉爲int,所以正確寫法爲b3=(byte)(b1+b2);或者將b3定義爲int;
語句2正確:b6=b4+b5;b4、b5爲final類型,不會自動提升,所以和的類型視左邊變量類型而定,即b6可以是任意數值類型;
語句3錯誤:b8=(b1+b4);雖然b4不會自動提升,但b1仍會自動提升,所以結果需要強轉,b8=(byte)(b1+b4);
語句4錯誤:b7=(b2+b5); 同上。同時注意b7是final修飾,即只可賦值一次,便不可再改變。