149
、
JAVA
代碼查錯
1.
abstract?class?Name?{
???private?String?name;
???public?abstract?boolean?isStupidName(String?name)?{}
}
大俠們,這有何錯誤 ?
答案 :? 錯。 abstract?method 必須以分號結尾,且不帶花括號。
2.
public?class?Something?{
???void?doSomething?()?{
???????private?String?s?=?"";
???????int?l?=?s.length();
???}
}
有錯嗎 ?
答案 :? 錯。局部變量前不能放置任何訪問修飾符 ?(private , public ,和 protected) 。 final 可以用來修飾局部變量
(final 如同 abstract 和 strictfp ,都是非訪問修飾符, strictfp 只能修飾 class 和 method 而非 variable) 。
3.
abstract?class?Something?{
???private?abstract?String?doSomething?();
}
這好像沒什么錯吧 ?
答案 :? 錯。 abstract 的 methods 不能以 private 修飾。 abstract 的 methods 就是讓子類 implement( 實現 ) 具體細節的,怎么可以用 private 把 abstract
method 封鎖起來呢 ??( 同理, abstract?method 前不能加 final) 。
4.
public?class?Something?{
???public?int?addOne(final?int?x)?{
???????return?++x;
???}
}
這個比較明顯。
答案 :? 錯。 int?x 被修飾成 final ,意味著 x 不能在 addOne?method 中被修改。
5.
public?class?Something?{
???public?static?void?main(String[]?args)?{
???????Other?o?=?new?Other();
???????new?Something().addOne(o);
???}
???public?void?addOne(final?Other?o)?{
???????o.i++;
???}
}
class?Other?{
???public?int?i;
}
和上面的很相似,都是關于 final 的問題,這有錯嗎 ?
答案 :? 正確。在 addOne?method 中,參數 o 被修飾成 final 。如果在 addOne?method 里我們修改了 o 的 reference
( 比如 :?o?=?new?Other();) ,那么如同上例這題也是錯的。但這里修改的是 o 的 member?vairable
( 成員變量 ) ,而 o 的 reference 并沒有改變。
6.
class?Something?{
????int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}?
有什么錯呢 ?? 看不出來啊。
答案 :? 正確。輸出的是 "i?=?0" 。 int?i 屬於 instant?variable?( 實例變量,或叫成員變量 ) 。 instant?variable 有 default?value 。 int 的 default?value 是 0 。
7.
class?Something?{
????final?int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}
和上面一題只有一個地方不同,就是多了一個 final 。這難道就錯了嗎 ?
答案 :? 錯。 final?int?i 是個 final 的 instant?variable?( 實例變量,或叫成員變量 ) 。 final 的 instant?variable 沒有 default?value ,必須在 constructor?( 構造器 ) 結束之前被賦予一個明確的值。可以修改為 "final?int?i?=?0;" 。
8.
public?class?Something?{
?????public?static?void?main(String[]?args)?{
????????Something?s?=?new?Something();
????????System.out.println("s.doSomething()?returns?"?+?doSomething());
????}
????public?String?doSomething()?{
????????return?"Do?something?...";
????}
}
? 看上去很完美。
答案 :? 錯。看上去在 main 里 call?doSomething 沒有什么問題,畢竟兩個 methods 都在同一個 class 里。但仔細看, main 是 static 的。 static?method 不能直接 call?non-static?methods 。可改成 "System.out.println("s.doSomething()?returns?"?+?s.doSomething());" 。同理, static?method 不能訪問 non-static?instant?variable 。
9.
此處, Something 類的文件名叫 OtherThing.java
class?Something?{
????private?static?void?main(String[]?something_to_do)?{????????
????????System.out.println("Do?something?...");
????}
}
? 這個好像很明顯。
答案 :? 正確。從來沒有人說過 Java 的 Class 名字必須和其文件名相同。但 public?class 的名字必須和文件名相同。
10 .
interface??A{
???int?x?=?0;
}
class?B{
???int?x?=1;
}
class?C?extends?B?implements?A?{
???public?void?pX(){
??????System.out.println(x);
???}
???public?static?void?main(String[]?args)?{
??????new?C().pX();
???}
}
答案:錯誤。在編譯時會發生錯誤 ( 錯誤描述不同的 JVM 有不同的信息,意思就是未明確的 x 調用,兩個 x 都匹配(就象在同時 import?java.util 和 java.sql 兩個包時直接聲明 Date 一樣)。對于父類的變量 , 可以用 super.x 來明確,而接口的屬性默認隱含為 ?public?static?final. 所以可以通過 A.x 來明確。
11.
interface?Playable?{
????void?play();
}
interface?Bounceable?{
????void?play();
}
interface?Rollable?extends?Playable,?Bounceable?{
????Ball?ball?=?new?Ball("PingPang");
}
class?Ball?implements?Rollable?{
????private?String?name;
????public?String?getName()?{
????????return?name;
????}
????public?Ball(String?name)?{
????????this.name?=?name;????????
????}
???public?void?play()?{
????????ball?=?new?Ball("Football");
????????System.out.println(ball.getName());
????}
}
這個錯誤不容易發現。
答案 :? 錯。 "interface?Rollable?extends?Playable,?Bounceable" 沒有問題。 interface 可繼承多個 interfaces ,所以這里沒錯。問題出在 interface?Rollable 里的 "Ball?ball?=?new?Ball("PingPang");" 。任何在 interface 里聲明的 interface?variable?( 接口變量,也可稱成員變量 ) ,默認為 public?static?final 。也就是說 "Ball?ball?=?new?Ball("PingPang");" 實際上是 "public?static?final?Ball?ball?=?new?Ball("PingPang");" 。在 Ball 類的 Play() 方法中, "ball?=?new?Ball("Football");" 改變了 ball 的 reference ,而這里的 ball 來自 Rollable?interface , Rollable?interface 里的 ball 是 public?static?final 的, final 的 object 是不能被改變 reference 的。因此編譯器將在 "ball?=?new?Ball("Football");" 這里顯示有錯。
28 、設計 4 個線程,其中兩個線程每次對 j 增加 1 ,另外兩個線程對 j 每次減少 1 。寫出程序。
以下程序使用內部類實現線程,對 j 增減的時候沒有考慮順序問題。
public?class?ThreadTest1{
??private?int?j;
??public?static?void?main(String?args[]){
ThreadTest1?tt=new?ThreadTest1();
Inc?inc=tt.new?Inc();
Dec?dec=tt.new?Dec();
for(int?i=0;i<2;i++){
Thread?t=new?Thread(inc);
t.start();
t=new?Thread(dec);
t.start();
}
}
??private?synchronized?void?inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
??}
??private?synchronized?void?dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
??}
??class?Inc?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
inc();
}
}
??}
??class?Dec?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
dec();
}
?}
??}
}
1.
abstract?class?Name?{
???private?String?name;
???public?abstract?boolean?isStupidName(String?name)?{}
}
大俠們,這有何錯誤 ?
答案 :? 錯。 abstract?method 必須以分號結尾,且不帶花括號。
2.
public?class?Something?{
???void?doSomething?()?{
???????private?String?s?=?"";
???????int?l?=?s.length();
???}
}
有錯嗎 ?
答案 :? 錯。局部變量前不能放置任何訪問修飾符 ?(private , public ,和 protected) 。 final 可以用來修飾局部變量
(final 如同 abstract 和 strictfp ,都是非訪問修飾符, strictfp 只能修飾 class 和 method 而非 variable) 。
3.
abstract?class?Something?{
???private?abstract?String?doSomething?();
}
這好像沒什么錯吧 ?
答案 :? 錯。 abstract 的 methods 不能以 private 修飾。 abstract 的 methods 就是讓子類 implement( 實現 ) 具體細節的,怎么可以用 private 把 abstract
method 封鎖起來呢 ??( 同理, abstract?method 前不能加 final) 。
4.
public?class?Something?{
???public?int?addOne(final?int?x)?{
???????return?++x;
???}
}
這個比較明顯。
答案 :? 錯。 int?x 被修飾成 final ,意味著 x 不能在 addOne?method 中被修改。
5.
public?class?Something?{
???public?static?void?main(String[]?args)?{
???????Other?o?=?new?Other();
???????new?Something().addOne(o);
???}
???public?void?addOne(final?Other?o)?{
???????o.i++;
???}
}
class?Other?{
???public?int?i;
}
和上面的很相似,都是關于 final 的問題,這有錯嗎 ?
答案 :? 正確。在 addOne?method 中,參數 o 被修飾成 final 。如果在 addOne?method 里我們修改了 o 的 reference
( 比如 :?o?=?new?Other();) ,那么如同上例這題也是錯的。但這里修改的是 o 的 member?vairable
( 成員變量 ) ,而 o 的 reference 并沒有改變。
6.
class?Something?{
????int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}?
有什么錯呢 ?? 看不出來啊。
答案 :? 正確。輸出的是 "i?=?0" 。 int?i 屬於 instant?variable?( 實例變量,或叫成員變量 ) 。 instant?variable 有 default?value 。 int 的 default?value 是 0 。
7.
class?Something?{
????final?int?i;
????public?void?doSomething()?{
????????System.out.println("i?=?"?+?i);
????}
}
和上面一題只有一個地方不同,就是多了一個 final 。這難道就錯了嗎 ?
答案 :? 錯。 final?int?i 是個 final 的 instant?variable?( 實例變量,或叫成員變量 ) 。 final 的 instant?variable 沒有 default?value ,必須在 constructor?( 構造器 ) 結束之前被賦予一個明確的值。可以修改為 "final?int?i?=?0;" 。
8.
public?class?Something?{
?????public?static?void?main(String[]?args)?{
????????Something?s?=?new?Something();
????????System.out.println("s.doSomething()?returns?"?+?doSomething());
????}
????public?String?doSomething()?{
????????return?"Do?something?...";
????}
}
? 看上去很完美。
答案 :? 錯。看上去在 main 里 call?doSomething 沒有什么問題,畢竟兩個 methods 都在同一個 class 里。但仔細看, main 是 static 的。 static?method 不能直接 call?non-static?methods 。可改成 "System.out.println("s.doSomething()?returns?"?+?s.doSomething());" 。同理, static?method 不能訪問 non-static?instant?variable 。
9.
此處, Something 類的文件名叫 OtherThing.java
class?Something?{
????private?static?void?main(String[]?something_to_do)?{????????
????????System.out.println("Do?something?...");
????}
}
? 這個好像很明顯。
答案 :? 正確。從來沒有人說過 Java 的 Class 名字必須和其文件名相同。但 public?class 的名字必須和文件名相同。
10 .
interface??A{
???int?x?=?0;
}
class?B{
???int?x?=1;
}
class?C?extends?B?implements?A?{
???public?void?pX(){
??????System.out.println(x);
???}
???public?static?void?main(String[]?args)?{
??????new?C().pX();
???}
}
答案:錯誤。在編譯時會發生錯誤 ( 錯誤描述不同的 JVM 有不同的信息,意思就是未明確的 x 調用,兩個 x 都匹配(就象在同時 import?java.util 和 java.sql 兩個包時直接聲明 Date 一樣)。對于父類的變量 , 可以用 super.x 來明確,而接口的屬性默認隱含為 ?public?static?final. 所以可以通過 A.x 來明確。
11.
interface?Playable?{
????void?play();
}
interface?Bounceable?{
????void?play();
}
interface?Rollable?extends?Playable,?Bounceable?{
????Ball?ball?=?new?Ball("PingPang");
}
class?Ball?implements?Rollable?{
????private?String?name;
????public?String?getName()?{
????????return?name;
????}
????public?Ball(String?name)?{
????????this.name?=?name;????????
????}
???public?void?play()?{
????????ball?=?new?Ball("Football");
????????System.out.println(ball.getName());
????}
}
這個錯誤不容易發現。
答案 :? 錯。 "interface?Rollable?extends?Playable,?Bounceable" 沒有問題。 interface 可繼承多個 interfaces ,所以這里沒錯。問題出在 interface?Rollable 里的 "Ball?ball?=?new?Ball("PingPang");" 。任何在 interface 里聲明的 interface?variable?( 接口變量,也可稱成員變量 ) ,默認為 public?static?final 。也就是說 "Ball?ball?=?new?Ball("PingPang");" 實際上是 "public?static?final?Ball?ball?=?new?Ball("PingPang");" 。在 Ball 類的 Play() 方法中, "ball?=?new?Ball("Football");" 改變了 ball 的 reference ,而這里的 ball 來自 Rollable?interface , Rollable?interface 里的 ball 是 public?static?final 的, final 的 object 是不能被改變 reference 的。因此編譯器將在 "ball?=?new?Ball("Football");" 這里顯示有錯。
28 、設計 4 個線程,其中兩個線程每次對 j 增加 1 ,另外兩個線程對 j 每次減少 1 。寫出程序。
以下程序使用內部類實現線程,對 j 增減的時候沒有考慮順序問題。
public?class?ThreadTest1{
??private?int?j;
??public?static?void?main(String?args[]){
ThreadTest1?tt=new?ThreadTest1();
Inc?inc=tt.new?Inc();
Dec?dec=tt.new?Dec();
for(int?i=0;i<2;i++){
Thread?t=new?Thread(inc);
t.start();
t=new?Thread(dec);
t.start();
}
}
??private?synchronized?void?inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
??}
??private?synchronized?void?dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
??}
??class?Inc?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
inc();
}
}
??}
??class?Dec?implements?Runnable{
public?void?run(){
for(int?i=0;i<100;i++){
dec();
}
?}
??}
}