面試題之代碼糾錯

1.abstract class Test{

 private String name;

public abstract boolean isTrueName(String name){}

}

這個題比較有混淆視聽的感覺,他一上來給你來一個private修飾的成員變量!很過人會認爲他有錯,其實不對,他只是限制了子類對這個name屬性的訪問,但並不錯

真正的錯誤出現在了這個抽象方法的最後那對大括號了,因爲抽象方法不能夠有帶花括號!abstract method必須以分號結尾;

注意:抽象類也是可以有方法實現的,但是必須得有抽象方法的存在

2.public class Something{

 void doSomething(){

    private String s=" ";

    int l=s.length();

}

}

此處的錯誤有點簡單,就是局部變量前面不能有任何的訪問修飾符(public ,protected和private)。final可以用來修飾局部變量

(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)

strictfp, 即 strict float point (精確浮點)。

3.abstract class Something{

private abstract String doSomething();

}

這個很容易判斷,因爲訪問修飾符private只能在本類中訪問,但是抽象類是用來繼承的,他的抽象方法是要子類實現的的,但是如果用private修飾了之後就不能被子類訪問到了,所以此處的就錯了

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{

 syso(“i=" + i);

}

}

這個是沒有錯誤的,請不要疑神疑鬼的看到面試題讓找錯就說有錯,這個真沒錯!int i屬於instant variable(實例變量,或叫成員變量).instant variable有default value。int的default value是0

7.class Something{

 final int i;

public void doSomething(){

 syso(”i=“+i);

}

}

這個就在成員變量前面加了一個final就錯了,因爲final修飾的成員變量沒有默認值,必須在constructor(構造器)結束前被賦予明確的值,可以修改爲final int i =0;

8.public class Something{

  public static void main(String[] args){

  Something s=new Something();

 syso("s.doSomething() returns”+doSomething());

}

pulic String doSomething(){

return “Do something";

}

}

看上去還是不錯的哦!但是還是錯了!

乍一看,main方法裏面調用了同一個類中的doSomething()方法,畢竟兩個methods都在同一個class裏,但是仔細看main方法是static的。staticmethod不能直接call non-static methods。

9.這個Something類文件名叫OtherThing.java

class Something{

 private static void main(String[] something_to_do){

 syso("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(){

syso(x);

}

public static void main(String[] args){

new C().pX();

}

}

錯誤,變異的時候就會發生錯誤,(未明確的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");

syso(ball.getName());

}

}

這個是容易忽略的錯誤

接口是可以多繼承的,這個沒有錯誤。問題處在了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”)出報錯








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章