热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对于多态的简单理解

今天老师上课讲解的很好,特意记录下来便于以后复习。多态的简单理解*1.什么是多态性?*(1)同一个动作与不同的对象产生不同的行为*(2)多态指的

今天老师上课讲解的很好,特意记录下来便于以后复习。

多态的简单理解

* 1.什么是多态性?
* (1)同一个动作与不同的对象产生不同的行为
* (2)多态指的是一个对象的多种形态
*
* 2.多态的体现方式
* (1).使用继承:不同的子类重写父类方法后,体现出来的形式不一样
* (2)接口的实现
*
* 3.形成多态的必要条件
* (1)继承:存在子类和父类的关系
* (2)重写:子类重写了父类的方法
* (3).子类对象的多态性(重点):父类的引用指向子类的实例
*
* 4.程序分为两种状态,一个编译状态,一个是运行状态
* 对于多态来说,编译时看左边,你这个对象是定义的是什么类型就是什么类型,讲pet对象看做是Pet类型
* 运行时,看右边,真正执行的对象,也就是子类对象(Dog),执行的也是子类重写后的方法。
* 向上转型和向下转型可以这样理解
*
* 5.上转型和下转型
* (1)上转型:讲子类对象交给父类引用,可以自动转换
* (2)下转型:把父类转成子类 强制类型转换
*
* 6.对象的多态性
* (1).父类的引用指向子类的实例
* (2).在编译期间调用的父类的方法,真正执行的时候,执行的是子类的方法,
* 如果子类没有重写这个方法,依旧调用父类的方法
* (3).编译看左边,运行看右边

  1. 宠物类

package com.hpe.demo;//宠物类
public class Pet {private String name;//昵称protected int health=100;//健康值protected int love=0;//亲密的public int getLove() {return love;}public void setLove(int love) {this.love = love;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getHealth() {return health;}public void setHealth(int health) {this.health = health;}public Pet(String name, int health) {super();this.name = name;this.health = health;}public Pet(String name) {super();this.name = name;}public Pet() {super();}//吃食public void eat(){System.out.println("宠物吃食");}//打印宠物信息public void info(){System.out.println("名字叫:"+this.name+",我的健康值是:"+this.health+",我和主人的亲密度:"+this.love);}}

  1. 狗狗类

package com.hpe.demo;//狗类
public class Dog extends Pet {private String starin;//品种public String getStarin() {return starin;}public void setStarin(String starin) {this.starin = starin;}public Dog() {super();}public Dog(String name, String starin) {super(name);this.starin = starin;}//重写吃饭的方法public void eat(){super.health=super.health+3;//吃饱以后健康值加3System.out.println("狗狗吃饱了,健康值加3");}//重写输出的方法public void info(){super.info();//调用父类未重写前的方法System.out.println("我的品种是:"+this.starin);}public void sleep(){System.out.println("狗狗在呼呼大睡");}//接飞盘public void catchingFlyDisc(){System.out.println("狗狗正在接飞盘:");super.love=super.love+5;super.health-=10;}}

  1. 企鹅类

package com.hpe.demo;//企鹅类
public class Penguin extends Pet{private String sex;//性别public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Penguin() {super();}public Penguin(String name,String sex) {super(name);this.sex = sex;}//重写吃饭的方法public void eat(){super.health=super.health+5;System.out.println("企鹅吃饱了,健康值加5");}//重写输出的方法public void info(){super.info();System.out.println(",我的性别是:"+this.sex);}//游泳public void swimming(){System.out.println("企鹅正在游泳:");super.love=super.love+5;super.health-=10;}
}

  1. 主人类

package com.hpe.demo;//主人类
public class Master {private String hostName;//主人姓名public String getHostName() {return hostName;}public void setHostName(String hostName) {this.hostName = hostName;}//给狗狗喂食public void feed(Dog dog){dog.eat();}//给企鹅喂食public void feed(Penguin p){p.eat();}//玩游戏public void play(Pet pet){if(pet instanceof Dog){Dog dog=(Dog)pet;dog.catchingFlyDisc();dog.info();}else if(pet instanceof Penguin){Penguin p=(Penguin)pet;p.swimming();p.info();}}}

  1. 测试类

package com.hpe.demo;public class Test {public static void main(String[] args) {//创建宠物对象Pet p=new Pet("宠物");p.eat();p.info();System.out.println("========================================");//狗类对象Dog dog=new Dog("小金", "金毛");dog.eat();dog.info();System.out.println("========================================");//企鹅对象Penguin pe=new Penguin("Q妹", "雌");pe.eat();pe.info();System.out.println("========================================");//主人对象Master m=new Master();//调用喂食的方法m.feed(dog);m.feed(pe);System.out.println("=============================================");//子类对象的多态性,父类的引用指向子类的实例Pet pet=new Dog("小迪", "泰迪");pet.info();////向上转型后父类的引用可以调用狗类独有的方法吗?不可以//在编译期间,程序会把pet对象看成是父类对象,而父类方法没有sleep()方法//pet.sleep();//现在我就想通过pet去调用sleep()方法? 强制类型转换//short转成int,自动类型转换,int转成short,得强制类型换行//把父类转成子类同一个道理Dog dog1=(Dog)pet;//向下转型dog1.sleep();System.out.println("========================================");//pet前面已经转成了dog,现在相当于把dog转成企鹅.//在运行时会报错//Penguin pe1=(Penguin)pet;//pe1.swimming();//instanceof:用于判断类型是否匹配if(pet instanceof Dog){//判断父类pet是否属于子类对象Dog的实例Dog dog2=(Dog)pet;dog2.sleep();}else if(pet instanceof Penguin){Penguin pe1=(Penguin)pet;pe1.swimming();} System.out.println("================================================");Pet dog2=new Dog("小花","哈士奇");Pet pe2=new Penguin("小黑", "雄");Master m1=new Master();m1.play(dog2);//接飞盘m1.play(pe2);//游泳}}


推荐阅读
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 使用Java计算两个日期之间的月份数
    本文详细介绍了利用Java编程语言计算两个指定日期之间月份数的方法。文章通过实例代码讲解了如何使用Joda-Time库来简化日期处理过程,旨在为开发者提供一个高效且易于理解的解决方案。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
author-avatar
休息一下狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有