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中一样. 比如:人可以养狗; 人---->狗 :整体和部分(拥有)关 ...
随机推荐
- G1摘要
G1 启动参数示例 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+PrintTenuringDistribution -XX:+UseG1 ...
- 字符串截取 slice,substr,substring 的区别
一 只传递一个参数时候 let str = '0123456'; str.slice(5); //'56' str.substr(5); // '56' str.substring(5); // '5 ...
- Easyswoole的WaitGroup和Csp组件的分析和使用
Easyswoole的WaitGroup和Csp组件的分析和使用 easyswoole可真是个好名字,只是提供了恰到好处的封装,即使是源码也保持了这样的风格.这种风格不论好坏可能都需要各位适应下,哈哈 ...
- UWP仿网易云音乐之1-TitleBar
首先,创建一个UWP的项目.我使用的是Visual Studio 2017 社区版. 如图,我们将项目命名为UWP-Music. 现在我们先标题栏的配色调整与网易云音乐一致. 我们先分析一下标题栏,默 ...
- drf 路由生成
前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...
- Github优质库分享-01算法小抄 基于LeetCode
Github 优质库分享-01 算法小抄 该库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌. 目前 sta ...
- 【Javac编译异常】javac编译提示jdk中的包找不到的问题error: package jdk.internal.org.objectweb.asm does not exist 和 error: cannot find symbol
一.复现步骤 1)编写待编译的java类 package f_asm_and_javassist; import jdk.internal.org.objectweb.asm.*; import ja ...
- Java-GUI基础(二)java.awt
1. 组件与容器 容器就是窗口和面板,而组件为按钮.文本域.标签等(待续),二者的声明.设置很相似, 因此本文只做对于容器的详解.组件与容器的区别在于组件不能做容器,而部分容器可以兼顾组件和容器的特性 ...
- APIO 2020 爆零记
Day -3 这几天集训,貌似大家都没有把APIO放在心上... Day 0 试了下机(非官方选手)... 感觉界面还是比较清新,(至少吊打BZOJ一个数量级) (话说APIO2020中国镜像为什么还 ...
- 使用netty实现im聊天
简书地址图文更清晰: https://www.jianshu.com/p/f455814f3c40 1.新建maven工程2.引入maven依赖 <dependencies> <de ...