Java-类与对象-多态
Java类与对象-多态
多态:类与对象三大特征之一
什么是多态?
同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的形式
1、父类类型 对象名称 = new 子类构造器();
2、接口 对象名称 = new 实现类构造器();
以下为例:
/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
并有独有方法 watchDoor()
Cat为继承Animal的另一个子类 重写了shout()
并有独有方法 catWalk()
**/
Animal a = new Dog(); // 这里a就是一个形式的多态
多态成员的访问特点
方法调用:编译时看父类是否有该方法,运行时访问子类中的此方法。
编译看‘左边‘,运行看’右边‘。
变量调用:编译时看父类是否有该变量,运行时也访问父类中的此变量。
编译看‘左边‘,运行也看’左边‘。
==> 多态侧重行为的多态(变量(属性)没有多态)。
多态的优势
1、便于代码的扩展和维护。
2、定义方法(函数)时,使用父类型作为参数,该方法就可以接收这个父类的一切子类对象,使操作更加便捷。
以下为例:
/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
* Cat为继承Animal的另一个子类 重写了shout()
**/
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
compete(d);
compete(c);
}
public static void compete(Animal a) { // 传参时形参可以是父类
a.shout();
}
多态存在的问题
多态不能使用子类的独有功能。
在多态下想要使用子类的独有方法怎么办呢?
这就引入了多态中的类型转换,将父类型强制类型转换成子类后,即可实现该目的。
多态中的类型转换
1、自动类型转换 (子类到父类)
2、强制类型转换 (父类到子类) ==> 解决了多态中存在的问题,强转后可以调用子类的独有功能
子类名称 子类对象名 = (子类名称) 多态对象;
这种操作可能由于编写者的疏忽并且编译器编译不会提示错误,若将一个非本子类的多态对象赋给该子类,运行时便会报错。
为了解决这一问题,通常在强制转换之前先用instanceof判断是否正确。
以下为例:
/*
* 此例中
* Animal为抽象父类 有一个抽象方法shout()
* Dog为继承Animal的一个子类 重写了shout()
并有独有方法 watchDoor()
Cat为继承Animal的另一个子类 重写了shout()
并有独有方法 catWalk()
**/
Animal d = new Dog(); // 构建多态对象d
Animal c = new Cat(); // 构建多态对象c
Cat c2 = (Cat) c; // 将c有Animal类强制转换成Cat类,使其可以调用Cat的独有方法
c.catwalk(); // 错,多态不能使用子类的独有功能。
c2.catwalk(); // 对。
if (c instanceof Cat) { // 为避免错误最好先判断其正确性
Cat c2 = (Cat) c;
c2.catwalk();
}
以上就是java中类与对象的一个特征,多态。
Java-类与对象-多态的更多相关文章
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- java类和对象之间的差
java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...
- 危险代码:如何使用Unsafe操作内存中的Java类和对象
危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- java类和对象
类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...
- JAVA类与对象(九)------多态
多态是同一个行为具有多个不同表现形式或形态的能力.多态性是对象多种表现形式的体现. 多态存在的三个必要条件: 继承 重写 父类引用指向子类对象 例:Parent p = new Child(); 当使 ...
- Java——类和对象
前言 Java语言是一种面向对象的语言.面向对象的思想是在七十年代的时候由IBM的SmallTalk语言最先推广.那什么是面向对象呢?面向对象指的是一种开发模式.早期的计算机编程使用的是面向过程的 ...
- JAVA类和对象创建
面向对象 学习目标: 理解面向对象的编程思想 理解类与对象的关系 如何创建类与对象 方法重载 一:什么是面向对象编程(OOP) 面向对象编程(Object Oriented Programming,O ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- JAVA类和对象课后作业
1.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?" 代码: //显示类 //YiMingLai 2 ...
随机推荐
- 10 分钟看懂 Docker 和 K8S!
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC, ...
- 馒头的1day漏洞巡舰系统
馒头的1day漏洞巡舰系统 1day漏洞巡舰系统的目的 1day漏洞巡舰系统的可行性 1day漏洞巡舰系统所用技术 1day漏洞巡舰系统思维导图 1day漏洞巡舰系统初步设计图 1day漏洞巡舰系统初 ...
- 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)
leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...
- 安装Zookeeper到Linux
系统版本:Ubuntu 16.04.5 LTS 软件版本:apache-zookeeper-3.5.8 硬件要求:无 1.安装依赖 Zookeeper需要JDK的支持. 注:需要先去JDK官网下载安装 ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- Spring IOC源码研究笔记(2)——ApplicationContext系列
1. Spring IOC源码研究笔记(2)--ApplicationContext系列 1.1. 继承关系 非web环境下,一般来说常用的就两类ApplicationContext: 配置形式为XM ...
- 『忘了再学』Shell基础 — 26、cut列提取命令
目录 1.cut命令说明 2.cut命令练习 (1)cut命令基本用法 (2)cut命令选取多列 (3)按字符来进行提取 (4)按指定分隔符进行截取数据 3.cut命令分隔符说明 1.cut命令说明 ...
- CF908D New Year and Arbitrary Arrangement 题解
\(0.\) 前言 有一天 \(Au\) 爷讲期望都见到了此题,通过写题解来加深理解. \(1.\) 题意 将初始为空的序列的末尾给定概率添加 \(a\) 或 \(b\),当至少有 \(k\) 对 \ ...
- Puppeteer学习笔记 (1)- 什么是Puppeteer
本文链接:https://www.cnblogs.com/hchengmx/p/11006263.html 1. phantomjs介绍 在介绍puppeteer之前必须介绍一下phantomjs,p ...
- 如何在Vue项目中,通过点击DOM自动定位VScode中的代码行?
作者:vivo 互联网大前端团队- Youchen 一.背景 现在大型的 Vue项目基本上都是多人协作开发,并且随着版本的迭代,Vue 项目中的组件数也会越来越多,如果此时让你负责不熟悉的页面功能开发 ...