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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一枝独秀/51 初级黑马   /  2012-6-27 20:20  /  1918 人查看  /  6 人回复  /   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();
   }
}

6 个回复

倒序浏览
这样做会照成x变量有歧义,编译器不能判断到底打印哪个x;在class C中重定义x;或者去掉b,a,中的x;
编译器不会优先判断x,所以会报错;
回复 使用道具 举报
interface  A{
   int x = 0;
}
class B{
   int x =1;
}
class C extends B implements A {
   public void pX(){
      System.out.println(x);//这个x在A和B中都有,引用的是哪一个不明确  
}
   public static void main(String[] args) {
      new C().pX();
   }
}

点评

提示你一下,一个是静态的一个不是  发表于 2012-6-28 20:05
回复 使用道具 举报
  1. interface  A{
  2.    static int x = 0;//接口中的属性全为静态常量
  3. }
  4. class B{
  5.    int x =1;
  6. }
  7. public class C extends B implements A {
  8.    public void pX(){
  9.       System.out.println(super.x);//引用父类属性要用super
  10.    }
  11.    public static void main(String[] args) {
  12.       new C().pX();
  13.    }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
你继承了class B 又实现了 接口A  
恰好它们都包含了X成员变量,所以就造成了引用哪一个不明确
这是jvm默认规定的,这样写是通不过的.
这里需要明确注明这个x是哪里的:
1.System.out.println(A.x);//表示是接口A里面的,因为x默认是静态的
2.System.out.println(super.x);//这里表示是父类B里面的

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 这是一种变量冲突的解决方式

查看全部评分

回复 使用道具 举报
本帖最后由 谭立文 于 2012-6-28 01:16 编辑

当你实现的接口和继承的类,中有相同的变量名时,此时你若写 this.x  计算机就无法分辨出你要用的到底是哪一个x了,便产生二义性,程序无法编译通过。
那么如何解决呢?
首先要清楚在接口里只能定义方法和常量
interface  A{
   int x = 0;  //即便这样写也是一个常量
  float  x = 0  ; //若是float型或其他的类型,只要名字与B中的变量相同同样无法编译通过
}

那么我们可以这样加以区分:
public void pX()
   {
      System.out.println(super.x);     
      System.out.println(A.x);         
     
   }

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
这肯定会提醒你 这字段x引起歧义了吧,首先对象继承会有父类的一个x 实现接口也能通过对象加点调用x 那么到底调用的是哪个,编译器也懵了,所以就给你返回个错误,提醒你这样不行啊 哥们。
还有接口是一种协议,是一种标准,里面的变量都是公共的,静态的,而且是最终的常量,你考虑一下这种情况,如果一个接口当中有一个public访问权限的static的变量,我们可以再外部不用创建对象直接修改它的值,但是其他对象里的值也会随着改变,这就跟抽象类没区别了,所以接口中不能出现变量,如果出现就和接口这种统一的抽象是抵触的,所以接口中的属性必然是常量的 且只能读不能改

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 区别还是有的

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马