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

向上转型

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

实现条件

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

实现方式

  • 方式一:重写

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

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

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. golang实现kafka的消息推送

    Kafka的安装与启动 kafka中涉及的名词 消息记录:由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中,记录在生产中称为生产者记录,在消费者中称为消费记录.Kafka集群 ...

  2. Linux笔记-Makefile伪指令解析

    本文是我在博客里面找到的,觉得对makefile的伪指令介绍得非常详细了!也提到了伪指令为何要用.PHONY:来声明!希望我的这篇转过来的文章能够帮助大家理解makefile的伪指令! 我的理解: 拿 ...

  3. echo(),print(),print_r()之间的区别?

    echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)  print只能打印出简单类型变量的值(如int,string)  print_r可以打印出复 ...

  4. ViewPager(视图滑动切换工具)

    <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Cons ...

  5. Python Qt的窗体开发的基本操作

    本文章采用的是Qt4,是python(x,y) 套件中集成的,为啥不集成Qt5呢,懒得装啊:) 正文: 首先看成品: 这个程序的功能是输入原价和降价的百分比,计算出最后的价格. 设计器部分 然后就是开 ...

  6. Docker学习之基本概念

    Docker学习之基本概念 作为一个后端noder,不了解docker有点说不过去,这节开始,学习一些docker层面的东西. 什么是docker Docker最初是dotCloud公司创始人Solo ...

  7. 记一次吐血的暴力模拟qaq 【多项式输出】

    题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 1. 多项式中 ...

  8. CF235C Cyclical Quest

    题意 给定一个长度为\(n\)的母串 \(q\)组询问 这个串可以旋转(就是把最后一位丢到最前面这样子) 问这个串以及其旋转的串在给定的串中出现了多少次 Sol 旋转就把它复制一遍接在后面 然后就在\ ...

  9. apply的妙用

    有一个很常见的问题"call和apply的区别是什么?",大家都知道答案:它们的区别仅在于接受参数的方式不同,传递给call的第二个参数必须逐个列举出来,而传递给apply的第二个 ...

  10. Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指。

    Docker简介 Docker是开源应用容器引擎,轻量级容器技术. 基于Go语言,并遵循Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...