1.先看第一个:
代码如下:
package com.atguigu.exer;
interface A {
int x = 0;
}
class B {
int x = 1;
}
public class C extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
找出上面代码的错误(编译或者是运行时的错误):
注意:继承和实现接口是处于同一级的,并不会像多继承那样如果直接父类和直接父类的父类都定义了一个相同的属性n,那么在子类中调用n时,调用的是直接父类的属性。
答案:因为C类既继承了B类又实现了A类,然后A和B类中都定义了变量x,此时在C类中调用x会产生歧义,不知道调用的是哪个类里面的x,所以编译时会报错。如下图:
2. 再看第二个
代码如下:
package com.atguigu.exer;
interface Playable{
void play();
}
interface Bounceable {
void play();
}
interface Rollable extends Playable, Bounceable{
Ball ball = new Ball("PingPang");
}
public 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());
}
}
同样也是从上面代码中找出错误。
答案:此时Rollable接口继承了Playable、Bounceable两个接口,说明Rollable中存在这两个接口的play方法。在Ball中对play方法进行了实现,此时并不会报错,可以看成既是对Playable接口方法的实现,又可以看成是对Bounceable方法的实现。上述代码的错误点在于对ball变量的重新赋值,因为接口里面的变量是final类型的,不能重新赋值,所以编译错误。