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

向上转型

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

实现条件

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

实现方式

  • 方式一:重写

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

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

  1. abstract void fun();

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

  • 方式三:接口

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

声明语法

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

相关要点

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

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

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

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

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

    多继承实现方式

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

注意点

  • 接口中所有的方法是抽象方法。
  • 接口成员是 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. Eclipse项目红感叹号

    原因:显示红色感叹号是因为jar包的路径不对 解决:在项目上右击Build Path -> Configure Build Paht...(或Propertise->Java Build ...

  2. 2.3.6-加入scoreboard

    在验证平台中加入了reference model和monitor之后,最后一步是加入scoreboard.my_scoreboard的代码如下: 代码清单 2-50 文件:src/ch2/sectio ...

  3. ASP.NET MVC Core的ViewComponent

    MVC Core新增了ViewComponent的概念,直接强行理解为视图组件,用于在页面上显示可重用的内容,这部分内容包括逻辑和展示内容,而且定义为组件那么其必定是可以独立存在并且是高度可重用的. ...

  4. [转]Format a ui-grid grid column as currency

    本文转自:https://stackoverflow.com/questions/27747184/format-a-ui-grid-grid-column-as-currency-rc-3-0 Yo ...

  5. [javaSE] GUI(练习-列出指定目录内容)

    获取Frame对象 获取TextField对象 获取TextArea对象 获取Button对象 调用Frame对象的add()方法,添加进去 调用TextField对象的getText()方法,可以获 ...

  6. 九、curator recipes之不可重入锁InterProcessSemaphoreMutex

    简介 recipes的InterProcessSemaphoreMutex是一种不可重入的互斥锁,也就意味着即使是同一个线程也无法在持有锁的情况下再次获得锁,所以需要注意,不可重入的锁很容易在一些情况 ...

  7. 14、IO (字节流、字符流)

    输入和输出 * A:输入和输出 * a: 参照物 * 到底是输入还是输出,都是以Java程序为参照 * b: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...

  8. 解决Fiddler无法捕获本地HttpWebRequest(C#.net)请求和HttpURLConnection(Java)请求

    方法很简单,就是设置本地代理 C# HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Proxy = new WebPr ...

  9. Code Signal_练习题_arrayChange

    You are given an array of integers. On each move you are allowed to increase exactly one of its elem ...

  10. [POI2007]EGZ-Driving Exam

    能到达所有路的充要条件是能到达左右两端的路 用vector反向建边对每条路左右分别求个最长不上升子序列 预处理出每条路向左向右分别需要多建多少路才能到达最左端和最右端 然后跑个\(\Theta(n)\ ...