天天看點

初級人猿面試題02

菜鳥級

代碼改錯

1、

abstract class error{

private String name;

public abstract boolean isStupidName(String name) {

}

}

錯。abstract method 必須以分号結尾,且不帶花括号。

abstract class error{

private String name;

public abstract boolean isStupidName(String name);

}

2、

public class Something {

void doSomething () {

private String s = “”;

int l = s.length();

}

}

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

(final 如同 abstract 和 strictfp,都是非通路修飾符,strictfp 隻能修飾 class 和 method 而非

variable)。

public class Something {

void doSomething () {

final String s = “”;

int l = s.length();

}

}

3、

abstract class Something {

private abstract String doSomething ();

}

錯。abstract 的 methods 不能以 private 修飾。abstract 的 methods 就是讓子類

implement(實作)具體細節的,怎麼可以用 private 把 abstract method 封鎖起來呢? (同理,abstract method 前不能加 final)。

abstract class Something {

abstract String doSomething ();

}

4、

public class Something {

public int addOne(final int x) {

return ++x;

}

}

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

public class Something {

public int addOne(int x) {

return ++x;

}

}

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;

}

正确。在 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 int i 是個 final 的 instant variable (執行個體變量,或叫成員變量)。final 的 instant variable 沒有 default value,必須在 constructor (構造器)結束之前被賦予一個明确的值。可 以修改為"final int i =0;"。

class Something {

int i;

public void doSomething() { System.out.println("i = "+ i);

}

}

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-staticmethods。 可改成"System.out.println(“s.doSomething()returns " + s.doSomething());”。同理,static method 不能通路 non-static instant variable。

public class Something {

public static void main(String[] args) { Something s = new Something();

System.out.println("s.doSomething() returns " + doSomething());

}

public static String doSomething() {

return “Do something …”;

}

}

9、

此處,Something 類的檔案名叫 OtherThing.java class Something {

private static void main(String[] something_to_do){

System.out.println(“Dosomething …”);

}

}

正确。從來沒有人說過 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 staticfinal. 是以可以通過 A.x 來明确。

interface A{

int x = 0;

}

class B{

int x =1;

}

class C extends B implements A {

public void pX(){ System.out.println(super.x);

}

public static void main(String[] args) {

new C().pX();

}

}

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 = newBall(“Football”); System.out.println(ball.getName());

}

}

錯。“interfaceRollable extends Playable, Bounceable"沒有問題。interface 可繼承多 個 interfaces,是以這裡沒錯。問題出在 interface Rollable 裡的"Ball ball =new Ball(“PingPang”);”。任何在 interface 裡聲明的 interface variable (接口變量,也可稱成員變 量),預設為 public static final。也就是說"Ball ball = new Ball(“PingPang”);“實際上是"public staticfinal Ball ball = new Ball(“PingPang”);”。在 Ball 類的 Play()方法中,"ball = newBall(“Football”);"改變了 ball 的 reference,而這裡的 ball 來自 Rollable interface,Rollable interface 裡的 ball 是 public static final 的,final 的 object 是不能被改變 reference 的。是以 編譯器将在"ball = newBall(“Football”);"這裡顯示有錯。