A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李琼 中级黑马   /  2012-11-7 14:44  /  1900 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李琼 于 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题有错,本人眼戳,没看出来,求大神

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

4 个回复

倒序浏览
Ball类中没有定义ball变量,说明19行的ball是使用接口中的,接口中的变量默认是static ,final的,不能进行赋值

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
接口中成员有固定的修饰符: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());
}

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

哈哈哈

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

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
还是滔哥给力啊。

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

结贴吧。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马