一、多态性的概念

  多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物。

二、多态的使用

  (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中的第三大特性-多态性的更多相关文章

  1. java中面向对象的三大特性小结

    java中面向对象的三大特性:封装.继承.多态 封装 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 1 ...

  2. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  3. JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)

    经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...

  4. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  5. Java基础—面向对象的三大特性

    面向对象有三大特性分别是继承.封装和多态. (1)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类 ...

  6. Go_15:GoLang中面向对象的三大特性

    有过 JAVA 语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装.继承和多态.封装,就是指运行的数据和函数绑定在一起,JAVA 中主要是通过 super 指针来完成的:继承,就是指 cl ...

  7. GoLang中面向对象的三大特性

    有过 JAVA 语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装.继承和多态.封装,就是指运行的数据和函数绑定在一起,JAVA 中主要是通过 super 指针来完成的:继承,就是指 cl ...

  8. 认识CSS中css的三大特性:层叠性、继承性以及优先级

    前端之HTML.CSS(四) CSS CSS三大特性 层叠性:多种样式的叠加,一个属性通过两个选择器设置在同一个元素上,后一个样式会把前一个样式层叠(覆盖).层叠性的两种情况:第一种样式冲突时,后样式 ...

  9. java中的3大特性之继承

    继承的特点:继承父类的属性和方法.单继承(多层继承)c++里的继承是多继承 特性 :方法的复写(重写) java中的继承和OC中一样. 比如:人可以养狗; 人---->狗 :整体和部分(拥有)关 ...

随机推荐

  1. Phoenix的一些问题

    date: 2020-09-10 13:50:00 updated: 2020-09-14 16:30:00 1. Phoenix索引 全局索引:适合读多写少的场景.写数据时因为索引表分布在不同数据节 ...

  2. MongoDB用户,角色管理 --- MongoDB基础用法(三)

    用户管理 用户创建 MongoDB采用基于角色的访问控制(RBAC)来确定用户的访问. 授予用户一个或多个角色,确定用户对MongoDB资源的访问权限和用户可以执行哪些操作. 用户应该只有最小权限集才 ...

  3. C#设计模式-模板方法模式(Template Method)

    概念 模板指一些可以套用的公共内容,例如网页模板是当网站中有许多页面版式色彩相同的情况下,将其定义为网页模板,并定义其中部分可编辑,部分不可编辑,那么在利用网页模板制作其他页面时就会很方便,不易出错. ...

  4. 第 1 篇:Vue.js 很高兴认识你

    作者:HelloGitHub--追梦人物 Hello Vue 既然是学习编程,那就遵循一下那个古老的传统仪式. 首先我们新建一个 todos.html 文件,用任何一个你喜欢的文本编辑器或者 IDE ...

  5. U137971 公司搬迁 - 并查集 奇偶性

    题目描述 因为人员规模扩大,T公司准备搬到新的写字楼去,写字楼分为A座和B座,n名不同工号的员工x(p1,p2,p3...pn) 按照下面两个规则确定在A座或者B座进行办公:(1)如果工号为x的员工在 ...

  6. linux修改进程名

    一.linux中的进程名    linux中有很多查看/操作进程的命令.    这些命令的参数或显示的结果,有的是真实的进程名(top/pstree/pgrep/kill/killall),有的是进程 ...

  7. 1,web项目工作流程

    1.1 了解web程序工作流程 .1.2django生命周期

  8. python socket 二进制

    问题 在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),在交测之前,自己用python写个接受数据的server,解析下拼成的数据格式是否正确.用python写 ...

  9. 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户

    1.redsi的bitmap数据结构介绍 bitmap本质上是一个string类型,只是他操作的是string的某个位是0还是1. setbit和getbit 两条命令是对字符串的位操作.每个位只能是 ...

  10. How to Convert and Import VHD to VMDK (VMWare)

    VHD or Virtual Hard Disk is the disk image format used by Microsoft virtualization software such as ...