有两种意义的多态,一是操作名称的多态,即有多个操作具有相同的名字,但这些操作所接收的消息类型必须不同(方法重载)。另一种多态是和继承有关的多态,是指同一个操作被不同类型对象调用时可能产生不同的行为(方法重写,抽象方法,接口)。多态可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

向上转型

父类的引用可以指向子类的对象,感觉像子类自动的向上转型为父类。向上转型时,会遗忘子类对象中与父类对象中不同的方法,也会覆盖与父类中相同的方法,即重写。也就是说如果我们定义了一个指向子类对象的父类引用类型,那么它除了能够引用父类中定义的所有属性和方法外,还可以使用子类强大的功能(指被子类重写的部分)。但是对于只存在于子类的方法和属性就不能获取

实现条件

  • 继承
  • 重写
  • 向上转型 (即父类引用指向子类对象)

实现方式

  • 方式一:重写

  • 方式二:抽象类和抽象方法

    抽象方法只有声明,没有方法体,声明语法如下:

abstract void fun();

包含抽象方法的类即为抽象类,定义类时需要加上关键字 abstract。抽象方法的具体实现在抽象类的子类中完成,所以显然不能用 final 修饰抽象方法。我们不能直接创建抽象类的对象,所以抽象类必须被继承,才能被使用。通常是定义引用变量指向子类对象。

  • 方式三:接口

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法,是对类的一组需求描述。接口的思想在于它可以增加很多类都需要实现的功能,但并不关心功能的实现,使用相同接口的类不一定有继承关系。

声明语法

修饰符 interface 接口名称 [extends 其他的接口名] {
// 常量定义
// 抽象方法
}
  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • public 修饰的接口可以被任何一个类使用。如果一个接口不加 public 修饰,则称其为友好接口,可以被同一个包中的类使用。
  • 接口中的方法都自动地被设置为 public ,接口中的域被自动设置为 public static final。

相关要点

  • 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。在类中实现接口的方法时,方法的名字、返回类型、参数个数及类型必须与接口中的完全一致。特别需要注意的是:接口中的方法默认是 public abstract 方法,所以在类中实现时必须用 public 来修饰,而且接口中的常量默认是 public static 常量。

  • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

  • 接口不是类,不能构造接口的对象。但是却可以声明接口的变量,接口的变量必须引用实现了接口的类的对象。如同使用 instanceof 检查一个对象是否属于某个特定类一样,也可以使用 instanceof 检查一个对象是否实现了某个特定的接口。

  • 接口回调是指可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量。那么该接口变量就可以调用被该类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。如果一个方法的参数是接口类型,就可以将任何实现该接口的类的实例的引用传递给该参数接口,那么参数接口就可以回调类实现的接口方法。

  • 一个类只能继承一个抽象类而一个类却可以实现多个接口

    多继承实现方式

       修饰符 interface A extends 接口1,接口2{
    
       }
    
       修饰符 class B implements 接口1,接口2{
    
       }

注意点

  • 接口中所有的方法是抽象方法。
  • 接口成员是 static final 类型,可以直接用类名或接口名调用。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似,使用extends关键字。
  • 接口支持多继承,extends关键字只需要使用一次,在其后跟着继承接口。
  • 没有任何方法的接口被称为标记接口,主要用于建立一个公共的父接口或向一个类添加数据类型。

参考资料

Java 多态(接口)的更多相关文章

  1. Java 多态 接口继承等学习笔记

    Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字  super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...

  2. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

  3. Java 多态——与C++的比较

    学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...

  4. java多态实现原理

    众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...

  5. 深入理解Java多态机制

    从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...

  6. Java多态与C++中多态的实现

    大牛的文章,值得拜读http://www.ibm.com/developerworks/cn/java/j-lo-polymorph/ 粘贴过来好多图片丢失了 /(ㄒoㄒ)/~~ 众所周知,多态是面向 ...

  7. 学JAVA第十六 天,JAVA多态

    今天老师讲了多态的使用 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性  3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 我个 ...

  8. Java - 22 Java 多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  9. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  10. 转载 - java中接口的向上转型。和多态性

    发现一篇对接口总结很精简的文章 1.在java中接口就是一个完全抽象的类,跟抽象类一样不能产生对象,但是可以作为对象的引用,可以由其实现类向上转型,它就跟超类一样, 向上转型了,可以很好的利用接口,可 ...

随机推荐

  1. 原来你是这样的http2......

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由mariolu发表于云+社区专栏 序言 目前HTTP/2.0(简称h2)已经在广泛使用(截止2018年8月根据Alexa流行度排名的头 ...

  2. [转] sqlserver 中查看trigger的disabled/enabled情况

    本文转自:http://blog.csdn.net/miqi770/article/details/48708199 SELECT t.name AS TableName, tr.name AS Tr ...

  3. JAVA注释方式

    1.单行(single-line)注释    //…… 2.块(block)注释                /*……*/ 3.文档注释                      /**……*/

  4. 使用 OLEDB 及 SqlBulkCopy 将多个不在同一文件夹下的 ACCESS mdb 数据文件导入MSSQL

    注:转载请标明文章原始出处及作者信息http://www.cnblogs.com/z-huifei/p/7380388.html 前言 OLE DB 是微软的战略性的通向不同的数据源的低级应用程序接口 ...

  5. 十一、curator recipes之联锁InterProcessMultiLock

    简介 curator实现了一个类似容器的锁InterProcessMultiLock,它可以把多个锁包含起来像一个锁一样进行操作,简单来说就是对多个锁进行一组操作.当acquire的时候就获得多个锁资 ...

  6. java自学之路-开篇

    开篇 想写一些java自学文章的心思起好久了,也在心里规划了一段时间,今天终于开始正式付于纸上.接下来要写的内容从java基础开始,一步步到正式工作用到的技术,整个体系适合java初学者自学.内容可能 ...

  7. 图解源码之FutureTask篇(AQS应用)

    所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行. FutureTask是通过AQS的模板设计模式来实现阻塞get方法的. 从 ...

  8. HTTP完整请求过程

    重要申明:感谢原文作者——沐风的心,想看原文请戳这里!我借鉴了原文的页面请求流程,原文见时序图之后正文. 重要申明:感谢原文作者——一行两行,想看原文请戳这里!我借鉴了原文的完整HTTP请求流程. 增 ...

  9. BZOJ P1212 [HNOI2004] L语言

    标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的集合. 我 ...

  10. 通过vertical-align属性实现“竖向居中”显示

    自学编程大概有大半年的时间了,从15年7月开始学习使用人数最多的JAVA,到后来喜欢上了前端,但由于之间在建筑设计院的工作加班颇为频繁,每天刨去工作,基本没有多少自己个人的时间,只能每天6,7点起床, ...