一、简介

描述:

多态性是面向对象编程中的一个重要特性,主要是用来实现动态联编的。换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。

多态允许相同类域的不同对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,从而实现更加灵活的编程,提高系统的可扩展性。

如果对象的编译时类型和运行时类型不一致,就会造成多态。

存在条件:

类之间有继承关系。

子类重写父类方法。

父类引用指向子类对象。

注意:

多态是方法的多态,属性没有多态性。

一个对象的实际类型是确定的,但是可以指向这个对象的引用的类型,却是可以是这对象实际类型的任意父类型。

子类继承父类,调用方法,如果该方法在子类中没有重写,那么就是调用的是子类继承父类的方法,如果重写了,那么调用的就是重写之后的方法。

'protected'修饰的父类方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,所以没有多态性。

通过一个变量调用其引用的对象的一个方法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该方法,如果有则编译通过,如果没有则编译报错。而不是看这个变量所引用的对象中有没有该方法。

Java中的方法调用,是运行时动态和对象绑定的,不到运行的时候,是不知道到底哪个方法被调用的。

编写程序时,如果想调用运行时类型的方法,只能进行类型转换,不然通不过编译器的检查。但是如果两个没有关联的类进行强制转换,会报类型转换异常:ClassCastException。

示例:

public class Test {

public static void main(String[] args) {

/* 编译看左,运行看右 */

Student student = new Student();

/* 变量person是可以指向Person类型或其子类型的对象,所以可以指向Student类型对象 */

Person person = new Student();

/* 变量student能调用的方法是Student类中有的方法(包括继承过来的) */

student.say();//Student

/* 变量person能调用的方法是Person类中有的方法 */

person.say();//Student

}

}

class Person {

public void say() {

System.out.println("Person");

}

}

class Student extends Person {

public void say() {

System.out.println("Student");

}

}

二、重写、重载、多态的关系

重载是编译时多态

调用重载的方法,在编译期间就要确定调用的方法是谁,如果不能确定则编译报错 。

重写是运行时多态

调用重写的方法,在运行期间才能确定这个方法到底是哪个对象中的。

重写方法所属取决于调用方法的引用,在运行期间所指向的对象是谁,那么调用的就是该对象中的方法。

三、方法绑定

程序执行调用方法时,系统根据相关信息,能够执行内存地址中代表该方法的代码。

根据绑定方法的代码的时机不同,分为静态绑定和动态绑定。

静态绑定:

在编译期完成,可以提高代码执行速度。

动态绑定:

通过对象调用的方法,采用动态绑定机制。

这虽然让我们编程灵活,但是降低了代码的执行速度。

Java所有方法都是JVM在运行期才进行动态绑定的。

四、'instanceof'关键字

描述:

'instanceof'是Java的一个二元操作符。

'instanceof'是Java的保留关键字。

'instanceof'的作用是测试它左边的对象是否是它右边的类的实例,返回一个布尔值。

注意:

'instanceof'左边的引用的类型与右边的类之间,必须有父子关系或子父关系,否则编译会报错。

'instanceof'的布尔值结果,根据左边的引用的对象类型是否为右边的类的子类型。

示例:

public class Test {

public static void main(String[] args) {

Object object = new Student();

System.out.println(object instanceof Student);//true

System.out.println(object instanceof Person);//true

System.out.println(object instanceof Object);//true

System.out.println(object instanceof Teacher);//false

System.out.println(object instanceof String);//false

Person person = new Student();

System.out.println(person instanceof Student);//true

System.out.println(person instanceof Person);//true

System.out.println(person instanceof Object);//true

System.out.println(person instanceof Teacher);//false

Student student = new Student();

System.out.println(student instanceof Student);//true

System.out.println(student instanceof Person);//true

System.out.println(student instanceof Object);//true

}

}

class Person {

}

class Student extends Person {

}

class Teacher extends Person {

}

五、类型转换

描述:

由于多态的关系,父类引用可以指向子类对象,子类引用不能指向父类对象。当我们想要调用子类中的方法,而对象的引用类型是其父类时,就需要将该引用类型进行强制类型转换。

把子类对象直接赋给父类引用叫向上转型,向上转型不用进行强制类型转换。

把指向子类对象的父类引用赋给子类引用叫向下转型,需要进行强制类型转换。

向上转型会丢失子类特有的方法,但是子类若重写了父类的方法,重写的子类方法仍有效。

向上转型可以减少重复代码,体现了抽象编程的思想。父类引用作为形式参数,调有时用子类引用作为实际参数,就是利用了向上转型。

强制类型转换语法:

(targetType) object

示例:

public class Test {

public static void main(String[] args) {

Person person1 = new Student();

Student student1 = (Student) person1;

student1.go();//studentGo

student1.run();//studentRun

person1.run();//studentRun

Object object1 = new Student();

Person person2 = (Person) object1;

person2.run();//studentRun

/*

因为object2引用的对象类型不是Student的子类型,所以以下代码会出现运行时异常:ClassCastException

Object object2 = new Teacher();

Student student2 = (Student) object2;

*/

}

}

class Person {

public void run() {

System.out.println("personRun");

}

}

class Student extends Person {

public void run() {

System.out.println("studentRun");

}

public void go() {

System.out.println("studentGo");

}

}

class Teacher extends Person {

}

java多态的概念_Java基本概念:多态相关推荐

  1. java的继承实例_Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  2. java多态怎么学_Java学习笔记---多态

    在面向对象的程序设计中,多态是继数据抽象和继承之后的第三种基本特性: 多态通过分离做什么(基类对象)和怎么做(导出类对象),从另一角度将接口和实现分离开来.多态不但能够改善代码的组织结构和可读性,还能 ...

  3. java为什么序列化不一致_java – 为什么Jackson多态序列化在列表中不起作用?

    杰克逊正在做一些真正奇怪的事情,我找不到任何解释.我正在进行多态序列化,当一个对象独立时它可以很好地工作.但是,如果将相同的对象放入列表并对列表进行序列化,则会删除类型信息. 它丢失类型信息的事实将导 ...

  4. java多态和继承_Java 继承与多态的深入理解

    Java 继承与多态的深入理解 1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父 ...

  5. java中的分层概念_Java分层概念

    1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分?(下面所描述的service层就是biz) 首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对 ...

  6. java继承与多态性_Java继承与多态浅析

    一.继承 1.通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类.继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两     ...

  7. java中多态的例子_java中的多态案例

    多态性实际上有两种: 1.方法的多态性: 1.1方法重载:相同的方法名,会根据传入的参数的类型和个数不同执行不同的方法 1.2方法覆写:同一个方法名称,会根据子类的不同实现不同的功能 2.对象的多态性 ...

  8. java映射的概念_Java 反射 概念理解

    文章来源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/reflection 反射 反射机制指的是程序在运行时能够获取自 ...

  9. java集合概念_JAVA集合概念

    Java集合是使程序能够存储和操纵元素不固定的一组数据. 所有Java集合类都位于java.uti包中. 与Java数组不同,Java集合中不能存放基本数据类型,只能存放对象的引用.但是在JDK5.0 ...

最新文章

  1. 计算机用户账户添加,windows添加用户账户
  2. php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  3. 均方误差越大越好_超详细 | 如何写好计量经济学实证分析论文?
  4. Unity3D性能优化之Draw Call Batching
  5. CSS3学习笔记-技术提示
  6. python selenium安装
  7. 第十至十二章 算法分析--高阶数据结构
  8. PCB设计之:必知的PCB设计八大误区
  9. 由First表和Follow表得到LL1表(笔记)
  10. 九章算法系列(#2 Binary Search)-课堂笔记
  11. 网上银行等电子支付平台的WEB登陆安全性简要分析
  12. 数组类型和多维数组的本质
  13. 使用 LaTeX 语言对 MATLAB 中的图片进行标注
  14. CSDN的C币如何获取
  15. testbench的设计
  16. 如何设置微信群名称?
  17. Data truncation: Incorrect date value: '\xAC\xED\x00\x05sr\x00\x0Djava.time.Ser\x95]\x84\xBA\x1BH\
  18. 蓝桥ROS机器人之现代C++学习笔记7.4 条件变量
  19. matlab adaptfilt.rls,基于RLS算法的多麦克风降噪
  20. win10 C盘满 清理终极大法

热门文章

  1. 【分享】盘点那些有趣又实用的cmd命令~
  2. 线性代数(十五):对偶空间与矩阵的转置
  3. Mybatis分页功能 pagehelper插件
  4. MATLAB机器人工具箱【1】——建模+正逆运动学+雅克比矩阵
  5. SOS1 Ras GEF蛋白的应用和制备方法
  6. (1) 简要说明 html 的基本工作原理.,理解爬虫原理
  7. 点位拍照打卡完成任务小程序JavaScript 严格模式(use strict)
  8. Nvida driver CUDA
  9. 【JavaScript】手机验证码倒计时
  10. Eclipse 的单步调试