[转帖]多态、向上转型和向下转型

多态、向上转型和向下转型

https://segmentfault.com/a/1190000019700754

向下转型向上转型多态 java

阅读约 4 分钟

多态性:

是对对象来说的。extends或implements是多态性的前提。

经理类继承雇员类。小明是一个经理对象,这个对象既有经理形态,也有雇员形态。一个对象有多种形态,这就是对象的多态性。

多态性格式:父类引用指向子类对象

格式:父类名称 对象名 = new 子类名称();

或:接口名称 对象名 = new 实现类名称();

可以这样理解:子类被当做父类来看待(一个经理被当做雇员来看待,一直猫被当做动物来看待)。而对象只能引用父类特有的方法。

多态访问成员变量的两种方式:

  • 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。(编译看左边,运行还看左边)

    Fu obj = new Zi();
    System.out.println(obj.num);
  • 间接通过成员方法访问成员变量:看该方法属于谁优先用谁,没有则向上找。(先看右边子类中有没有该方法,没有则向上找)

多态访问成员方法:

访问成员方法的规则:看new的是谁,则优先用谁,没有则向上找(编译看左边,运行看右边)。

先看左边父类中有没有该方法,没有则编译不通过报错,但运行时是看右边子类方法,没有则向上找。只用于成员方法,不适用于成员变量。

向上转型和向下转型

在Java中,对象变量是多态的。

Employee e;
e = new Employee(...);
e = new Manager(...);//Manager继承Employee

这里的Employee类变量可以引用Employee类对象和任何一个Employee类的子类。

在《JAVA核心技术卷一》P152的代码中

Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;

Employee boss = new Employee(...);
Manager[] staff = new Manager[3];
staff[0] = boss;//错误!

boss是Manager类对象,staff数组是Employee类对象,所以staff可以和boss指向同一对象,且编译器将staff[0]看成Employee对象。如果是下面这段代码会报错,因为不是所有的雇员都是经理(类比double转换int可能会损失精度)。

向上转型一定是安全的,从小范围转向了大范围(从小范围的经理转向大范围的雇员,从小范围的猫转向大范围的动物,类似于从小范围的int转向大范围的double不会损失精度)。
对象的向上转型其实就是多态写法:

//格式:父类名称  对象名  =  new  子类名称();
//右边创建了一个子类对象,把它当做父类看待使用
Employee  Manager  =  new  Manager()
//创建了一个经理对象,把它当做雇员来看待

向下转型是一个【还原】的动作,但要保证对象一开始创建的时候 ,就是经理,才能由雇员向下转型为经理。(用instanceof关键字判断前面的对象是不是后面的类型)

String c = (String)staff[1];
//会产生编译错误,因为String不是Employee的子类
  • 只能在继承层次内进行类型转换
  • 将超类转换成子类(向下转型)之前,应该使用instanceof进行检查
  • 类型转换不是一种好的做法,多态的对象向下转型是为了使用子类特有的方法,这种情况下应该检查超类的设计是否合理,也许重新设计超类并添加相应方法才是正确做法。尽量少用类型转换和instanceof

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/11970077.html

时间: 2024-11-07 15:21:43

[转帖]多态、向上转型和向下转型的相关文章

重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)

多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不同的结果.这就是多态. 那么,java中是怎么体现多态呢?我们来直接看代码: public class Water { pu

多态、向上转型和向下转型

一.多态性: 是对对象来说的.extends或implements是多态性的前提. 经理类继承雇员类.小明是一个经理对象,这个对象既有经理形态,也有雇员形态.一个对象有多种形态,这就是对象的多态性. 多态性格式:父类引用指向子类对象 格式:父类名称 对象名 = new 子类名称(); 或:接口名称 对象名 = new 实现类名称(); 可以这样理解:子类被当做父类来看待(一个经理被当做雇员来看待,一直猫被当做动物来看待).而对象只能引用父类特有的方法. 二.多态访问成员变量的两种方式: 1.直接

【转】面向对象之多态(向上转型与向下转型)

转:https://blog.csdn.net/qq_31655965/article/details/54746235. 多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不

多态中的向上转型和向下转型

package ren.redface.demo; /* * 多态中的向上转型和向下转型: * * 引用类型之间的转换 * 向上转型 * 由小到大(子类型转换成父类型) * 向下转型 * 由大到小 * 基本数据类型的转换 * 自动类型转换 * 由小到大 * byte short char --- int --- long --- float --- double * 强制类型转换 * 由大到小 */ public class MethoDemo { public static void main

Java入门记(二):向上转型与向下转型

在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转型,动态绑定 例三:向上转型,静态绑定 例四:向下转型 转型的误区 1.运行信息(RTTI) 2.数组类型 3.Java容器 几个同义词 首先是几组同义词,由于在不同的书上使用的不同,是造成混淆的原因之一. 父类/超类/基类 子类/导出类/继承类/派生类 静态绑定/前期绑定 动态绑定/后期绑定/运行时绑定 向

[转]向上转型与向下转型

原文地址:http://www.cnblogs.com/wuyuegb2312/p/3858521.html 在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转型,动态绑定 例三:向上转型,静态绑定 例四:向下转型 转型的误区 1.运行信息(RTTI) 2.数组类型 3.Java容器 几个同义词 首先是几组同义词.它们出现在不同的书籍上,这是造成理解混淆的原

Java向上转型和向下转型(附具体样例)

                                            Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override publ

Java转型(向上转型和向下转型)

在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人".再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类).我们现实中也经常这样说:麻雀是鸟.这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类.这也符合Java提倡的面向抽象编程思想.来看下面的代码: package a.

Java向上转型和向下转型(附详细例子)

                                            Java向上转型和向下转型(附详细例子) 熬夜整理的关于Java向上和向下转型的例子,非常的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override pub