初學Java語言, 代碼中的extends和implements讓我感到很迷惑,現在終於弄明白它們之間的區別和用法了。

//定義一個Runner接口 public inerface Runner { int ID = 1; void run ();}

//定義一個interface Animal,它繼承於父類Runnerinterface 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() { 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"); } ......} //定義了一個接口Flyerinterface Flyer{ void fly ();} //定義了一個類Bird,它實現了Runner和Flyer這兩個接口定義的方法。class Bird implements Runner , Flyer{ public void run () //Runner接口定義的方法。 { System.out.println("the bird is running"); } public void fly () //Flyer接口定義的方法。 { 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 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怎么用_Java 中extends與implements使用方法相关推荐

  1. java中抽象类继承抽象类_Java中的抽象类用示例解释

    java中抽象类继承抽象类 Abstract classes are classes declared with abstract. They can be subclassed or extende ...

  2. java不能覆盖父类的_java中子类覆盖父类方法所必须满足的条件

    一.描述 子类重写(覆盖)父类的方法必须满足的条件: 1.父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为pr ...

  3. java抽象类有什么用_java中抽象类的作用是什么?抽象类作用的例子

    你知道java当中抽象类的作用是什么吗?有什么作用?下面和小编一起来详细的了解一下具体的作用,以及看看抽象类作用的例子吧! 一.java抽象类的作用 java抽象类的作用具体的可以分成以下的三点: 1 ...

  4. java关键字有什么用_JAVA中关键字有什么用

    展开全部 Java关键e68a84e8a2ad3231313335323631343130323136353331333363356566字及其作用 一. 关键字总览: 访问控制 private pr ...

  5. java父类声明子类实现_java中父类声明子类实例化

    问题: 1.比如两个类父类:Person 子类 Student extends Person在使用时候,这样写:Person person=null; //声明对象person=new Student ...

  6. java中组件与容器_java中的容器组件和非容器组件

    1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...

  7. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

  8. java 基本类型的引用_Java中的基本数据类型与引用数据类型

    一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...

  9. java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。

    方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...

最新文章

  1. 跨域?拒绝说概念(内含demo)
  2. ABAP TBL隐藏列
  3. 策略(strategy)模式
  4. tmux多窗口工具基本操作
  5. 依赖Zookeeper生成全局唯一序列号
  6. 计算机工程与应用查重吗,计算机工程期刊录用率_计算机工程与应用期刊_计算机八大核心期刊...
  7. 'tensorflow' has no attribute 'sub'
  8. php商城系统源码的好处有哪些?
  9. 武汉离互联网第一梯队还有多远?
  10. 测温传感器 温度传感器 温度传感器生产厂家 温度变送器 温度感应器 温度测量 热电偶 热电偶传感器 热电偶套管 热电偶温度传感器 热电偶温度计 热电阻传感器 热电阻温度计 电阻温度探测 精密RTD
  11. 爬虫模拟登陆的几种方法
  12. 平面设计怎么学,平面设计怎么学排版:夏雨老师
  13. [完全免费] 在线UML Class Diagram 类图工具 - 教程第1部分
  14. 背了单词再也不怕忘,多邻国的AI要逆天!
  15. Android 开发之Loading
  16. C# winform TreeView 屏蔽双击展开/折叠子节点
  17. 2007年中国优秀无线互联网站点TOP50点评
  18. 第38篇:Checkmarx代码审计/代码检测工具的使用教程(1)
  19. ButterKnife 牛油刀使用
  20. 【历史上的今天】2 月 21 日:Spotify 创始人出生;《塞尔达传说》系列诞生;游戏门户网站 GameSpy 关闭

热门文章

  1. PrimeNG01 angular集成PrimeNG
  2. Apache 简单设置虚拟主机
  3. 管理博文Hive大数据-Mysql的安装和启动---大数据之Hive工作笔记0007
  4. 软考信息系统项目管理师_项目风险管理---软考高级之信息系统项目管理师019
  5. AndroidStudio_安卓原生开发_精美自定义多选控件_多选Spinner_MultiSpinner_拿来即用---Android原生开发工作笔记144
  6. 大数据之-Hadoop3.x_MapReduce_编程规范---大数据之hadoop3.x工作笔记0086
  7. python_开发环境介绍_交互模式使用_IDE介绍和使用---python工作笔记010
  8. 鸿蒙OS应用开发_基础篇_编写第一个HarmonyOs应用_体会HarmonyOs的一次开发多端部署_以及分布式任务调度_IDE安装_了解应用组件以及应用布局---HarmonyOs开发工作笔记001
  9. 编程语言_JavaScript_面试题004
  10. VC++多线程工作笔记0007---线程间同步机制2