首页 > 编程语言 >Java多态--上转型对象

Java多态--上转型对象

时间:2024-12-24 23:30:59浏览次数:5  
标签:shot name -- 子类 多态 Dog Animal Java public

Java多态

概念

多态:面向对象的三大特性之一
多态一句话概括就是,一个类下面的不同子类的实例,对同一个参数输入,得到不同的输出
举例:动物类下的小猫、小狗,两只动物分别拍一下,小猫输出“喵喵喵”,小狗输出“汪汪汪”。

实现方式

多态的方式:类的继承,方法的重载和重写
Animal.java

package oop;
public class Animal {
    // 参数:拍打次数
    public void shot(int times) {
        System.out.println("不知名动物叫声...嘤嘤嘤 × " + times);
    }
}

Dog.java

package oop;
public class Dog extends Animal{
    private String name;

    public Dog(String name) {
        this.name = name;
    }
	// 重写shot方法
    public void shot(int times) {
        System.out.println("我是狗,我叫" + this.name + ",汪汪汪 × " + times);
    }
	// 狗撕咬沙发
	public void biteSofa(){
        System.out.println(this.name+"---又咬沙发了");
    }
}

Cat.java

package oop;
public class Cat extends Animal {
    private String name;

    public Cat(String name) {
        this.name = name;
    }
    // 重写shot方法
    public void shot(int times) {
        System.out.println("我是猫,我叫" + this.name + ",喵喵喵 × " + times);
    }
}

FstJava.java

package oop;
public class FstJava {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog("旺财");
        Animal cat = new Cat("咕噜");
        animal.shot(2);
        dog.shot(3);
        // dog.biteSofa() //此处不能执行
        cat.shot(5);
    }
}

对于“拍打次数”这个参数,猫和狗的反应是不一样的
在这里插入图片描述

上转型对象

思考:上述代码中,猫狗的对象创建都是
父类 变量名 = new 具体子类()
这样创建的字类,只能执行重写父类的方法,例如“狗”类中,定义了“撕咬沙发”的方法,由于Animal类中没有这个方法,所以对象dog不能执行“撕咬沙发”
这就是上转型对象

概念:上转型对象是指将一个子类对象赋值给一个父类类型的变量,此时该变量所引用的对象就是上转型对象
(可以理解为子类赋值给父类变量,父类不能承接子类的特殊方法,所以对于子类对象来说,特殊方法暂时作废)

思考:上转型对象有何用?
理解:上转型对象也是多态的一种体现,当不确定程序到底会接受哪种子类类型,且确定会执行与父类相同的方法,就可以使用上转型对象,保证了程序的可扩展性
(越原始的东西越方便扩展)

public class FstJava {
    public static void main(String[] args) {
        // 不确定ani 是猫还是狗,所以用Animal类声明
        Animal ani = null;
        Dog d = new Dog("dog");
        Cat c = new Cat("cat");
        // 确定了ani 是 Dog
        ani = d;
        ani.shot(3);

    }
}

那要执行Dog特有的“撕咬沙发”,有两种方法
方式一:明确类对象的声明创建
Dog dog = new Dog(“旺财”)
dog.biteSofa()

方式二:把上转型对象通过强制类型转换,转换成子类对象
上转型对象是指将一个子类对象赋值给一个父类类型的变量,本质还是一个子类对象,强制类型转换可以把“暂时失去的子类方法”恢复回来
这个方式也叫“下转型”
(转上去的,再转下来就好了)

注意:向下转型前提是,已经存在经过向上转型的对象,对这个对象才能做向下转型,不存在 “子类 变量 = new 父类()”

public class FstJava {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog("旺财");
        Animal cat = new Cat("咕噜");
        animal.shot(2);
        dog.shot(3);
        cat.shot(5);

		// 强制转换,向下转型
        ((Dog)dog).biteSofa();

    }
}

标签:shot,name,--,子类,多态,Dog,Animal,Java,public
From: https://blog.csdn.net/2402_89573492/article/details/144703362

相关文章

  • 线程池前世今生及源码实现
    @目录⭐前序一、是什么(what)@功能构成二、为什么(why)三、何处(where)四、何时(when)五、谁(who)六、怎么样(how)@实践和性能调优策略@线程池源码(Code)[待补充]⭐前序本文讲什么:线程池的概念、工作原理、优势、实际应用中的使用场景和注意事项,以及一些最佳实践和性能调优策略......
  • Linux | scp指令基于WSL在Windows/Ubuntu系统间传输文件
    .背景在Windows系统里,使用WSL连接远程Linux(Ubuntu)服务器是如今一个很常见的操作流程(有利于WFH哈哈)。在使用远程机器的时候,通常需要将本地的文件上传、或将远程的文件下载。问题:如何优雅地将本地文件上传、或将远程的文件下载?.解决方案在网上搜索一番、同时问了GPT,找......
  • Java 变量和运算符
    Java变量和运算符1.变量(Variable)1.1何为变量1.2数据类型(DataTypes)1.2.1整型:byte、short、int、long1.2.2浮点类型:float、double1.2.3字符类型:char1.2.4布尔类型:boolean1.3变量的使用1.3.1步骤1:变量的声明1.3.2步骤2:变量的赋值1.4.基本数据类型变......
  • 简单记录下底部固定的样式并简单封装
    需求:需要在底部做个固定样式,添加备案等信息实现思路:1.定义文本,数组对象记录,循环遍历,有利于维护2.定义样式,固定定位+层级置顶3.抽离成组件复用js<scriptlang="ts"setup>constbottomInfoList=[{label:'关于我们',link:'user/aboutUs'},{label:'帮......
  • Python绘制图表
    Python提供了多种可视化库,常用的有matplotlib、seaborn和plotly等。这些库可以用于绘制各种类型的图表,如折线图、散点图、柱状图、饼图等。下面是一个使用matplotlib绘制折线图的示例:```pythonimportmatplotlib.pyplotasplt#准备数据x=[1,2,3,4,5]y=[2,4,6......
  • dagger.js:AI都知道了,你还不知道?
    内容同步发表于微信公众号:我是王多余天工天工告诉我,世界上最简单好用的前端框架是什么呀?大家好,我是非主流前端开发框架dagger.js的作者王多余。从本篇开始我会写一组系列文章,来聊聊dagger.js究竟是什么,该如何使用。 正文开始前先回(吐)顾(槽)一下行业发展史。从开箱即用到......
  • 4、数据结构与算法解析(C语言版)--栈
    栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。1、创建项目 main.h#ifndef_MAIN_H#define_MAIN_H#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE1#defineFALSE0......
  • 使用缓存可能会出现的一些问题
    缓存系统在分布式系统中极其重要,但由于其特性和架构设计,也会面临一些常见问题。以下是缓存系统可能出现的问题,以及对应的解决方案:一、数据库缓存不一致由于我们的缓存的数据源来自于数据库,而数据库的数据是会发生变化的,因此,如果当数据库中数据发生变化,而缓存却没有同步,......
  • 「玩转 Vulnhub:Kioptrix 5 靶机的渗透与解题思路」
    获取靶机地址:点击领取获取更多资料工具:点击领取信息收集主机发现首先我们要找到靶机的ip,先用kali扫一圈同网段存活的ip,再将靶机打开,然后接着再扫一遍sudo arp-scan -l端口扫描下一步是收集有关靶机上运行的服务的信息。sudo nmap -p- -A 192.168.17.129发......
  • 直击要害!Java反序列化
                                 免责声明本系列工具仅供安全专业人员进行已授权环境使用,此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用工具中的......