java基础--向上转型

2023-11-14

为什么要用向上转型?因为为了让方法复用,只写一个以父类为形参的方法即可,不然形参为子类的话,每个子类都要单独写一个方法,那该多麻烦啊(只不过向上转型会丢失子类的特有方法)

向下转型是强转,可使用instance判断,用来调用子类的特有方法。

class Animal {
    public void move() {
        System.out.println("动物可以移动");
    }
}

class Dog extends Animal {
    @Override
    public void move() {
        System.out.println("狗可以跑和走");
    }
    public void bark() {
        System.out.println("狗可以吠叫");
    }
}

class TestDog {
//  形参类型只写一种Animal即可,如果没有向上转型,要写Dog,Fish,Cat等多种形参,那就累死了。
    public static void doEat(Animal h) {
        h.move();
    }
    public static void main(String args[]) {
        Animal a = new Animal(); // Animal 对象
// 下一行就是向上转型,需要Animal,给个Dog,也行吧,但是不能执行Dog类的特有方法了。
        Animal b = new Dog(); 
// 下一行需要Dog,给它Animal,肯定不行,编译出错!
//        Dog d =new Animal();  
        Dog c = new Dog();
        a.move();// 执行 Animal 类的方法
        b.move();//执行 Dog 类的方法
//        b.bark()  该方法使用失败
        c.bark();
//下两行体现了向上转型的精髓,假如没有向上转型,面对不同的实参,形参要写很多种,那样该方法要写多少个呀!!!!
        doEat(new Dog()); //狗可以跑和走
        doEat(new Animal()); //动物可以移动
    }
}

但是向上转型丢失了子类特有的方法,这个就需要向下转型来弥补了。

向下转型参考文献:8.JAVA-向上转型、向下转型 - 诺谦 - 博客园

-----------------------------------------------------------------------------------------------------------------------------

以下为入门知识,可不看。

package cn.com;
class BaseClass{
    public int book = 6;
    public void base(){
        System.out.println("父类的普通方法");
    }
    public void test(){
        System.out.println("父类被覆盖的方法");
    }
}

public class SubClass extends BaseClass {
    public String book = "java基础书";
    public void test(){
        System.out.println("子类覆盖父类的方法");
    }
    public void sub(){
        System.out.println("子类的普通方法");
    }

    public static void main(String[] args) {
        BaseClass abc = new SubClass();
        System.out.println(abc.book);
        abc.test();
        abc.base();
//      执行下面这一句会报错
//      abc.sub();
    }
}

输出结果:

6
子类覆盖父类的方法
父类的普通方法

得到结论。向上转型,是子类继承父类,并创建对象的过程。语法为“父类 对象名 = new 子类构造器”,如  父 对象 = new 子类();

子类继承后,只能调用父类中已有的方法,不能调用子类独特的方法。如果子类中已重写,则调用重写的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础--向上转型 的相关文章

  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • AbstractCollection 的 toArray 方法的实现中的代码有什么用

    public Object toArray Estimate size of array be prepared to see more or fewer elements Object r new Object size Iterator
  • 无法让远程 EJB 与 Wildfly 上的 EJB 客户端 API 配合使用

    我目前正在努力让远程 EJB 调用在 wildfly 8 x 和 9 x 上工作 详细来说 它是关于使用 EJB 客户端 API 方法从独立客户端应用程序 而不是从另一个应用程序服务器 进行远程调用 远程命名方法适用于我 但不适用于我的场景
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 如何在JUnit测试中将MockWebServer端口设置为WebClient?

    我在用着spring boot with WebClient 它被自动装配为一个 bean 问题 写一个junit集成测试 我必须使用okhttpMockWebServer 该模拟始终在随机端口上启动 例如localhost 14321 N
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • 将位于 jar 中的文件读取为 java.io.File 对象

    与此类似的问题已发布 但似乎没有一个答案对我的情况有帮助 我正在编写一个程序包 它使用 Google 的凭据来获取 Google Apps 用户 为此 我使用服务帐户 因此为了检索凭据 我需要提供 除其他外 一个 p12 签名文件 Cred
  • 如何使用java避免Mysql数据库中的“数据因列被截断”?

    在我的 Java 程序中 Hibernate Bean 类定义一列 例如 TimtableVO java Column name REPEAT DAYS private WeekdayType repeatDays hear Weekday
  • Tomcat JDBC 池中没有足够的空闲连接

    给定以下 Tomcat JDBC 连接设置
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • 使用 eclipse 配置mockito 时出现问题。给出错误:java.lang.verifyError

    当我将我的mockito库添加到类路径中 并使用一个简单的mockito示例进行测试时 我尝试使用模拟对象为函数add返回错误的值 我得到java lang verifyerror 以下是用于测试的代码 后面是 logcat Test pu
  • Ubuntu 的打包 - Web 应用程序

    Web 应用程序没有与 C 或类似文件不同的 make 文件 但是 它需要放置在特定的目录中 例如 var www 我是 Linux 打包新手 所以我的问题是 如何将我的应用程序打包到 deb 中 以便在安装时将其放入 etc myprog
  • 将 @RequestLine 与 Feign 一起使用

    我有一个工作 Feign 接口定义为 FeignClient content link service public interface ContentLinkServiceClient RequestMapping method Requ
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • Java 8 Stream - 为什么过滤器方法不执行? [复制]

    这个问题在这里已经有答案了 我正在学习使用java流进行过滤 但是过滤后的流没有打印任何内容 我认为过滤器方法没有被执行 我的过滤代码如下 Stream of d2 a2 b1 b3 c filter s gt s startsWith b
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • 在测试期间调用预定方法[重复]

    这个问题在这里已经有答案了 我正在使用 Maven 开发 SpringBoot 应用程序 我有一个班级 Component有方法的注释m与 Scheduled initialDelay 1000 fixedDelay 5000 注解 这里f
  • Java applet 是否会违反同源策略

    我需要请求一些东西并从其他域获取信息 我知道由于同源政策 javascript 无法做到这一点 我的另一个选择是通过我的服务器发出代理请求 我不希望请求来自我的服务器的 IP 也不想为我的服务器创建额外的负载 并且希望客户端这样做 是否可以
  • 错误:运算符不存在:整数 = 字符变化,使用 Postgres 8.2

    我有一个用旧版本的 Eclipse Ganymede 如果我没记错的话 开发的 Java EE Web 应用程序 我最近迁移到 Kubuntu 12 04 LTS 并将应用程序迁移到 Eclipse Kepler 我从 Eclipse 网站

随机推荐

  • 设置openEuler(欧拉系统)安装源

    在安装openEuler时 完整的 ISO映像 使用的是ISO的源一般不用设置安装源 安装netinst版需要连网下载文件 所以需要设置安装源 下面将按照提示一步步配置 先设置网络连网 然后点完成 选择硬盘 默认自动分区 添加安装源 官方列
  • 使用MicroPython制作红绿灯模拟器

    我们将使用行人步行按钮实现交通信号灯 该项目与LED配合使用 这使我们能够在代码执行时看到其状态 对于交通信号灯 也称为刹车灯 我们将使用红色 黄色和绿色的LED来匹配交通信号灯上的相同颜色的灯 我们还将使用红色和黄色的LED来表示 请勿行
  • vue+openlayers实现地图打点

    前言 openlayers的使用 一 使用步骤 1 引入库 代码如下 示例 npm install ol import ol ol css 样式 import Map from ol Map 地图对象 import Feature from
  • sed:当替换内容存在变量

    sed命令使用变量三种方式 1 使用单引号 变量处使用单引号 双引号把变量包括起来 sed i s eco ori g block vf 2 使用双引号 变量直接引用即可 sed i s eco ori g block vf 3 使用单引号
  • Nacos使用教程

    Spring Cloud是一个基于Spring Boot的微服务框架 它提供了一系列的组件和工具 可以帮助开发人员快速构建和部署分布式应用程序 其中 Nacos是一个新兴的服务发现和配置管理组件 可以帮助开发人员轻松地管理微服务的注册 发现
  • dbeaver问题:Public Key Retrieval is not allowed

    1 问题描述 连接数据库时出现错误 Public Key Retrieval is not allowed 2 解决方案 编辑连接信息 设置驱动属性为true 刷新一下
  • 1流明等于多少lux_说说投影仪ANSI亮度和流明的区别

    作为一个投影行业从业者 对于现在市面上的LED光源小微投动不动多少多少ANSI亮度 多少多少光源亮度 实在是看不下去了 不忍看到大家再被一些无良厂商忽悠 先说说现在市面上大家在标的ANSI亮度 ANSI是一个9点测量方法 即投出画面 画面大
  • 实现内网https 内网部署https SpringBoot

    最近项目中要在内网中部署https网址 之前对https完全不了解 一脸懵逼 好在在一顿疯狂必应之后 成功完成了部署 首先需要明确的是 由于是在内网部署 所以完全不需要搞得那么复杂 宝塔啊 申请域名啊什么的 零 前置条件 在本地安装好jdk
  • go 进阶 三方库之 jwt-go

    目录 一 JWT 基础解释 二 JWT Token 组成 三 jwt go 使用示例 一 JWT 基础解释 先了解几个问题 JSON数据使用base64url编码 只对JSON数据是先扁平化处理再用64个可读无冲突字符来表达 没有加密效果
  • 多线程是可以同时读取同一个内存数据的

    记录一下 多线程如果只是读取同一块内存区域的数据 没必要设置成同步线程 线程同步的目的是为了防止同一时间多个线程要修改数据 造成数据错误 所以 如果线程只是访问 完全没必要线程同步
  • C语言 从键盘上依次输入20个数据,输出最大值和最小值,并统计正数和负数的个数。

    C语言 从键盘上依次输入20个数据 输出最大值和最小值 并统计正数和负数的个数 代码 include
  • nvm的介绍和常用命令

    一 介绍 nvm Node Version Manager 是一个用于管理多个Node js版本的工具 它允许你在同一台机器上安装和切换不同的Node js版本 以下是nvm的一些详细介绍 安装和配置 你可以从nvm的GitHub仓库中下载
  • 数据分析和可视化平台:Splunk Enterprise for mac v9.1.1激活版 兼容m1

    Splunk Enterprise 是一个数据分析和可视化平台 可帮助企业理解其数据 虽然没有适用于 Mac OS 的 Splunk Enterprise 官方版本 但他们确实为 Mac OS 提供了一个名为 Splunk Light 的应
  • 刷题之二分查找

    题目 给定一个 n 个元素有序的 升序 整型数组 nums 和一个目标值 target 写一个函数搜索 nums 中的 target 如果目标值存在返回下标 否则返回 1 来源 力扣 LeetCode 链接 https leetcode c
  • 2019超分辨综述

    论文地址 Deep Learning for Image Super resolution A Survey 摘要 图像超分辨率 SR 是一类重要的图像处理技术 旨在提高计算机视觉中图像和视频的分辨率 近年来 目睹了使用深度学习技术的图像超
  • 数据库中的blob是什么类型?

    BLOB binary large object 二进制大对象 是一个可以存储二进制文件的容器 在计算机中 BLOB常常是数据库中用来存储二进制文件的字段类型 BLOB是一个大文件 典型的BLOB是一张图片或一个声音文件 由于它们的尺寸 必
  • vulnstack-ATT&CK实战系列 红队实战(一)

    vulnstack ATT CK实战系列 红队实战 一 前言 在此次攻击过程中 需要用到cobalt strike内网渗透工具 而此软件的破解版在国内还是很难找到的 这里有一个扩展阅读 此次事件互联网上简称为contiLeaks 其中就有C
  • python学习练习题

    文章目录 前言 python简单题目学习 python简单题目学习 1 最小公倍数和最大公约数 2 水仙花数 100 1000 3 百钱百鸡问题 4 猜数字游戏 5 三局两胜猜拳游戏 6 CPAPS赌博游戏 总结 前言 光看知识点不练习终究
  • 全球及中国家政服务产业前景建议与运营盈利分析报告2022版

    全球及中国家政服务产业前景建议与运营盈利分析报告2022版 修订日期 2022年2月 出版单位 鸿晟信合研究院 对接人员 周文文 内容分析有删减 了解详情可查看咨询鸿晟信合研究院专员 目录 第一章 家政服务行业基本概述 第二章 国际家政服务
  • java基础--向上转型

    为什么要用向上转型 因为为了让方法复用 只写一个以父类为形参的方法即可 不然形参为子类的话 每个子类都要单独写一个方法 那该多麻烦啊 只不过向上转型会丢失子类的特有方法 向下转型是强转 可使用instance判断 用来调用子类的特有方法 c