黑马程序员技术交流社区

标题: 接口实现的疑问 [打印本页]

作者: 曹德君    时间: 2013-4-12 14:57
标题: 接口实现的疑问
  1. interface Inter
  2. {
  3.         public static final int NUM=3;
  4.         public abstract void show();

  5. }

  6. class Test implements Inter
  7. {
  8.         public void show(){}
  9. }

  10. class  InterfaceDemo
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                         Test t = new Test();
  15.                         System.out.println(t.NUM);
  16.                         System.out.println(Test.NUM);
  17.                         System.out.println(Inter.NUM);
  18.         }
  19. }
复制代码
对成员变量优点糊涂。Test在这里为什么能直接调用接口Inter的成员变量呢?接口在被其他类实现的时候,该类和接口的关系是怎样的?
作者: 梁航斌    时间: 2013-4-12 15:02
本帖最后由 梁航斌 于 2013-4-12 15:04 编辑

类实现了接口类似于继承,但是要实现里面的方法才行。接口里面定义的属性是可以用的。要区分接口和抽象类。
作者: 曹德君    时间: 2013-4-12 15:06
梁航斌 发表于 2013-4-12 15:02
类实现了接口类似于继承,但是要实现里面的方法才行。接口里面定义的属性是可以用的。要区分接口和抽象类。 ...

这个属性实现的类是可以直接调用的的话。如果这个类也有同名的属性,他们怎么区分呢?
作者: 梁航斌    时间: 2013-4-12 15:13
我想应该和继承关系一样,会被后来的覆盖吧。实在要用的话就Inter.NUM吧
我做了个实验你看看
  1. interface Inter
  2. {
  3.         public static final int NUM=3;
  4.         public abstract void show();

  5. }

  6. class Test implements Inter
  7. {
  8.         public static final int NUM=4;//加了个同名的
  9.         public void show(){}
  10. }

  11. class  InterfaceDemo
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                         Test t = new Test();
  16.                         System.out.println(t.NUM);
  17.                         System.out.println(Test.NUM);
  18.                         System.out.println(Inter.NUM);
  19.         }
  20. }
复制代码
结果是443
作者: 曹德君    时间: 2013-4-12 15:15
梁航斌 发表于 2013-4-12 15:13
我想应该和继承关系一样,会被后来的覆盖吧。实在要用的话就Inter.NUM吧
我做了个实验你看看结果是443 ...

哦,明白了。3q
作者: 本人已死    时间: 2013-4-12 15:16
实现了接口,就是实现了接口里面的方法,再接口的定义中,即使没有显示其中的成员用public标示,但是这些成员都是public访问类型的。接口里面的变量默认都是public static final 标示的,所以接口中定义的变量就是静态的全局变量,所以直接或间接的都可以访问。
接口与该类的关系我理解为:如果一个父类已经满足不了该类的话,就用接口的方法,或者接口间接地实现了类的多重继承,避免单一继承的局限性,使其更加灵活
作者: 王婷婷    时间: 2013-4-12 15:38
接口是对外暴露的规则。就像笔记本上的外部插口一样,只要U盘、鼠标、键盘等的型号与之匹配,那么这些外接输入设备就可以使用。至于笔记本内部构造是怎样实现的,我们就不用管了。一个类只要实现了接口就扩展了接口中的方法(即我们都会学习,学习是接口中的方法,但学习的内容不同),也可以直接访问接口中的成员。类与接口之间是实现关系,而且一个类在继承一个类的同时可以实现多个接口。
不知理解的对不对,{:soso_e113:}

作者: 黄玉昆    时间: 2013-4-12 16:42
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 王军行    时间: 2013-4-12 18:07
我觉得你的问题是在继承或者实现没分清变量和函数的区别
在发生继承或者实现关系也就是存在多态时候
多态中成员变量的特点:无论编译运行都看左边(引用型变量所属的类)
多态中静态成员函数的特点:无论编译运行都看左边(引用型变量所属的类)
多态中非静态成员函数的特点:
在编译时期,参阅引用型变量所属的类中是否有调用的方法,有通过。没有失败
在运行时期,参阅对象所在的类中是否有调用的方法
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
变量和函数是不同的





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