Posted on 2007-05-21 11:55
love1563 閱讀(121)
評論(0) 編輯 收藏
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();
}
?}
??}
}