黑马程序员技术交流社区

标题: 代码查错,请帮忙 [打印本页]

作者: 一枝独秀/51    时间: 2012-6-27 20:20
标题: 代码查错,请帮忙
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();
   }
}
作者: 梁小波    时间: 2012-6-27 20:43
这样做会照成x变量有歧义,编译器不能判断到底打印哪个x;在class C中重定义x;或者去掉b,a,中的x;
编译器不会优先判断x,所以会报错;
作者: 李伟    时间: 2012-6-27 20:49
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-27 20:50
  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. }
复制代码

作者: 葛奎    时间: 2012-6-27 21:02
你继承了class B 又实现了 接口A  
恰好它们都包含了X成员变量,所以就造成了引用哪一个不明确
这是jvm默认规定的,这样写是通不过的.
这里需要明确注明这个x是哪里的:
1.System.out.println(A.x);//表示是接口A里面的,因为x默认是静态的
2.System.out.println(super.x);//这里表示是父类B里面的

作者: 谭立文    时间: 2012-6-28 01:14
本帖最后由 谭立文 于 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);         
     
   }
作者: 周朋飞    时间: 2012-6-28 01:52
这肯定会提醒你 这字段x引起歧义了吧,首先对象继承会有父类的一个x 实现接口也能通过对象加点调用x 那么到底调用的是哪个,编译器也懵了,所以就给你返回个错误,提醒你这样不行啊 哥们。
还有接口是一种协议,是一种标准,里面的变量都是公共的,静态的,而且是最终的常量,你考虑一下这种情况,如果一个接口当中有一个public访问权限的static的变量,我们可以再外部不用创建对象直接修改它的值,但是其他对象里的值也会随着改变,这就跟抽象类没区别了,所以接口中不能出现变量,如果出现就和接口这种统一的抽象是抵触的,所以接口中的属性必然是常量的 且只能读不能改




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