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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐进 中级黑马   /  2012-10-25 21:19  /  1347 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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());
}
}
为什么会报异常?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 李连闯 于 2012-10-25 21:33 编辑

对于接口来讲,字段有默认的修饰符是final 和 static
也就是说Rollable 中的ball是被final修饰的,被final修饰的引用一旦初始化之后,就不能再重新指向新的对象了;
所以ball = new Ball("PingPang");初始化之后,就不能再指向新对象ball =new Ball("Football");了,所以会报错。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
Ball ball = new Ball("Football");
这样就没有异常了,在用变量之前必须先声明,否则,会报异常。在Rollable接口中使用的定义的ball的变量。
interface Playable {
        void play();
}

interface Bounceable {
        void play();
}

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

abstract class Rollable2 implements Playable,Bounceable{
        public static  Ball  ball = new Ball("PingPang");
//        public void play(){
//                System.out.println("abstract Rollable2");
//        }
}
class Ball extends Rollable2 {
        public static void main(String[] args){
                Rollable2 ball =new Ball("lii");
                ball.play();
        }
        private String name;

        public String getName() {
                return name;
        }

        public Ball(String name) {
                this.name = name;
        }

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

通过测试抽象方法的成员变量,可以被访问改变,但是接口中的成员变量不能被直接赋值,因为接口的默认的修饰符是public final,即使不被修饰,也会自动加上。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
bhxiaobo 发表于 2012-10-25 21:59
Ball ball = new Ball("Football");
这样就没有异常了,在用变量之前必须先声明,否则,会报异常。在Rollab ...

分析的很好!
回复 使用道具 举报
好像是这个问题
回复 使用道具 举报
   public   Ball  ball = new Ball("PingPang");   lz看看接口的定义吧,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马