欢迎来到南方有乔木的博客!!!


博主主页:点击点击!戳一戳!!

博主名:南方有乔木呀

博主简介:

一名在校大学生,正在努力学习Java语言编程。穷且意坚,不坠青云之志,希望能在编程的世界里找到属于自己的光。

希望帅气or美丽的朋友们能够帮我点赞! 请对文中内容请多多指教!!!

目录

一.什么是多态

二.什么是重写

三.重写与重载的区别

四.多态的优点与缺点

五.向上转型和向下转型


一.什么是多态

概念:

对象去完成某个具体的行为,不同的对象去完成时会产生不同的形状。通过基类的引用来调用重写后的方法,基类的引用可以引用不同子类的对象。

示例:

1.完成打印机打印的行为时,黑白打印机可以打印出黑白的黑白印,彩色打印机可以打印出彩色效果的彩印。

2.再比如,对于吃饭这件事,不同的动物去做会产生不同的效果,狗去晚饭,吃的是骨头,猫去吃饭,吃的是鱼。

总结:不同对象完成打印行为,产生不同的效果与状态,这就是多态。

代码示例:

package demo;
//动物父类
class Animal {protected String name;protected int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println("吃饭!");}public void sleep(){System.out.println("睡觉!");}
}
//狗子类继承动物类
class Dog extends Animal{public Dog(String name,int age){super(name,age);}public void eat(){System.out.println("吃骨头啦!");}public void sleep(){System.out.println("睡觉呼呼呼!");}
}
//猫子类继承动物类class Cat extends Animal{public Cat(String name,int age){super(name,age);}public void eat(){System.out.println("吃鱼!");}public void sleep(){System.out.println("睡觉ZZZ~~~!");}
}
//多态实现
public class Test {public static void eat(Animal a) {a.eat();}public static void main(String[] args) {Dog dog=new Dog("大胖",3);Cat cat=new Cat("阿毛",2);//同一个方法,不同对象产生不同形态的行为eat(dog);eat(cat);}
}

多态的实现需要三大条件:

  1. 必须要在继承体系下
  2. 子类必须要对父类方法中进行重写
  3. 有父类引用调用重写的子类对象方法

在完成以上的三大条件以后,多态可以就可以得到实现,就像以上的代码示例,当传入狗类对象时,调用eat()方法,会显示出不同的行为,狗的吃的行为是吃骨头,猫的行为是吃鱼。

多态的体现总结:

当代码运行时,当传递不同的对象时,会调用对应类中的方法。多态体现一定是在运行阶段,而不是在编译阶段,编译检测的是语法问题,主要是检测是否违反语法,比如,所调用的方法该类是否存在,存在,则编译成功,不存在,或者参数传递错误,编译报错。

二.什么是重写

多态的三大条件之一之中有子类必须对父类中的方法进行重写,这一条件,下面再跟随博主来总结一下,什么是重写吧。

重写概念:

重写是子类对父类方法的重写。(重写也是在继承体系下进行的)。

且重写的方法不能是static修饰,private修饰,final修饰,此外,构造方法也不能重写。

@Override注解:

在重写时,我们可以使用 @Override这个注解来表示我们的重写,这个注解可以提供合法性校验,如过在重写时有操作失误没有重写成功,那么它会编译报错,给我们提示没有重写成功。

 重写示例:

//动物父类class Animal {protected String name;public void eat(){System.out.println("吃饭!");}
//狗子类继承动物类class Dog extends Animal {@Overridepublic void eat() {System.out.println("吃骨头!");}}
//猫子类继承动物类class Cat extends Animal {@Overridepublic void eat() {System.out.println("吃鱼!");}

在重写时,将父类方法的内容拷贝一份在子类中对内容进行重写即可。或者,在idea中使用快捷键Ctrl+O,选中要重写的方法。

多态重写的注意事项:

  • 子类对父类的方法进行重写时,子类的访问限定符不能比父类的的权限低。比如,父类的访问限定符是:protected,那么,子类只能是public,或者protected权限,不能比父类中的权限低。
  • 子类的方法名,参数列表必须和父类的方法名参数列表一致,返回值可以不同,但是,返回值类型如果不同,那么,返回类型必需具有继承的父子关系。

三.重写与重载的区别

 区别:

  1. 方法名称一致
  2. 方法重写参数列表一定不变,重载参数列表必须改变,因为重载的概念就是,方法名相同,参数列表不同形成重载。
  3. 重写的返回值类型一定不能修改(但是继承体系下构成父子关系的除外),方法重载返回值类型可以修改.

四.多态的优点与缺点

优点:

1.多态可以省略了一些不必要的if-else语句,使代码更加简洁,易懂,如果不使用多态,那么有不同的对象进行同一个行为时,就需要很多的分支语句if-else语句来进行选择,不利于对代码的解读与理解,因此,多态可以省略很多不必要的分支。

2.多态的可扩展性更强。如果需要增加一个新类型,那么,只需要增加一个新的类就行了。不需要做出很大的改动。

缺点:

1.多态虽然使代码更加容易理解,但是,多态会使得程序的运行效率降低,因为多态还需要传递参数,判断调用哪些对应的方法。

五.向上转型和向下转型

向上转型

概念:创建一个子类对象,将子类对象转换为父类来引用

1.比如,有一个形状类,圆形,矩形,三角形继承图形类,创建子类对象三角形/圆形/矩形之后,将它们当作图形类使用,因为三角形/圆形/矩形本身也是图形,和图形类之间是一种is-a的关系。

2.再比如,有一个动物类,狗类和猫类继承动物类,创建狗/猫对象以后将它们当作动物类使用也是可以的,因为狗和猫本身就是动物,和动物类之间也是一种is-a的关系。

所以,将子类对象当作父类对象来使用,这样使用没有什么问题,且是安全的,还可以使代码更加灵活。

向上转型的三大用途:

1.直接赋值

2.方法传参

3.方法返回

向下转型:

概念:将父类对象转换为子类来引用

向下转型用途:当子类对象向上转型为父类对象之后,就无法调用到子类特有的方法,有时候需要用到子类特有的方法,这时候就需要向下转型,将父类对象转换为子类才能调用到子类特有的方法。

向上转型与向下转型时注意:

子类转为父类时是属于自动转型的,父类转为子类要类型强制转换。

向下转型不安全,因为父类对象转为子类,子类可能有多种,父类本身的类型可能不一定与要转型的类型相同,这时候可能会导致转型失败。

示例:

如果有一个父类动物类,一个子类狗类,一个子类猫类,狗类创建一个狗对象,狗对象向上转型为动物类,狗本身是动物,可以自动转换为父类,转换过后动物类的引用指向了狗类,到此完成了向上转型。

如果要完成向下转型,那么动物类就要转换为狗类,但子类有狗类和猫类,转换时可能转换为狗类,也可能转换为猫类,因此,向下转型不安全,也可能失败,因此,设计者使用instanceof关键字来尽量提高向下转型的安全性。因此当向下转型时,可以使用instanceof关键字来判断转换类型。

向上转型和向下转型代码示例:

package demo;
//动物类
class Animal{protected String name;protected String gender;public Animal(String name, String gender) {this.name = name;this.gender = gender;}public void eat(){System.out.println("吃饭");}
}
//狗类继承动物类
class Dog extends Animal{public Dog(String name, String gender) {super(name, gender);}public void eat(){System.out.println("吃饭啦啦啦");}
}
//猫类继承动物类
class Cat extends Animal{public Cat(String name, String gender) {super(name, gender);}public void eat(){System.out.println("吃饭呼呼呼");}
}
public class Test {public static void main(String[] args) {Dog dog=new Dog("大胖","公");Cat cat=new Cat("阿猫","公");//向上转型Animal animal=cat;animal.eat();//再向下转型if(animal instanceof Dog){ //若实例化是狗则转化为狗dog=(Dog)animal;}if(animal instanceof Cat){ //若实例化是猫则转化为猫cat=(Cat)animal;}}}

【Java SE】Java中的多态相关推荐

  1. java中的jpa_JPA教程–在Java SE环境中设置JPA

    java中的jpa JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate之类的 ...

  2. JPA教程–在Java SE环境中设置JPA

    JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate的 ORM工具的东西,除了 ...

  3. Java SE 6 中实现 Cookie 功能

    来源:http://www.study-code.com/java/j2se/66422.htm 头一段时间,为了在 Java 中实现 Cookie 的功能,看了若干规范文档,写了大量的代码,才勉强将 ...

  4. 第1章 Java基本概念及环境配置——FAQ1.05 Java SE. Java EE和Java ME有什么区别?

    FAQ1.05 Java SE. Java EE和Java ME有什么区别? 答: 1.什么是Java SE? J2SE,便准版的Java平台是一个Java2的平台,为用户提供一个程序开发环境.这个开 ...

  5. Java SE java基础 求营业额

    Java SE java基础 求营业额 要求如下: 假如小明今年第1季度的三个月中的营业额分别是{5,10,15},第二季度他计划要把第1季度中每个月的营业额都提升为2倍, 请你帮小明同学计算出他第二 ...

  6. Java SE,Java EE

    企业版(Java EE) Java EE是一种利用Java2平台来简化企业解决方案的开发.部署和管理相关的复杂问题的体系结构.J2EE技术的基础就是核心Java平台或Java2平台的标准版,Java ...

  7. Java SE Java EE Java ME

    Java SE=Java Standard Edition Java EE=Java Enterprise Edition Java ME=Java Mobile Edition SE主要用于桌面程序 ...

  8. Java SE Eclipse中引入第三方jar及class

    使用eclipse开发Java SE 总免不了需要引入第三方的jar或者calss文件.这里给大家说一下如何在eclipse中引入第三方jar或者calss文件. 让我们先了解一下eclipse项目中 ...

  9. oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)

    发布日期:2011-10-20 更新日期:2011-10-20 受影响系统: Oracle Sun JRE 1.6.x Oracle Sun JDK 1.6.x 不受影响系统: Oracle Sun ...

  10. Java SE, Java EE, Java ME都是什么?有什么区别?

    这是Java平台的三个版本 分别针对不同的市场进行开发. Java SE: standard edition 它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.Java ...

最新文章

  1. 【转】c#委托与事件
  2. linux 源码 目录,Linux系统主要目录及kernel源代码目录
  3. 阿里达摩院发布2019十大科技趋势!AI专用芯片将挑战GPU的绝对统治地位
  4. android gpu linux,Arm发布针对Mali GPU的Android Linux Vulkan用户空间驱动(HiKey 960,Firefly-RK3288主板)...
  5. Android 系统(67)---android apk 的root 权限和USB adb 权限的区别
  6. java便签小程序原码_localStorage实现便签小程序
  7. 向前、向后、横着走,双足机器人Cassie,靠深度强化学习学会了走路丨论文
  8. spring06Aop
  9. 【浅说】堆(heap)和栈(stack)区别
  10. tsp遗传算法 c语言,遗传算法解决TSP问题
  11. plsql存过声明游标_PLSQL游标使用
  12. JDY-10M蓝牙简易组网教程
  13. win8计算机无法安装打印机驱动程序,Win8电脑打印机驱动安装失败怎么办
  14. Unity 手机VR GoogleVR 详细配置教程
  15. python 作物识别_20行Python代码开发植物识别 app
  16. windows获取公网IP,记录公网ip脚本和命令
  17. 高校实验室预约系统功能简介及解决方案
  18. 海龙科技荣获2011年IP-Guard企业信息安全监管系统深圳地区最高白金代理商
  19. 本地文件复制到远程桌面无法粘贴
  20. 数字化转型是新瓶装旧酒吗?

热门文章

  1. PC企业微信HOOK接口开源
  2. 【学习记录】Three.js
  3. Windows Server 服务器 System 占用80端口的解决办法
  4. 深度神经网络预测模型,人工神经网络回归分析
  5. HANA Excel 连接HANA DB
  6. linux查看服务器连接数
  7. 32位win10如何装64位win10?
  8. serv-U cuteftp FTP中文件名乱码问题
  9. linux 3.15.2 触摸屏移植之selected device is not a touchscreen I understand
  10. Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional