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 ...
随机推荐
- 解读先电2.4版 iaas-install-mysql.sh 脚本
#!/bin/bash #声明解释器路径 source /etc/xiandian/openrc.sh #生效环境变量 ping $HOST_IP -c 4 >> /dev/null 2& ...
- 如何使用Docker构建前端项目
原文链接 Docker单独部署前端项目和Node项目是非常便捷的,在这里分享一下Docker的使用,主要聊聊它的部署实践.(我是window10专业版安装Docker) Docker Docker是一 ...
- Dapr学习(2)之Rancher2.63(k8s&k3s)环境安装Dapr
前言:前面写过一篇关于dapr入门安装的文章,self-host模式,使用docker安装的本地调试环境,并进行了测试:本篇介绍k8s方式安装dapr,此文主要基于的环境是k3s,通过rancher2 ...
- MySQL深入学习-day1
书名<MySQL是怎样运行的:从根儿上理解MySQL>可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件. 在Windows安装后首先注册成服务,然后会在开 ...
- 渗透:aircrack-ng
ircrack- NG是一个完整的工具来评估Wi-Fi网络安全套件,功能包括: 监控:数据包捕获和导出数据到文本文件,以供第三方工具进一步处理. 攻击:通过数据包注入回放攻击,去认证,伪造接入点等. ...
- 146_ACCESS之HR招聘信息管理_64位
焦棚子的文章目录 点击下载附件 一.背景: 最近把之前做的一个HR招聘信息管理工具翻新了下,有需要的朋友可以自取,主要想解决的问题是多人在跟进人员招聘的时候信息的不对称,这样下来的就可以及时的看到整个 ...
- 127_Power Pivot&Power BI DAX计算订单商品在库时间(延伸订单仓储费用)
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...
- Mock 之搭建本地 MockJs
Mock 之搭建本地 MockJs 一.目的 模拟后端接口 二.发请求 1. install npm install axios 2. 配置 src/utils/request.js import a ...
- python常用标准库(os系统模块、shutil文件操作模块)
常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...
- 【Java并发编程】Synchronized关键字实现原理
想必在面试中经常会被问到Synchronized关键字,它有什么特性,原理什么 它的主要特性是同步锁.非公平锁.阻塞锁.可以保证线程安全(可见性.原子性.有序性) JDK1.6之后对Synchroni ...