结构推理 判断下列程序是否存在问题?
   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");”
这里显示有错。
【答案解析】