- Which ofthe following are legal lines ofcode?( 下列哪些代碼是合法的?)
(a) int w=(int)888.8
(b) byte x=(byte)1000L
(c )long y=(byte)100
(d) byte z=(byte)100L
參考答案:(a)、(b)、(c)、(d)。
分析:
在Java中,整型、實型、字元型被視為簡單的資料類型,這些資料類型由低
到進階分別為:(byte,short,char)int long float double
簡單資料類型之間的轉換又可以分為:
低級到進階的自動類型轉換;
進階到低級的強制類型轉換;
包裝類過渡類型能夠轉換。
1、自動類型轉換
低級變量可以直接轉換為進階變量,下面的語句可以在JAVA中直接通過,代碼如下:
byte b;
int i=b;
long l=b;
f loat f=b;
doubled=b
如果低級類型為char型,向進階類型(整型) 轉換時,會轉換為對應ASCII碼值,代碼如下:
碼如下:
char c='c';
int i=c;
System.out.println("output:"+i);
輸出:
output:99 ;
對于byte、short、char 3種類型而言,它們是平級的,是以不能互相自動轉換,可以使用下述的強制類型轉換,代碼如下:
short i=99;
char c=(char)i;
System.out.printIn("output:"+c) ;
輸出:
output:c
2.強制類型轉換
将進階變量轉換為低級變量時,情況會複雜一些,可以使用強制類型轉換.示例代碼如下:
int i=99;
byte b=(byte)i;
char c=(char)i;
float f=(float)i;
3.包裝類過渡類型轉換
Java 的包裝類将基本資料類型與對象類型在一定程度上統一起來,井提供以下兩個方
面的功能。
将基本類型封裝後當作對象進行操作。
口為基本資料類型提供各種轉換功能。
Java 共有6 個包裝類,分别是Boolean、Character、Integer、Long、Float 和Double。
從字面上就可以看出它們分别對應于boolean、char、int、long、float和double 類型。而String和Daue本身就是類。也就不存在包裝類的概念。
在進行簡單資料類型之間的轉換(自動轉換或強制轉換)時,可以利用包裝類進行過渡。
一般情況下,首先聲明一個變量。然後生成個對應的包裝類,就可以利用包餐類的
各種方法進行類型轉換了。例如,當希望把float型轉換為double型時、示例代碼如下:
float f1=100.00f;
FloatF1=new float(f1);
Double d1=F1.doubleValue();//F1.doubleValue()為Float類的傳回double值型的方法
當希望把double型轉換為int型時,代碼如下所示:
doubled1= 100.00;
DoubleD1=new Double(d1);
int i1=D1.intvalue();
當希望把int型轉換為double型時,自動轉換如下:
int i1=200;
double d1=i1
簡單類型的變量轉換為相應的包裝類,可以利用包裝類的構造函數,如Boolean(boolean
value)、Character(charvalue) 、Integer(int value) 、Long(long value)、Floal (float value)、Double(double value)
而在各個包裝類中,總有形為XXXValue()的方法,來得到其對應的簡單類型資料。利
用這種方法,也可以實作不同數值型變最間的轉換。例如對于一個雙精度實型類,intValue()
可以得到其對應的整型變量,而doubleValue()可以得到其對應的雙精度實型變量。
一個浮點類型資料通過強制類型轉換可以轉換為int類型,這時小數位會被截去,是以
(a) 是正确的。一個長整型數值可以被轉換為byte 類型,如果長整型數大于127 轉換為
byte 類型就會變為-128,是以(b) 和(d) 是正确的。由于長整型數的範圍覆寫byte 類型數範圍,是以(c) 也是正确的。
2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?可以作用在byte上,因為byte能自動轉為int;不能作用在long上,long轉int不能自動轉,需要強轉;在jdk1.7以後可以作用在String上..
二、修飾符相關的考題編譯并運作下面代碼,請選擇描述正确的項。
public class XiuShiFu{
int i =10;
private static float pi=3.0f;//(1)
public static void main(string [] args) {
public inti= 20;//(2)
final doubled= 4.0d;//(3)
System.out.println(i+d +pi) ;} }
(a) 編譯正确,輸出結果28.0
(b) 編譯錯誤,(1) 處有錯誤
(c) 編譯錯誤,(2) 處有錯誤
(d) 編譯錯誤,(3) 處有錯誤
(e) 編譯正确,輸出結果18.0
參考答案(c)
分析:
Java語言定義了public、protected、private、abstract、和final這6個常用修飾符詞外,還定義了4個不太常用的修飾符,下面是對這10個java修飾符的介紹。
1、pubic
使用對象: 類、接口、成員。
介紹:無論所屬的包定義在哪,該類(接口、成員)都是可通路的。
2、private
使用對象: 成員。
介紹: 成員隻可以在定義它的類中被通路。
3、static
使用對象: 類、方法、變量、初始化函數。
介紹:static修辭的内部類是一個項級類,它和類包含的成員是不相關的。靜态方法是類方法,被指向到所屬的類面不是類的執行個體。靜态變量是類變量,無論該變量所在的類建立了多少執行個體,該變量隻存在一個執行個體被指向到所屬的類而不是類的執行個體。初始化函數是
在裝載類時執行的,面不是在建立執行個體時執行的。
4、final
使用對象:類、方法、變量。
介紹:被定又成final的類不允許出現子類,不能被覆寫(不應用于動态查詢),變量值不允許被修改。
5、abstract
使用對象:類、接口、方法。
介紹:abstract類中包括沒有實作的方法。不能被執行個體化。abstract 方法的方法體為空
該方法的實作在子類中被定義,并且包含一個abstract方法的類必須是一個abstact類。
6、protected
使用對象: 成員
介紹:protected 成員隻能在定義它的包中被通路,如果在其他包中被通路,則實作這個
方法的類必須是該成員所屬類的子類。
7、native
使用對象: 成員。
介紹: 與操作平台相關,定義時并不定義其方法,方法被個外部的庫實作。
8、synchronized
使用對象: 方法。
介紹: 對于一個靜态的方法,在執行之前JVM把它所在的類鎖定;對于一個非靜态類
的方法,執行前把某個特定對象執行個體鎖定。
9、volatile
使用對象:變量。
介紹:因為異步線程可以通路變量,是以有些優化操作是一定不能作用在變量上的。
volatile有時可以代替synchronized.
10、transient
使用對象: 變量。
介紹。變量不是對象持久狀态的一部分,不應該把變量和對象一起串起
三、static靜态變量相關考題運作下面程式,請選擇輸出結果
public class x(
private static int a
pubilc static void main(String[ ] args) {
modify(a)
System. out.println(a);
}
public static void modify(int a) {
a++;
}
(a) 0
(b) 1
(0) 2
(d) 3
參考答案:(a)
分析:
類的靜态變量a在modify()方法中并沒有被改變,而是改變了modify() 方法的參數。(就近原則)如果将上述代碼修改如下:
public class x(
private static int a;
pubilc static void main(String[ ] args) {
modify(a)
System. out.println(a);
}
public static void modify(int b) {
a++;
}
那麼輸出結果為1,但是面試題中靜态變量a的值并沒有改變,是以應該輸出為0。
四、考察構造函數下面程式代碼運作結果是什麼?
class MyTest extends Test {
public MyTest() {
system.out.printin("S2");
public class Test {
public static void main(String args[]) {
new myTest( );
public Test() {
System.out.println("S1") ;
}
}
選擇正确的答案:
(a) S1。
(b) S2。
(c) S1S2.
(d) S2S1。
考點:考察求職者對于Java的構造函數運作順序的掌握和了解
出現頻率:★★★★
【面試分析】父類的構造函數是先于子類的構造函數運作的。
參考答案: (c)。
五、int和Integer的差別1、Integer是int的包裝類,int則是java的一種基本資料類型
2、Integer變量必須執行個體化後才能使用,而int變量不需要
3、Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲資料值
4、Integer的預設值是null,int的預設值是0
延伸:
關于Integer和int的比較
1、由于Integer變量實際上是對一個Integer對象的引用,是以兩個通過new生成的Integer變量永遠是不相等的(因為new生成的是兩個對象,其記憶體位址不同)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
2、Integer變量和int變量比較時,隻要兩個變量的值是向等的,則結果為true(因為包裝類Integer和基本資料類型int比較時,java會自動拆包裝為int,然後進行比較,實際上就變為兩個int變量的比較)
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
3、非new生成的Integer變量和new Integer()生成的變量比較時,結果為false。(因為非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中建立的對象,兩者在記憶體中的位址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
4、對于兩個非new生成的Integer對象,進行比較時,如果兩個變量的值在區間-128到127之間,則比較結果為true,如果兩個變量的值不在此區間,則比較結果為false
Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false
對于第4條的原因:
java在編譯Integer i = 100 ;時,會翻譯成為Integer i = Integer.valueOf(100);,而java API中對Integer類型的valueOf的定義如下:
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}
java對于-128到127之間的數,會進行緩存,Integer i = 127時,會将127進行緩存,下次再寫Integer j = 127時,就會直接從緩存中取,就不會new了