黑马程序员技术交流社区

标题: java 面试题 [打印本页]

作者: 李琼    时间: 2012-11-7 14:44
标题: java 面试题
本帖最后由 李琼 于 2012-11-7 19:40 编辑
  1. interface Playable {
  2. void play();
  3. }
  4. interface Bounceable {
  5. void play();
  6. }
  7. interface Rollable extends Playable, Bounceable {
  8. Ball ball = new Ball("PingPang");
  9. }
  10. class Ball implements Rollable {
  11. private String name;
  12. public String getName() {
  13. return name;
  14. }
  15. public Ball(String name) {
  16. this.name = name;
  17. }
  18. public void play() {
  19. ball = new Ball("Football");
  20. System.out.println(ball.getName());
  21. }
  22. }
复制代码
上述java题有错,本人眼戳,没看出来,求大神
作者: 颜峰    时间: 2012-11-7 15:04
Ball类中没有定义ball变量,说明19行的ball是使用接口中的,接口中的变量默认是static ,final的,不能进行赋值
作者: jsfjb    时间: 2012-11-7 15:22
接口中成员有固定的修饰符:public static final,这些修饰符会自动补上.
所以在

interface Rollable extends Playable, Bounceable {
Ball ball = new Ball("PingPang");
}

中定义的ball就是常量。不能再子类中,重写定义。


public void play() {
ball = new Ball("Football");
System.out.println(ball.getName());
}

上面的这个方法,是在子类中重写赋值。所以,就会出错。

哈哈哈

这道题,我刚看的时候确实有点绕。

作者: 杨志男    时间: 2012-11-7 15:55
  1. interface Playable {

  2. void play();

  3. }

  4. interface Bounceable {

  5. void play();

  6. }

  7. interface Rollable extends Playable, Bounceable {

  8. Ball ball = new Ball("PingPang");

  9. }

  10. class Ball implements Rollable {

  11. private String name;

  12. public String getName() {

  13. return name;

  14. }

  15. public Ball(String name) {

  16. this.name = name;
  17. }
  18. //这儿重写的应该是Playable接口的方法
  19. public void play() {

  20. ball = new Ball("Football");//在Ball类中并没有初始化自己的对象,所以这里应该是使用的Rollable接口的ball,而在接口中的变量或者对象都会默认被static和final修饰,是
  21.                                       //不能再次赋予新值的
  22. System.out.println(ball.getName());

  23. }

  24. }
复制代码

作者: 李琼    时间: 2012-11-7 19:40
还是滔哥给力啊。

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

结贴吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2