当前位置: 首页 > news >正文

从零开始学java (多态)

多态

  简单来说呢,多态其实具有表现多种形态能力的特征。专业点的说法是:同一个实现接口,使用不同的实例而执行不同的操作(可以理解为一个爸爸有多个儿子,儿子们做一件事时(操作一个方法),处理的结果不同)。话不多说上代码:

/**
 * 先写一个宠物类
 * @author GMZ
 *
 */
public class Pet {

    protected String name;
    protected Integer health;
    
    
    public Pet(String name, Integer health) {
        this.name = name;
        this.health = health;
    }



    public void run(){
        System.out.println(name+"----->再跑!");
    }
}
/**
 * 写一个狗类继承宠物类
 * @author GMZ
 *
 */
public class Dog extends Pet{

    public Dog(String name, Integer health) {
        super(name, health);
    }

    @Override
    public void run(){
        System.out.println(super.name+"----->子类中跑!");
    }
}
public static void main(String[] args) {
        //正常实例对象
        Dog dog1=new Dog("lily",100);
        dog1.run();//输出结果为子类的重写方法
        //向上转型
        Pet dog=new Dog("旺旺",100);
        dog.run();//输出结果为子类的重写方法
        //向下转型
        Dog dog2 = (Dog)dog; System.out.println(
"判断dog1对象是否是Pet类型--->"+(dog1 instanceof Pet));//打印为true }

  子类到父类的转换(向上转型)

  如同上图代码中向上转型一样,父类的引用指向子类的实例,实例的对象是子类的实例对象但是作为对象的引用用的确实父类。

  向上转型是自动转型,例如:每个类都是Object类的子类。这个就跟上面的一样。

  向上转型有一些规则:

  1.将一个父类的引用指向一个子类的对象,成为向上转型(upcasting),自动进行类的转换。

  2.通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。(它是通过子类调用,而不是父类自己调用)

  3.通过父类引用变量无法调用子类特有的方法。

  多态最多用的地方还是用父类的引用作为行参,然后达到代码复用的目的。

  

/**
 * 先来写一个代理类
 * @author GMZ
 *
 */
public class PetProxy {
    //写成静态的方法
    //参数是父类的引用
    public static void run(Pet pet){
        pet.run();
    }
}
然后在main方法中这样写

  打印的结果为:大牛----->子类中跑! 

  通过代码可以知道,只要是它的子类实例都可以作为参数执行这个方法,不同的实例,会通过run执行不同实例重写或没重写的方法。(父类也可以作为方法的返回值类型,同时也是一种多态在代码中的一种运用)

 

  父类到子类的转换(向下转型)

  由于向上转型中父类引用的对象,无法调用子类中特有的方法,那么我们就需要了向下转型。

  将一个指向子类的对象的父类引用赋给一个子类的引用(如代码中所示)。成为向下转型。此时必须进行强制类型转换。当这个类的不能被转换时报错为:ClassCastException。

 

  instanceof运算符

  instanceof该运算符是用来判断一个对象是否属于一个类(可以是父类,父类的父类,父类的父类的父类)或者实现了一个接口,结果为true或者false。在强制类型转换可以通过instanceof去检查对象的真实类型,再去进行类型转换,避免发生类型转换错误。

 

 

 

  

转载于:https://www.cnblogs.com/Cgosling/p/9943649.html

相关文章:

  • 传统运维团队转型应该注意哪些问题?
  • Nginx WEB服务器反向代理(一)
  • 宇宙最帅XX--Alpha阶段项目复审
  • 中奖名单已出炉!速来围观,有没有你?
  • Java反编译工具Jad详解
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ElasticSearch权威指南学习(排序)
  • HBase技术与应用实践 | HBase2.0重新定义小对象实时存取
  • d3
  • 将毫秒时间转换为yyyy-MM-dd HH:mm:ss格式
  • hiveUDF的使用
  • MySQL 数据库中间件 MyCAT 基础解析
  • Spring Boot与ActiveMQ整合
  • 2019版软件测试培训资料
  • dockerfile参数
  • [PHP内核探索]PHP中的哈希表
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • CSS实用技巧
  • es6(二):字符串的扩展
  • JavaScript创建对象的四种方式
  • Just for fun——迅速写完快速排序
  • Material Design
  • maya建模与骨骼动画快速实现人工鱼
  • Median of Two Sorted Arrays
  • Meteor的表单提交:Form
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Vue 动态创建 component
  • vuex 笔记整理
  • 从零开始的无人驾驶 1
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 使用 Docker 部署 Spring Boot项目
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 计算机视觉入门
  • #1014 : Trie树
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (02)vite环境变量配置
  • (C++)八皇后问题
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Neo4j下载安装以及初次使用
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core中的去虚
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 使用反射注册事件
  • .NET面试题(二)
  • .Net中的设计模式——Factory Method模式
  • /etc/skel 目录作用