黑马程序员技术交流社区

标题: 一道练习题,它说编译会有问题,怎么看出来 [打印本页]

作者: superob123    时间: 2014-5-31 22:29
标题: 一道练习题,它说编译会有问题,怎么看出来
就这道题
  1. interface A
  2. {
  3.      int x=1;
  4. }

  5. class B
  6. {
  7.      int x=2;
  8. }

  9. class C extends B implements A
  10. {
  11.      public static void main(String[] args)
  12.       {
  13.            System.out.println(x);
  14.      }
  15. }
复制代码


这代码有什么问题,求高手解答。
作者: 松涛小玮    时间: 2014-5-31 22:34
因为在接口中的全局变量默认都是public static final ;就算你在接口中写了int x=1;实际上定义的还是public static final int x=1;因为有final关键字,所以变量x的值是不可以被修改的。但是你继承了类B,也继承了一个x变量,且值与接口定义的不同,所以就会报错。修改错误的方法就是:将其中一个变量x改成任何其他字母。否则你再程序中使用x变量时,程序根本不知道你要使用的是接口的x变量还是继承的类的x变量
作者: Lex    时间: 2014-5-31 22:34
大神,你的main放在C类里,JVM怎么找到执行的入口呢?很明显的错误啊,版主加个分吧,一天没加分了........:Q
作者: 葛晓东    时间: 2014-5-31 22:38
你把main函数  写到C类中,怎么会运行啊?
作者: 黎志勇    时间: 2014-5-31 22:57
把B类的成员变量x改成其他可用名;
  1.     interface A
  2.     {
  3.          int a=1;
  4.     }

  5.     class B
  6.     {
  7.          int x_another=2;
  8.     }

  9.     class C extends B implements A
  10.     {
  11.          public static void main(String[] args)
  12.           {
  13.                System.out.println(x);
  14.          }
  15.     }
复制代码

或者把接口A里面的变量x改成其他可用名,同时在B声明变量x的时候,加上静态变量标识符“static”。
  1.     interface A
  2.     {
  3.          int a=1;
  4.     }

  5.     class B
  6.     {
  7.         static int x=2;
  8.     }

  9.     class C extends B implements A
  10.     {
  11.          public static void main(String[] args)
  12.           {
  13.                System.out.println(x);
  14.          }
  15.     }
复制代码

作者: 黑马粉、峥    时间: 2014-5-31 23:08
你这代码是出问题的,因为你的主函数C 继承了class B 实现了 接口 A,但是他们类里面都有 变量 x,接口里面变量都被 public static final修饰 成为常量不可被修改,所以当你运行主函数调用 变量x 的时候 ,JVM就不知道指向哪个里面的x ,所以就会出现程序报错。




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