`
peijunlin2008
  • 浏览: 167536 次
  • 性别: Icon_minigender_1
  • 来自: 河北省
社区版块
存档分类
最新评论

JAVA代码查错

阅读更多
1、
public class Something {
   void doSomething () {
       private String s = "";
       int l = s.length();
   }
}

有错吗?
答案: 。局部变量前不能放置任何访问修饰符 (private,public,和protected)。Final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。


2、
public class Something {
   public int addOne(final int x) {
       return ++x;
   }
}

这个比较明显。
答案: 。Int x被修饰成final,意味着x不能在addOne method中被修改。


3.
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并没有改变。


4、
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。

5.
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;"。

6、
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来明确。

7、
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");"这里显示有错。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics