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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董志超 中级黑马   /  2012-9-30 07:08  /  1773 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董志超 于 2012-10-1 08:17 编辑

interface  
{
        int x = 0;
}
class B
{
        int x =1;
}
class C extends B// implements A
{
           public void pX()
        {
                System.out.println(x);
           }
           public static void main(String[] args)
         {
                 C c=new C();
                c.pX();
           }
}
//编译失败,提示对x的引用不明确,我以为是即继承B又实现A,会不明确是那个x,但把A去掉还是编译失败,还是x引用不明却。
//请教一下到底咋回事?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
父类和接口中有同名成员变量
同时继承和实现 会出现引用不明确的现象。
  不过去掉实现的这一步后 就没问题了。我运行你的程序也没问题
建议你删除原本编译的.class文件后 再试试

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报

interface  A
{
         int x = 0;
}
class B
{
         int x =1;
}
class Greate extends B implements A
{
         
            public void pX()
         {
                 System.out.println(A.x);//这句话是要输出接口常量,如果你只用X来输出,那么在他们名字相同的情况下,将会产生二义性,系统不知道你要输出那个x。
          System.out.println(new B().x);//这句话是对B中变量的输出,通过new B(),系统就会找到要输出的值。
            }
            public static void main(String[] args)
          {
                  Greate c=new Greate();
                 c.pX();
            }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,你第一个想法是正确的,  implements未注释的时候,确实是 不明确是哪一个X,程序会对其产生歧义。
但是 你将implements注释后,  报的错就应该是 静态方法不能引用非静态字段了。    因为main函数是static的,而你继承B类过来的 成员属性 int x=1;是非静态的,当然就编译报错了。
回复 使用道具 举报
不好意思,刚刚看错了。   你的程序本身应没问题的。  如果implements 注释了的话,编译应该是不会报错的,可能是由于你更改了程序之后,木有重新编译吧,如果还是有报错的话,那你就把先前的.class文件删除 再重新编译下。应该是可以通过的。
回复 使用道具 举报
胡斌 发表于 2012-9-30 08:07
interface  A
{
         int x = 0;

好了,谢谢
回复 使用道具 举报
胡斌 中级黑马 2012-10-1 15:35:10
7#
董志超 发表于 2012-10-1 08:08
好了,谢谢

呵呵,不用谢!
happy mid-autumn festival。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马