面试题之代码纠错

来源:互联网 发布:yoosee软件下载 编辑:程序博客网 时间:2024/04/29 19:38

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”)出报错








0 0