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

  1. //定义一个Runner接口
  2. public inerface Runner
  3. {
  4. int ID = 1;
  5. void run ();
  6. }
  1. //定义一个interface Animal,它继承于父类Runner
  2. interface Animal extends Runner
  3. {
  4. void breathe ();
  5. }
  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()
  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接口定义的方法。
  40. {
  41. System.out.println("the bird is running");
  42. }
  43. public void fly ()   //Flyer接口定义的方法。
  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 a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?

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

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

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

假如这样定义:
class A

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

{
    int j;
    void f(){}       //重写
    void g(){}
}
然后:
B b = new 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. PHP中的 extends与implements 区别 [转]

    extends 是继承某个类 继承之后可以使用父类的方法 也可以重写父类的方法 implements 是实现多个接口 接口的方法一般为空的 必须重写才能使用 extends是继承父类,只要那个类不是声 ...

  2. 【翻译】在TypeScript中,Extends和Implements一个抽象类有什么不同

    我们知道在TypeScript中一个类既可以被implement也可以被extends,有一些C#或java基础的同学可能会对此感到困惑,因为在上述两个面向对象的语言里面只有接口可以被implemen ...

  3. Java中<?>,<? extends E>,<? super E>

    在集合中,经常可看到<?>,<? extends E>,<? super E>,它们都是属于泛型: <?>: 是泛型通配符,任意类型,如果没有明确,那么 ...

  4. Java 中extends与implements使用方法

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

  5. Java 中extends与implements使用方法 (转载)

    转自:http://blog.csdn.net/chen_chun_guang/article/details/6323201 初学Java语言, 代码中的extends和implements让我感到 ...

  6. Java:extends和implements的区别+用法

    Java代码中的extends和implements让我感到很迷惑,现在终于弄明白它们之间的区别和用法了. [c-sharp] view plain copy //定义一个Runner接口 publi ...

  7. java中继承和多态的理解

    继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...

  8. java中一些常考知识

    一.static的作用 static是修饰符,用于修饰成员变量(静态变量/类变量). static修饰的成员被所有对象共享. static优先于对象存在. static修饰的成员可以用类名.静态成员来 ...

  9. JAVA中extends 与implements区别

    JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...

随机推荐

  1. 使用dva脚手架(dva-cli)快速构建React项目

    安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具, ...

  2. Oracle 查看锁情况

    /*查看锁(lock)情况*/ SELECT ls.osuser os_user_name, ls.username user_name, decode(ls.type, 'RW', 'Row wai ...

  3. [CENTOS7] 加入Windows域

    This following article is a snapshot from: https://www.rootusers.com/how-to-join-centos-linux-to-an- ...

  4. [WSUS] Windows Server Update Service 更新后,出现错误不能连接

    执行以下命令:C:\Program Files\Update Services\Tools\wsusutil postinstall /servicing 参考:http://www.urtech.c ...

  5. 使用NSClassFromString

    使用NSClassFromString 使用NSClassFromString可以直接从字符串初始化出对象出来,即使不引用头文件也没关系,以下是源码: AppDelegate.m // // AppD ...

  6. 使用CAReplicatorLayer [1]

    使用CAReplicatorLayer [1] 说明 https://developer.apple.com/library/ios/documentation/GraphicsImaging/Ref ...

  7. 更改SQL实例端口

    为SQL Server使用非标准的端口 你正在使用标准的端口号1433来连接SQL Server 2005吗?你考虑过设置SQL Server来监听一个不同于1433的端口号吗?我曾经就是这样.在这篇 ...

  8. Office 365实现单点登录系列(3)—使用Azure AD Connect 进行目录同步

    Hello 小伙伴们,我回来了~ 2017年底中招了流感,还得了结膜炎,我也是无奈的···但使命感驱使我还是要把文章更完(这么敬业还不点赞关注(*^__^*) ) 我们接着上一篇文章继续说,上一篇已经 ...

  9. 电脑技巧——DOS和windows的区别?

    本质:都是微软公司的操作系统,某种从程度上说windows是dos的后续操作系统版本.只是windows相比dos有质的飞跃.dos只支持命令操作,windows则有了良好的图形操作界面,window ...

  10. Promise & Deferred objects in JavaScript Pt.1: Theory and Semantics.

    原文:http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and-semanti ...