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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 呆呆呆 中级黑马   /  2013-12-21 17:01  /  1199 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 呆呆呆 于 2013-12-22 18:50 编辑
  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 getX(){
  9. System.out.println(x);
  10. }
  11. public static void main(String[] args) {
  12. new C().getX();
  13. }
  14. }
复制代码
编译错误。求解释。还有怎么样能打印出来A或者B的x?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
System.out.println(x);   //变量未定义

这样就可以输出:
public static void main(String[] args) {

int A=AAAA.x;
int B=new BBBB().x;


System.out.println(A+""+B);

}
回复 使用道具 举报
本帖最后由 panzhenglian 于 2013-12-21 19:56 编辑

C.class这个类在继承了B类的同时,又实现了A接口, 而A接口和B类中有相同的成员变量都被继承下来,等于C.class这个类中同时出现了两个变量,所以会报错,在变量前面加上类名就可以了
要注意的是,A接口的成员变量默认是静态的,可以通过类名调用, 而B只能创建对象或者匿名对象来调用
  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 getX(){
  9.                 System.out.println(A.x);
  10.                 System.out.println(new B().x);
  11. }
  12.         public static void main(String[] args) {
  13.                 new C().getX();
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 其LovE斤 于 2013-12-21 20:38 编辑

接口A:
接口中所有的成员变量都隐含的是
public static final  的,因此接口中的成员变量都是静态最终变量。
也就是说  int X 最好是大写。
同时这里int x = 0;是放在静态常量区的。

类B:
定义的是一个默认权限  protected 的成员变量
这里的 int x=1 放在 new出对象的堆内存中。

类C:
有一个非静态的成员方法 getX(),
1:在你这个个方法中  打印x,   x在这里是局部变量,局部变量在没有任何引用的情况下是需要初始化的。同时局部变量是放在栈内存中。
2: 这个局部变量x,你是要调用 B类  或者  A接口的 x
在main方法中,你new了一个C   在堆内存中开辟了一片内存空间。
在继承 B  和实现A 的时候是没有错的
接下来就错了,是在 方法getX()中     栈内存中的的x  是该引用(指向)  静态常量区(接口A)的x ?
                                                          还是引用(指向)  你new出来的C的堆内存中隐式拥有的 类B 的x?
                                                          如果你谁也不引用(指向),你又没初始化。。也错。。
获得接口A 和 父类B 的 x的值的代码
呃。。和楼上的一样不写了。{:soso_e117:}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
首先报错的原因是出现在:
C类的System.out.println(x);中
是X指向不明确。
因为这个x不知道是指B类中的x或者是接口A中的x。
但如果抽象类中的抽象方法声明与接口中的方法声明的名字是一样。
是可以直接进行重写,因为他们都知事个方法声明没有任何意思,
而成员变量是有值的,所以有描述的意义,会出现指向不明的错误。

interface A
{
        int x = 0;
}

class B
{
        int x = 1;
}

class C extends B implements A
{
        public void a()
        {
                System.out.println(A.x);
                System.out.println(new B().x);
        }
}

还有一种最好的方法就是把A、B中的x变量名更改,因为这样没有什么太大的意义。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你在A接口和B类里面的X没有标识他们不是同一个X,所以系统也没法识别你到底要打印哪一个,你可以这样写
public class Test2 {
        public static void main(String[] args) {
                new C().getX();
        }
}

interface A {
        int x = 0;

}

class B {
        int y = 20;
}

class C extends B implements A {
        public void getX() {
                System.out.println(y);
                System.out.println(x);
        }

}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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