Java中的第三大特性-多态性
一、多态性的概念
多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物。
二、多态的使用
(1)多态一般用于方法参数或者方法返回值,特别当一个方法中功能是人和狗共有的,这时候利用多态性,将参数设为父类,就可以少写一个方法,而且对于代码来说也比较容易拓展。下面举个例子:
class Animal{
public void skill(){
System.out.println("动物拥有属于自己的技巧。。。");
}
}
class Person extends Animal{
@Override
public void skill(){
System.out.println("人拥有属于自己的技巧。。。");
}
}
class Dog extends Animal{
@Override
public void skill(){
System.out.println("狗拥有属于自己的技巧。。。");
}
}
public class Polymorphism {
public static void main(String[] args) {
Person person = new Person();
Dog dog = new Dog();
//不使用多态性
System.out.println("======不使用多态性======");
person.skill();
dog.skill();
//使用多态性
System.out.println("======使用多态性======");
animalSkill(person);
animalSkill(dog);
}
public static void animalSkill(Animal animal){
animal.skill();
}
}
运行结果:
======不使用多态性======
人拥有属于自己的技巧。。。
狗拥有属于自己的技巧。。。
======使用多态性======
人拥有属于自己的技巧。。。
狗拥有属于自己的技巧。。。
通过结果我们可以看出使用多态的优势,就是当你的子类越来越多的时候,不使用多态的话,代码拓展起来很麻烦,如果使用多态的话,只要是这个类的子类都可以调用,完成相应的功能。
(2)多态的向上转型:首先我们来说一下多态的向上转型,从上面的例子我们可以看出,animalSkill()方法的参数是Animal类,它是Person类和Dog类的父类,这个时候就相当于向上转型,向上转型是自动将Person类和Dog类转为Animal类的,向上转型在平常的日常开发中是经常使用的。
Animal animal1 = new Person();
Animal animal2 = new Dog();
(3)多态的向下转型:多态的向下转型这个操作是需要我们自己手动强转的,所以这个操作就比较危险,因为父类有好多子类,是不能随便强转为任意子类的,否则在运行时会报类转化异常的错误。
public class Polymorphism {
public static void main(String[] args) {
Animal animal = new Animal();
Person person = (Person) animal;
person.skill();
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: cn.edu.nyist.Animal cannot be cast to cn.edu.nyist.Person
造成这种现象的原因是因为父类会有很多的子类,是不能强制转换为任意子类的,所以这里推荐先将该子类向上转型为父类,然后再将该父类向下转型为该子类
public class Polymorphism {
public static void main(String[] args) {
Animal animal = new Person();
Person person = (Person) animal;
person.skill();
}
}
运行结果:
人拥有属于自己的技巧。。。
(3)instanceof关键字的使用:这个关键字主要是用来解决类转化一场这个错误的,它主要是判断一个实例是否属于对应的类或者父类的实例,属于的话返回true,不属于返回false
public class Polymorphism {
public static void main(String[] args) {
Animal animal = new Person();
if (animal instanceof Person){
System.out.println("向下转型成功");
Person person = (Person) animal;
person.skill();
}else {
System.out.println("向下转型失败");
}
}
}
运行结果:
向下转型成功
人拥有属于自己的技巧。。。
所以以后在将一个类进行向下转型的时候,首先使用instanceof关键字判断该实例是否为对应类或对应类的父类的实例,是的话,再进行向下转型,否则就不进行转型,这样程序就不会出错了。
Java中的第三大特性-多态性的更多相关文章
- java中面向对象的三大特性小结
java中面向对象的三大特性:封装.继承.多态 封装 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 1 ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)
经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...
- Java基础—面向对象的三大特性
面向对象有三大特性分别是继承.封装和多态. (1)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类 ...
- Go_15:GoLang中面向对象的三大特性
有过 JAVA 语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装.继承和多态.封装,就是指运行的数据和函数绑定在一起,JAVA 中主要是通过 super 指针来完成的:继承,就是指 cl ...
- GoLang中面向对象的三大特性
有过 JAVA 语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装.继承和多态.封装,就是指运行的数据和函数绑定在一起,JAVA 中主要是通过 super 指针来完成的:继承,就是指 cl ...
- 认识CSS中css的三大特性:层叠性、继承性以及优先级
前端之HTML.CSS(四) CSS CSS三大特性 层叠性:多种样式的叠加,一个属性通过两个选择器设置在同一个元素上,后一个样式会把前一个样式层叠(覆盖).层叠性的两种情况:第一种样式冲突时,后样式 ...
- java中的3大特性之继承
继承的特点:继承父类的属性和方法.单继承(多层继承)c++里的继承是多继承 特性 :方法的复写(重写) java中的继承和OC中一样. 比如:人可以养狗; 人---->狗 :整体和部分(拥有)关 ...
随机推荐
- OpenSpiel 随笔 05.14
------------恢复内容开始------------ 这两天年总算把自己的游戏写完了,也通过了所有的测试. 我将自己的代码上传到了我的github上, 地址是 https://github.c ...
- 最新主流 Markdown 编辑器推荐
Markdown ,2004年由 John Gruberis 设计和开发,是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,以下将介绍目前比较流行的一 ...
- Redis学习笔记(九)——集群
一.概述 Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代. Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关 ...
- C2. Pokémon Army (hard version) 解析(思維)
Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...
- 什么PO模式?
PO模式PO是Page Object的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一.核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封 ...
- STM32入门系列-创建寄存器模板
介绍如何使用 KEIL5 软件创建寄存器模板, 方便之后使用寄存器方式来操作STM32开发板上的LED,让大家创建属于自己的寄存器工程模板. 获取工程模板的基础文件 首先我们在电脑任意位置创建一个文件 ...
- Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO
背景 整理之前学习socket编程的时候复习到了多路复用,搜索了有关资料,了解到多路复用也有局限性,本着打破砂锅问到底的精神,最终找到了关于IO模型的知识点. 在<Unix网络编程>一书中 ...
- python框架Django使用xadmin管理后台数据
Django使用xadmin管理后台数据 关注公众号"轻松学编程"了解更多. 作用:xadmin比Django内置的admin更美观.更方便. 一.导入xadmin(第三方库) 方 ...
- 【Luogu】P2292 [HNOI2004]L语言 题解
前置芝士:\(Trie\)字典树 这道题,说是AC自动机,实际上一个\(Trie+\)队列轻松搞定. 首先,我们对所有单词建一棵\(Trie\). 然后,定义一个空队列\(Q\),初始时把\(-1\) ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...