java程序改錯題(常見)


最近跑校招,做了一套java的筆試題。

1 abstract class Name {    
2       private String name; 
3       public abstract boolean isStupidName(String name) {
4    } 
5 } 

答案: 錯。abstract method不能有具體實現,即不能帶花括號。  

 

1 public class Something {    
2     void doSomething () {        
3      private String s = "";     
4      int l = s.length();   
5    } 
6 } 

答案: 錯。局部變量前不能放置任何訪問修飾符 (private,public,和protected)。final可以用來修飾局部變量  

 

1 abstract class Something { 
2    private abstract String doSomething ();
3 
4 } 

答案: 錯。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現)具體細節的,怎么可以用private把abstract method封鎖起來呢?
(同理,abstract method前不能加final)。

 

1 public class Something { 
2    public int addOne(final int x) {      
3        return ++x;    
4    } 
5 } 

答案: 錯。int x被修飾成final,意味着x不能在addOne method中被修改。

 

 1 public class Something { 
 2        public static void main(String[] args) {      
 3           Other o = new Other(); 
 4           new Something().addOne(o);  
 5       } 
 6 
 7      public void addOne(final Other o) {     
 8           o.i++; 
 9      } 
10 
11 class Other {   
12       public int i;
13 } 

和上面的很相似,都是關於final的問題,這有錯嗎?
答案: 正確。在addOne method中,參數o被修飾成final。如果在addOne method里我們修改了o的reference(比如: o = new Other();),那么如同上例這題也是錯的。
但這里修改的是o的member vairable(成員變量),而o的reference並沒有改變。

 

1 class Something {     
2        int i; 
3        public void doSomething() {       
4             System.out.println("i = " + i);    
5        }
6 }  

和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎?

答案: 錯。final int i是個final的instant variable (實例變量,或叫成員變量)。
final的instant variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。可以修改為"final int i = 0;"。

 

1 class Something {     
2        final int i; 
3        public void doSomething() {      
4 
5               System.out.println("i = " + i);     
6 
7       }
8   } 

看上去很完美。

答案: 錯。看上去在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。

 

1 public class Something { 
2       public static void main(String[] args) {       
3            Something s = new Something(); 
4            System.out.println("s.doSomething() returns " + doSomething()); 
5     
6 } 
7 public String doSomething() {       
8           return "Do something ...";     
9 } 

 

答案: 錯。看上去在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。

 

1  此處,Something類的文件名叫OtherThing.java class Something { 
2        private static void main(String[] something_to_do) {                  
3                System.out.println("Do something ...");    
4       } 
5 } 

這個好像很明顯。
答案: 正確。從來沒有人說過Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。

 

 1 interface  A{  int x = 0; } 
 2 class B{    int x =1; } 
 3 class C extends B implements A {    
 4        public void pX(){      
 5              System.out.println(x);   
 6        } 
 7   
 8       public static void main(String[] args) {    
 9         new C().pX();    
10      } 
11 } 

答案:錯誤。在編譯時會發生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調用,兩個x都匹配(就像在同時import java.util和java.sql兩個包時直接聲明Date一樣)。
對於父類的變量,可以用super.x來明確,而接口的屬性默認隱含為 public static final.所以可以通過A.x來明確。

 

 1 interface Playable {     
 2       void play(); 
 3 } 
 4 interface Bounceable { 
 5     void play(); 
 6 } 
 7 
 8 interface Rollable extends Playable, Bounceable {     
 9       Ball ball = new Ball("PingPang"); 
10 } 
11 
12 class Ball implements Rollable {   
13        private String name; 
14       
15        public String getName() {     
16 
17               return name;     
18        } 
19 
20       public Ball(String name) {      
21 
22              this.name = name;        
23        } 
24             
25        public void play() { 
26 
27              ball = new Ball("Football"); 
28              System.out.println(ball.getName());     
29         } 
30 } 

 

這個錯誤不容易發現。
答案: 錯。"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"); 這里顯示有錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM