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

//定义一个Runner接口

public inerface Runner

{

int ID = 1;

void run ();

}

//定义一个接口Animal,它继承于父类接口Runner

interface Animal extends Runner

{

void breathe ();

}

//定义Fish类,它实现了Animal接口的方法run()和breather()

class Fish implements Animal

{

public void run ()    //实现了Animal方法run()

{

System.out.println("fish is swimming");

}

public void breather()  //实现Animal的breather()方法

{

System.out.println("fish is bubbing");

}

}

//定义了一个抽象类LandAnimal,它实现了接口Animal的方法。

abstract LandAnimal implements Animal

{

public void breather ()

{

System.out.println("LandAnimal is breathing");

}

}

//定义了一个类Student,它继承了类Person,并实现了Runner接口的方法run()。

class Student extends Person implements Runner

{

......

public void run ()

{

System.out.println("the student is running");

}

......

}

//定义了一个接口Flyer

interface Flyer

{

void fly ();

}

//定义了一个类Bird,它实现了Runner和Flyer这两个接口定义的方法。

class Bird implements Runner , Flyer

{

public void run ()   //Runner接口定义的方法run()。

{

System.out.println("the bird is running");

}

public void fly ()   //Flyer接口定义的方法fly()。

{

System.out.println("the bird is flying");

}

}

//TestFish类

class TestFish

{

public static void main (String args[])

{

Fish f = new Fish();

int j = 0;

j = Runner.ID;

j = f.ID;

}

}

接口实现的注意点:

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中implements是什么意思_Java:extends和implements的区别+用法相关推荐

  1. java中的后台线程、前台线程、守护线程区别

    java中的后台线程.前台线程.守护线程区别 区别和联系 区别 联系 区别和联系 区别 后台线程和守护线程是一样的. 后台线程不会阻止进程的终止,而前台线程会, 可以在任何时候将前台线程修改为后台线程 ...

  2. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  3. Java学习笔记1:Java中有关print、println、printf的用法和区别

    Java学习笔记1:Java中有关print.println.printf的用法和区别 最近在学习java,写一些笔记记录下. 1.print()函数是一般的标准输出,但是不换行. 2.println ...

  4. java中集合的模型特点_Java 学习笔记(十四)集合

    集合 在开发的时候,如果需要存储多个数据,可以使用数组,不过数据是固定长度的,如果需要存储可变长度的多个数据,可以使用集合.集合提供存储空间可变的存储类型,存储的容量可以实时改变 集合分类 Colle ...

  5. java中的case1怎么说_Java 中的 CAS 简述及原理解析

    一.CAS 是什么? CAS(Compare And Swap),比较并交换,它是一条CPU并发原语.它的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的.1 publi ...

  6. java中容易混淆的方法_java中容易混淆的概念

    java中容易混淆的概念 1. 谈谈 final, finally, finalize 的区别final-修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不 能作为父类被 ...

  7. java中布尔值做比较_Java中的三态布尔值

    java中布尔值做比较 我不时地错过Java中SQL的三值BOOLEAN语义. 在SQL中,我们有: TRUE FALSE UNKNOWN (也称为NULL ) 时不时地,我希望自己也可以用Java表 ...

  8. java中的关键字有哪些_java关键字复习

    java关键字复习 Java的主要工作是通过编程语言来制作互联网页面.制作动态效果以及网站等技术,以下是小编为大家搜索整理的java关键字复习, 希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕 ...

  9. java中this是实例吗_java中this用法实例

    java中this用法实例,java this关键字的使用.this关键字,关于它的解释,可以概括为:哪一个对象在用这段代码,this就代表谁. 例如,"人"这个类,张三说,&qu ...

  10. java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍

    本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.什么是泛型? Java泛型设计原则:只要在编译时期没有出 ...

最新文章

  1. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法
  2. JAVA一个项目的路径为_java 得到项目路径
  3. Android权限申请的学习实践
  4. Java程序编译和运行的过程
  5. WebSockets 简介
  6. viewDidLoad、viewWillAppear、viewWillDisappear
  7. 学python适合什么年龄段的人用_7个现在就该学习Python 的理由【80%的人都不知道】...
  8. Team Foundation Server简介
  9. java 线程 内部_从Java中的main()内部在线程实例上运行wait()
  10. Futter基础第16篇: 实现单行文本框、多选框
  11. Netflix Ribbon 负载均衡 概述 与 基本使用
  12. 打印出现:You've implemented -[UIApplicationDelegate application:didReceiveRemoteNotification:...
  13. 基于RV1126平台imx291分析 --- v4l2_pipeline_pm_use
  14. 中古调式(调式音阶) 二
  15. C语言高效编程的四大秘技之以空间换时间
  16. 【错误记录】编译 Linux 内核报错 ( Unable to find the ncurses package. )
  17. 三角形质心坐标怎么求_三角形的重心怎么求
  18. Android Studio——飞入文字动画演示
  19. 家庭智能 HomeAssistant 四大组件的安装
  20. MathType中如何批量修改公式字体和大小

热门文章

  1. 会议纪要模板/数据分析需求文档
  2. Throwable 类
  3. 不再走弯路,自动化测试问题错误解决总结(问题+解决)全网最详细
  4. cogs 1114. [郑州培训2012] 暴力摩托
  5. 带你了解区块链的三种类型
  6. CDGA|盘点近年全国各部门、各城市颁布数字化转型的政策
  7. Unity 用鼠标拖动3D物体 跟随鼠标移动
  8. 狗狗们的守护天使!这位消防员帮12岁的盲眼狗狗重获新生
  9. struts2开发4--自定义拦截器把不文明用语改变成***
  10. Shell 之 免交互编程(expect用法)