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

[c-sharp] view plaincopy
  1. //定义一个Runner接口
  2. public inerface Runner
  3. {
  4. int ID = 1;
  5. void run ();
  6. }
[java] view plaincopy
  1. //定义一个interface Animal,它继承于父类Runner
  2. interface Animal extends Runner
  3. {
  4. void breathe ();
  5. }
[c-sharp] view plaincopy
  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()不同。这正是多态性的体现。

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

转载于:https://www.cnblogs.com/simadi/p/6673129.html

Java 中extends与implements使用方法相关推荐

  1. JAVA中extends 与implements区别

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

  2. java中extends与implements的区别

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

  3. JAVA中extends与implements详解

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

  4. java中extends怎么用_Java 中extends與implements使用方法

    初學Java語言, 代碼中的extends和implements讓我感到很迷惑,現在終於弄明白它們之間的區別和用法了. //定義一個Runner接口 public inerface Runner { ...

  5. 浅谈java中extends与implements的区别

    Extends可以理解为全盘继承了父类的功能.implements可以理解为为这个类附加一些额外的功能:interface定义一些方法,并没有实现,需要implements来实现才可用.extend可 ...

  6. java中extends ,implements的顺序问题

    interface A { void fa(); } class C implements A{ void fa() {-} } 假如现在有类D,它需要实现接口A,也要继承类C, 当把extends放 ...

  7. 说说java中extends与implements的区别

    一.extends表示继承(扩展),只能继承不是声明为final或不是定义为abstract的类,并且只能继承 一个父类(不像C语言可以继承多个),继承后可以使用父类的方法,也可以重写父类的方法.写自 ...

  8. java中extends和implements的区别

    一. extends是继承类,implements是实现接口. 类只能继承一个,接口可以实现多个. extends继承父类的时候可以重写父类的方法,也可以调用父类的非私有方法:implements实现 ...

  9. java中extends用法_JAVA的extends用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  10. Java中图形界面重绘方法

    ** Java中图形界面重绘方法 **   在我们编写图形界面程序的过程中,我们就会发现,当我们将窗体拉伸,缩小(或者最大化最小化)的时候,之前在窗体上画的图形会消失了. 这是为什么呢?   1)原来 ...

最新文章

  1. Learun FrameWork 强大工作流引擎,让OA更智能
  2. Linux Ubuntu上架设FTP
  3. 第六周项目一-分数类的雏形(2)
  4. dedecms后台左侧菜单500错误怎么处理
  5. gprof使用介绍 (gcc -pg)
  6. 怎么学python-初学者如何学习Python?掌握这17个实用小技巧快速入门!
  7. IDE日志分析方法pt。 2
  8. 如何快速学习一门新的编程语言?
  9. [Codeforces 920E]Connected Components?
  10. python二级考试答案错误_如果name = “全国计算机等级考试二级Python”,以下选项中输出错误的是...
  11. vmware tools选项灰色解决办法(ubuntu 14.04)
  12. 删除下拉框只找23火星软件_删除下拉框速来火星下拉,删除下拉框就推92火星软件...
  13. ios8 xcode设置launchimage
  14. 手机下拉框是怎么做出来
  15. 杨国福麻辣烫递交招股书:9个月利润2亿 创始人曾放羊养猪
  16. 51单片机——74HC573锁存器
  17. css获取屏幕分辨率
  18. CSS普通属性篇(一):relative与absolute
  19. 一本通1325:【例7.4】 循环比赛日程表
  20. 主机远程登录报ssh_exchange_identification: read: Connection reset by peer

热门文章

  1. MySQL缓存推荐使用吗_Mysql 查询缓存利弊
  2. 又见回文数 NYOJ781
  3. java滥用接口_接口滥用问题
  4. 可做fft分析吗_2020速卖通还要做吗?速卖通2020年市场分析!
  5. java ssh jar_java应用程序远程登录linux并执行其命令(ssh jar包)
  6. 算法导论 高频算法题 数据结构与算法之美
  7. 矩阵计算 动手学深度学习 pytorch
  8. 算法:Number of Islands(岛屿的个数)
  9. java更改安卓图标_java – 一个按钮的Android背景文本图标
  10. std string与线程安全_是std :: regex线程安全吗?