Java代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了。

[c-sharp] view plain copy

  1. //定义一个Runner接口
  2. public inerface Runner
  3. {
  4. int ID = 1;
  5. void run ();
  6. }

[java] view plain copy

  1. //定义一个接口Animal,它继承于父类接口Runner
  2. interface Animal extends Runner
  3. {
  4. void breathe ();
  5. }

[c-sharp] view plain copy

  1. //定义Fish类,它实现了Animal接口的方法run()和breather()
  2. class Fish implements Animal
  3. {
  4. public void run ()    //实现了Animal方法run()
  5. {
  6. System.out.println("fish is swimming");
  7. }
  8. public void breather()  //实现Animal的breather()方法
  9. {
  10. System.out.println("fish is bubbing");
  11. }
  12. }
  13. //定义了一个抽象类LandAnimal,它实现了接口Animal的方法。
  14. abstract LandAnimal implements Animal
  15. {
  16. public void breather ()
  17. {
  18. System.out.println("LandAnimal is breathing");
  19. }
  20. }
  21. //定义了一个类Student,它继承了类Person,并实现了Runner接口的方法run()。
  22. class Student extends Person implements Runner
  23. {
  24. ......
  25. public void run ()
  26. {
  27. System.out.println("the student is running");
  28. }
  29. ......
  30. }
  31. //定义了一个接口Flyer
  32. interface Flyer
  33. {
  34. void fly ();
  35. }
  36. //定义了一个类Bird,它实现了Runner和Flyer这两个接口定义的方法。
  37. class Bird implements Runner , Flyer 
  38. {
  39. public void run ()   //Runner接口定义的方法run()。
  40. {
  41. System.out.println("the bird is running");
  42. }
  43. public void fly ()   //Flyer接口定义的方法fly()。
  44. {
  45. System.out.println("the bird is flying");
  46. }
  47. }
  48. //TestFish类
  49. class TestFish
  50. {
  51. public static void main (String args[])
  52. {
  53. Fish f = new Fish();
  54. int j = 0;
  55. j = Runner.ID;
  56. j = f.ID;
  57. }
  58. }

接口实现的注意点:

a)实现一个接口就是要实现该接口的所有的方法(抽象类除外)。
b)接口中的方法都是抽象的。
c)多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。

extends与implements的区别:

extends 是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就用到了implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了。

比如:

class A extends B implements C,D,E {}    (class 子类名 extends 父类名 implenments 接口名)

父类A与子类B继承关系上的不同:

A a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?

***********************************************************************************************

class B extends A
继承过后通常会定义一些父类没有的成员或者方法。
A a = new B();
这样是可以的,上传。
a是一个父类对象的实例,因而不能访问子类B定义的新成员或方法。

***********************************************************************************************

假如这样定义:
class A

{
   int i;
   void f(){}
}
class B extends A

{
    int j;
    void f(){}       //重写
    void g(){}
}
然后:
B b = new B();
b就是子类B对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如b.i,b.j,b.f(),b.g()都是合法的。此时b.f()是访问的B中的f()

A a = new B();
a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而a.j,a.g()非法。此时访问a.f()是访问B中的f()

***********************************************************************************************

A a = new B(); 这条语句,实际上有三个过程:
(1) A a;
将a声明为父类对象,只是一个引用,未分配空间
(2) B temp = new B();
通过B类的构造函数建立了一个B类对象的实例,也就是初始化
(3) a = (A)temp;
将子类对象temp转换为父类对象并赋给a,这就是上传(upcast),是安全的。
经过以上3个过程,a就彻底成为了一个A类的实例。
子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的。

***********************************************************************************************

a.f()对应的应该是B类的方法f()
调用构造函数建立实例过后,对应方法的入口已经确定了。
如此以来,a虽被上传为A类,但其中重写的方法f()仍然是B的方法f()。也就是说,每个对象知道自己应该调用哪个方法。
A a1 = new B();
A a2 = new C();
a1,a2两个虽然都是A类对象,但各自的f()不同。这正是多态性的体现。

Java:extends和implements的区别+用法的更多相关文章

  1. java中extends与implements的区别

    学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...

  2. java extends和implements区别

    一.作用说明 extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 二.补充 JAVA ...

  3. java extend 和 implements 的区别

    1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重 ...

  4. extends 与 implements 的区别

    extends与implements是Java继承中使用的两个关键字,但extends与implements使用的情景不同: 1.接口继承接口,使用extends 2.类继承类时,用extends 3 ...

  5. extends 与implements的区别和用法

    1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以 ...

  6. java中extends和implements的区别

    implements:接口 1.实现一个接口就是要实现该接口中的所有方法(抽象类除外) 2)接口中的方法都是抽象的 多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口 extends:继承父 ...

  7. extends和implements的区别

    extends表示继承 implements表示抽象类的接口

  8. Java 中extends与implements使用方法

    Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...

  9. Java 中的extends 和 implements

    初学Java语言, 代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了. //定义一个Runner接口 public inerface Runner { ...

随机推荐

  1. kali linux 2.0下搭建DVWA渗透测试演练平台

    DVWA (Dam Vulnerable Web Application)DVWA是用PHP+MySQL编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...

  2. 在Android中使用枚举注解而不是枚举

    Enums often require more than twice as much memory as static constants. You should strictly avoid us ...

  3. html4与html5的区别及html5的一些新特性

    区别 1.html5语法的改变 HTML5简化了很多细微的语法,例如: 1.1doctype的声明; html4: <!DOCTYPE HTML PUBLIC "-//W3C//DTD ...

  4. 关于《Unity3D/2D游戏开发从0到1》书籍再版说明

    关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...

  5. <当幸福来敲门>之一些很喜欢的台词收藏

    <当幸福来敲门> ================ ================

  6. WeQuant交易策略—Chaikin A/D

    策略名称:AD指标策略 多空双方力量浮标- AD(Chaikin A/D线)策略关键词:ChaikinA/D线.多空对比.AD指标是一种非常流行的平横交易量指标, 用于估定一段时间内该证券累积的资金流 ...

  7. 使用Coding.net+Hexo+node.js+git来搭建个人博客

    使用Coding.net来搭建基于Hexo的博客 一.准备工作 什么是Coding.net Coding可以说,就是国产的Github,但是,有一个功能使它似乎超越了GitHub-那就是 Web ID ...

  8. Extjs:添加查看全部按钮

    var grid =new Ext.grid.GridPanel({ renderTo:'tsllb', title:'产品成本列表', selModel:csm, height:350, colum ...

  9. Ext.data.Store添加动态参数

    多条件查询页面的参数都是动态的,并且我们通常还会有默认加载页面.此时,动态添加参数非常重要,其中baseparam是解决问题的关键. @ 将查询条件定义为一个全局变量 var param_01 = & ...

  10. hashMap遍历方式

    package Ch17; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java ...