热门标签 | 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);//游泳}}


推荐阅读
  • andr ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
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社区 版权所有