黑马程序员技术交流社区

标题: 继承和接口中问题? [打印本页]

作者: 杨习平    时间: 2012-9-8 00:07
标题: 继承和接口中问题?
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-9-8 00:23
本帖最后由 杨千里 于 2012-9-8 00:24 编辑

小问题,发完贴睡觉,明天看答案
http://bbs.itheima.com/forum.php ... 24967&fromuid=36450


楼主看看这个帖子,  我的问题还没解决呢?{:soso_e120:}
作者: 李京    时间: 2012-9-8 00:27
本帖最后由 李京 于 2012-9-8 00:28 编辑

我复制了你的代码报告 System.out.println(x); 这的x有错误
The field x is ambiguous   字段x是有歧义的。
接口中只有抽象方法和常量。
类中有抽象方法(常量,变量)和非抽象方法。

用了继承又用了接口,会有两个x变量。虽然同名,但是是同一个x。
px()没有明确调用哪一个,所以会出错。
继承和接口中注销一个没有错。
想输出B中的x,那么就实例化B类调用。
想输出A中的x,那么就接口名.常量名,A.x。
作者: 杨卫腾    时间: 2012-9-8 00:54
这里继承和实现了一个同名的变量,这两个变量在内存中的位置是一样的,怎么能允许呢?
Java是强类型语言。

过程如下:

类在继承或者是实现后,父类以及接口中的非静态成员变量是在对内存中new对象的时候开辟空间的,
那么同一个区域里出现了两个同名的变量,主函数调用方法在栈内存操作时,方法它要用哪一个呢?

方法当然是不知道的了,所以编译是失败的。

但是类自身得有一个成员变量于接口或父类中的成员变量相同的话,接口或者父类中的同名变量便会
自己隐藏,这个时候才可以有两个同名的变量。
作者: 陈振兴    时间: 2012-9-8 01:29
Java接口中不允许定义变量!原因:
Java接口的本质就是提供统一的协议,实际上就是一个规范、标准。
它是公共类的,静态的,最终的常量,相当于全局变量。以此题为例,如果接口A中有一个public访问权限的变量 .按照java语义来讲,我们大可不必实现接口就能访问到变量X,通过A.x=XX;就可以改变接口中变量x的值。如果此值改变,那么实现接口A的所有对象也都会拥有这一改变后X的值,简单的说就是你一个地方改了所有的地方都改了。
所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的,所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供统一的属性。
最后的扩展,就是说你认为要变化的东西,就放在你自己的实现中,不能放在接口中,接口只是对一类事物的属性和行为更高层次的抽象对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。
此题的精华就在于此,共同学习!
作者: 杨习平    时间: 2012-9-9 14:38
很简单,已解决,自己疏忽,谢谢你们了!




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