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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @ne_pie尒ce 中级黑马   /  2013-11-8 18:39  /  984 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface  A{
   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) {
      new C().pX();
   }
}
运行这个程序,红x会出现编译异常,怎么解决?

yc.png (32.38 KB, 下载次数: 11)

yc.png

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
接口中的成员变量是被final修饰的,然后A接口和B按理解都可以算C的超类。x指向不明确,虚拟机报错吧。我也不知道你这个x是指向哪一个。尽量不要定义同名变量这么纠结的事
回复 使用道具 举报 1 0
  1. interface  A{
  2.    int x = 0;
  3. }
  4. class B{
  5.    int x =1;
  6. }
  7. class C extends B implements A {
  8.    public void pX(){
  9.       System.out.println(x);
  10.    }
  11.    public static void main(String[] args) {
  12.       new C().pX();
  13.    }
  14. }
复制代码
毕老师视频里说一个类只能单继承,因为当多个父类中定义了相同功能,但功能内容不同时,子类不确定要运行哪一个,但是为了保留多继承这种机制使得JAVA可以在继承一个类的同时实现一个甚至多个接口,你这个情况就是继承加实现,但是呢,你两个父类中还是定义了相同的变量x,所以你在调用的时候,不知道要运行哪一个x吧

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
System.out.println(x);这句代码报错的原因是:因为C类继承了B类,并且实现了A接口,相当于C类中也拥有了B类和A接口所有的非私有成员。B类中有一个成员x,A接口中也有一个成员x。在C类中的方法中如果想调用成员x,这时java虚拟机不知道应该调用哪一个x,就会编译报错。解决方法就是指明我们需要调用哪一个x。
如果想调用B类的那个x,实例化B类的对象调用,那么这句代码应该修改为:System.out.println(new B().x);
如果想要调用A接口的那个x成员,由于接口中的成员都是全局静态常量,直接接口名.即可,那么这句代码应该修改为:System.out.println(A.x);

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
帖子已重新分类,若仍有疑惑,可重新提问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马