A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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,为什么?  接口里为常量  为什么会是这个结果

11 个回复

正序浏览
继承父类的属性和行为!!!
回复 使用道具 举报
因为你实现的是JJJ接口,在JJJ接口中有了这个变量他就不会再去HHH中找X这个值了,所以输出的是20
回复 使用道具 举报
本帖最后由 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-24 13:03
如果是另个都实现呢?

两个都实现的话,编译会报错:对x的引用不明确, JJJ中的变量 x和HHH中的变量 x都匹配
回复 使用道具 举报
首先,要知道接口中的变量不论你怎么定义,JVM都会默认帮我们加上public static final。就算你不写前面这些,或者只写了一部分,JVM都会帮我们补全。因为变量名一样,所以JJJ覆盖了HHH。所以答案是20,有问题再问
回复 使用道具 举报
是的,就近原则
回复 使用道具 举报
老师讲过,要根据就近原则,所以输出20
回复 使用道具 举报
如果是另个都实现呢?
回复 使用道具 举报
就近原则
回复 使用道具 举报
xiaofushen 发表于 2016-3-24 01:16
已经1点了,我先简单说一下,因为类Demo实现的是JJJ接口,输出的当然是JJJ接口中定义的常量20,要是这样:
clas ...

求告知。谢谢^_^
回复 使用道具 举报
已经1点了,我先简单说一下,因为类Demo实现的是JJJ接口,输出的当然是JJJ接口中定义的常量20,要是这样:
class Demo implements HHH,输出的就是HHH接口中定义的常量10,明天有时间再来回复详细的.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马