(Java之路之重新开始)面试题:接口排错问题

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类型的,不能重新赋值,所以编译错误。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值