接口5-10 重名常量问题

接口5-10 重名常量问题

根据课程可知,接口和父类有重名常量,子类不需要打印调用等操作的话,子类是可以不用去重新定义的,不是必须的。这不像多个接口有重名默认方法,就一定得在实现类去重写,不然就是错误。

1、老师,父类有与接口的重名常量,子类难道就不能默认继承,什么错误都没有吗?难道父类的常量,子类继承不了?

2、多个接口有重名常量,实现类是会默认继承接口的属性和方法的,这时候实现类是不是就不会去继承任何一个接口的常量?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小班 2019-08-25 17:35:29

同学你好,1、非常抱歉这里老师的第一个代码有问题,没有重名变量的情况下,还是会继承的,但是一旦有了重名变量,还是需要在子类中定义一下,例如:

有重名变量,程序报错(JVM会不知道到底调用的是哪个x)

http://img1.sycdn.imooc.com//climg/5d62529f00011a7a06070578.jpg

没有重名变量

http://img1.sycdn.imooc.com//climg/5d6252b80001f7c406080597.jpg

程序就不报错了!

2、当接口的默认方法与父类方法同名时,默认指向父类中的方法,在课程5-9的5分58秒后都讲的是这段内容哦

interface One {
	 int x = 11;
}

interface Two {
	final int x = 22;
	 default int getData(){
	        return 10;
	    }
}

class Three {
	final int x = 33;
	 public int getData(){
	        return 100;
	    }
}

public class TestOne extends Three implements One,Two {
	public static void main(String[] args) {
		TestOne one = new TestOne();
		Two two = new TestOne();
		System.out.println(one.getData());
		System.out.println(two.getData());
	}

}

输出结果为

http://img1.sycdn.imooc.com//climg/5d625652000170c302110104.jpg

父类中的100!

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 鱼儿0001 #1
    老师你的回复所答非所问啊,我问的是:根据老师对第一个问题的回复,我觉得父类有与接口同名的方法,按理说接口的默认方法会覆盖父类的同名方法,可是没有。实现类继承了父类的同名方法,当然实现类也可以重写。老师,在这里怎么与接口的常量覆盖父类常量的概念不同啊?
    2019-08-26 17:13:09
  • 好帮手慕小班 回复 提问者 鱼儿0001 #2
    同学你好,方法与常量本身就不相同,对应在JVM(Java虚拟机)中存储的位置也不一样,所以在设计时,方法和常量对应的规则也都是不同的,就好比我们不能要求玩具厂和水泥厂的工作流程一致,所以都是属于工厂,但是功能不同,流程也就不一致,行业规则也不一样。如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
    2019-08-26 19:19:40
好帮手慕酷酷 2019-08-24 17:32:20

同学你好,

1、父类的常量子类继承了,但是由于接口也实现了这个类,所以将这个常量覆盖掉了。

例如:

Animal类中定义a常量

http://img1.sycdn.imooc.com//climg/5d6102520001727802380102.jpg

IFly接口中定义一个同名a常量

http://img1.sycdn.imooc.com//climg/5d6102770001c0d803250071.jpg

Bird类继承Animal类然后实现IFly接口

http://img1.sycdn.imooc.com//climg/5d6102a400011a3805290033.jpg

测试类获取Bird类的这个常量

http://img1.sycdn.imooc.com//climg/5d6102d70001563303910143.jpg

输出结果为:接口中定义的值1

http://img1.sycdn.imooc.com//climg/5d6102e500013b4c01530080.jpg

public class Bird extends Animal  implements IFly 根据这个代码的执行顺序,先继承在Animal类的a常量,之后实现IFly接口中也有a常量,JVM会自动帮我们覆盖掉之前的继承的a常量。也就只能获取到这个实现类的a常量。

2、你的理解是正确的,我们可以使用代码去实现一下同学的问题

例如:

IFly接口有一个a常量值为1

http://img1.sycdn.imooc.com//climg/5d60ffd00001ea8303420080.jpg

IPlay接口中,有一个a常量,值为8

http://img1.sycdn.imooc.com//climg/5d61001000017e8802860118.jpg

Bird类实现IFly和IPlay两个接口

http://img1.sycdn.imooc.com//climg/5d6100430001d3b804200040.jpg

Test类中调用这个常量,是会报错的,原因是a常量的调用的模糊不清的,Java不知道掉用的是哪个接口的常量。

http://img1.sycdn.imooc.com//climg/5d61008300015b7705250165.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 提问者 鱼儿0001 #1
    谢谢老师的回复。1、老师对第一个问题的回复,我大概懂老师的意思了,父类和接口有重名常量,接口会覆盖实现类继承自父类的常量,实现类最后继承的是接口里的常量。可是/5-10课程里仍然需要在实现类去重写自己的常量,不然打印时报错,这是为什么?2、根据老师对第一个问题的回复,我觉得父类有与接口同名的方法,按理说接口的默认方法会覆盖父类的同名方法,可是没有。实现类继承了父类的同名方法,当然实现类也可以重写。老师,在这里怎么与接口的常量覆盖父类常量的概念不同啊?3、
    2019-08-25 14:04:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师