黑马程序员技术交流社区

标题: 关于接口的一个问题 [打印本页]

作者: 唐进    时间: 2012-10-25 21:19
标题: 关于接口的一个问题
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());
}
}
为什么会报异常?
作者: 李连闯    时间: 2012-10-25 21:31
本帖最后由 李连闯 于 2012-10-25 21:33 编辑

对于接口来讲,字段有默认的修饰符是final 和 static
也就是说Rollable 中的ball是被final修饰的,被final修饰的引用一旦初始化之后,就不能再重新指向新的对象了;
所以ball = new Ball("PingPang");初始化之后,就不能再指向新对象ball =new Ball("Football");了,所以会报错。
作者: 李靖    时间: 2012-10-25 21:59
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,即使不被修饰,也会自动加上。
作者: 唐进    时间: 2012-10-25 22:33
bhxiaobo 发表于 2012-10-25 21:59
Ball ball = new Ball("Football");
这样就没有异常了,在用变量之前必须先声明,否则,会报异常。在Rollab ...

分析的很好!
作者: 唐进    时间: 2012-10-25 22:34
好像是这个问题
作者: 一身顺利    时间: 2012-10-26 09:39
   public   Ball  ball = new Ball("PingPang");   lz看看接口的定义吧,




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