黑马程序员技术交流社区

标题: 还是一个关于接口的问题,求大神 [打印本页]

作者: 604840337    时间: 2016-3-24 00:02
标题: 还是一个关于接口的问题,求大神
interface HHH {
        public static final int x =10;
}
interface JJJ extends HHH {
        int x =20;
}
class Demo implements JJJ{
       public static void main(String[] args){
            System.out.println(x):
}
}

会出现X=20,为什么?  接口里为常量  为什么会是这个结果
作者: xiaofushen    时间: 2016-3-24 01:16
已经1点了,我先简单说一下,因为类Demo实现的是JJJ接口,输出的当然是JJJ接口中定义的常量20,要是这样:
class Demo implements HHH,输出的就是HHH接口中定义的常量10,明天有时间再来回复详细的.
作者: 604840337    时间: 2016-3-24 08:16
xiaofushen 发表于 2016-3-24 01:16
已经1点了,我先简单说一下,因为类Demo实现的是JJJ接口,输出的当然是JJJ接口中定义的常量20,要是这样:
clas ...

求告知。谢谢^_^
作者: 坚持到底    时间: 2016-3-24 12:54
就近原则
作者: 坚持到底    时间: 2016-3-24 13:03
如果是另个都实现呢?
作者: aomingchao    时间: 2016-3-24 13:12
老师讲过,要根据就近原则,所以输出20
作者: 2016coco    时间: 2016-3-24 20:28
是的,就近原则
作者: 段炸天    时间: 2016-3-24 22:28
首先,要知道接口中的变量不论你怎么定义,JVM都会默认帮我们加上public static final。就算你不写前面这些,或者只写了一部分,JVM都会帮我们补全。因为变量名一样,所以JJJ覆盖了HHH。所以答案是20,有问题再问
作者: xiaofushen    时间: 2016-3-25 01:42
坚持到底 发表于 2016-3-24 13:03
如果是另个都实现呢?

两个都实现的话,编译会报错:对x的引用不明确, JJJ中的变量 x和HHH中的变量 x都匹配
作者: xiaofushen    时间: 2016-3-25 02:32
本帖最后由 xiaofushen 于 2016-3-25 02:36 编辑

我把代码加了一些:
interface HHH {
public static final int x =10;
}
interface JJJ extends HHH {
int x =20;
}
class Demo implements JJJ{
static int x =30;
public static void main(String[] args){
  int x =40;
  System.out.println(x);  //输出40
  System.out.println(Demo.x); //输出30
  System.out.println(JJJ.x); //输出20
  System.out.println(HHH.x); //输出10
}
}
楼上一些回复说就近原则,其实我想楼主应该是知道就近原则,也知道是子类接口常量覆盖了同名的父类接口常量,其实楼主的意思是接口中定义的是常量,为什么还会被修改呢?严格来说,并不能说是覆盖,好像应该说隐藏,见上面多出的代码.接口是不能被阻止继承的.因此常量的体系可能会变得混乱,继承意味着可以覆盖,子接口可以改变父接口中常量的含义,我认为这是很荒谬的,我记得有人说过:"java语言中的边界,不是用来利用的,而是应该避免".接口不是用来干这个的.定义常量正确的做法应该是使用final的class.
一点个人见解,希望能帮到楼主,如有不对,还请各位指正.






作者: 叫我高祥小朋友    时间: 2016-3-25 08:41
因为你实现的是JJJ接口,在JJJ接口中有了这个变量他就不会再去HHH中找X这个值了,所以输出的是20
作者: haitao    时间: 2016-3-25 09:02
继承父类的属性和行为!!!




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