黑马程序员技术交流社区

标题: 继承,实现的问题? [打印本页]

作者: 董志超    时间: 2012-9-30 07:08
标题: 继承,实现的问题?
本帖最后由 董志超 于 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引用不明却。
//请教一下到底咋回事?


作者: 尤洋    时间: 2012-9-30 07:44
父类和接口中有同名成员变量
同时继承和实现 会出现引用不明确的现象。
  不过去掉实现的这一步后 就没问题了。我运行你的程序也没问题
建议你删除原本编译的.class文件后 再试试
作者: 胡斌    时间: 2012-9-30 08:07

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();
            }
}


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

好了,谢谢
作者: 胡斌    时间: 2012-10-1 15:35
董志超 发表于 2012-10-1 08:08
好了,谢谢

呵呵,不用谢!
happy mid-autumn festival。




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