Java学习笔记006——子类与父类的类型转换

在Java中,类型转换主要涉及到两种类型:向上类型转换(Upcasting)和向下类型转换(Downcasting)。

1. 向上类型转换(Upcasting):

向上类型转换是将子类的对象转换为父类类型的对象。这种转换是自动的,也是安全的,因为子类对象包含所有父类对象的信息。所以,在将子类对象赋值给父类类型的引用时,编译器会自动完成转换,而不需要程序员进行任何特殊的操作。向上转型会让子类对象“缩小”,只能调用父类中的方法,对于子类中新增的方法则不可调用了。

package com.test2;class Animal {void makeSound() {System.out.println("这个动物在发出声音。");}
}class Dog extends Animal {void makeSound() {System.out.println("这个狗在汪汪叫。");}void makeMove() {System.out.println("这个狗在欢快地奔跑。");}
}public class UpcastingTest  {public static void main(String[] args) {Dog myDog = new Dog();myDog.makeSound();myDog.makeMove();Animal myAnimal = myDog; // 向上类型转换,安全并自动发生myAnimal.makeSound();   // }
}

在上面代码这个例子中,`Dog`是`Animal`的子类。当我们创建一个`Dog`对象并将其赋值给`Animal`类型的变量时,就发生了向上类型转换。myAnimal变量是赋值为原myDog对象变量转换后的值。则myAnimal失去了子类Dog中新增的方法makeMove()。

但是子类Dog重写了父类Animal的MakeSound()方法,Dog类实例对象myDog转换为Animal类对象赋值给myAnimal对象是失去了新增方法,但是调用的makeSound()方法依然是Dog类中重新写的方法。如果Dog类中没有重写makeSound()方法,转化前和转换后,都将是调用父类中的方法。

2. 向下类型转换(Downcasting):

在Java中,要成功进行向下转型(从父类到子类),必须满足以下两个条件:

(1)对象必须是子类的实例:
   对象实际上必须是你要转型的子类的一个实例。如果对象不是子类的实例,那么转型会失败,并抛出`ClassCastException`异常。

(2)显式类型转换:
   必须使用类型转换操作符`(子类类型)`来进行向下转型。编译器会检查转型的合法性,并且在运行时也会进行类型检查。

下面是一个成功向下转型的例子:

class Animal {void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {void bark() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {// 创建一个Dog对象Animal animal = new Dog();// 检查对象是否实际是Dog的实例if (animal instanceof Dog) {// 显式向下转型为Dog类型Dog dog = (Dog) animal;// 现在可以调用Dog类特有的方法dog.bark();} else {// 如果不是Dog的实例,则不执行转型System.out.println("Cannot cast to Dog");}}
}

在这个例子中,`animal`变量被声明为`Animal`类型,但实际上它引用了一个`Dog`对象。通过`instanceof`检查,我们确认`animal`实际上是`Dog`的一个实例,然后安全地将其转型为`Dog`类型。转型成功后,我们就可以调用`Dog`类中的方法了。

总之,成功向下转型的关键在于确保对象确实是你想要转型的子类的一个实例,并且在转型前使用`instanceof`来验证这一点。如果不确定对象是否是特定子类的实例,就应该避免进行向下转型,以防止运行时错误。

简单理解:

(1)向上转换:子类创建的实例变量赋值给一个父类类型的变量,这是合法允许的,但是会进行“向上转换”,父类类型的变量虽然被赋值了子类实例,但是会阉割掉子类中新增的方法,和父类相同的方法依然可以使用,使用的是子类中定义的方法。

(2)向下转换:这是不建议的,需要满足2个条件才可以,否则发生会失败而发出异常。两个条件是父类定义的变量是通过实例化子类赋值的(只是该变量被声明成了父类的类型),经过显式的类型转化后,重新转换为子类类型的变量,可以使用子类中定义的相关方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 227. 基本计算器 II

题目描述 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意 不允许使用任何将字符串作为数学表达式计算的内置函数&#x…

win10安全中心误删文件怎么办?解析恢复与预防策略

在使用Windows 10的过程中,许多用户依赖于其内置的安全中心来保护电脑免受恶意软件的侵害。然而,有时安全中心的误判可能导致重要文件被错误地删除。当面对这种情况时,了解如何恢复误删的文件并掌握预防措施显得尤为重要。本文将为您详细解析…

java常用技术栈,java面试带答案

前言 我们从一个问题引入今天的主题。 在日常业务开发中,我们可能经常听到 DBA 对我们说“不要”(注意:不是禁止)使用 join,那么为什么 DBA 对 join 这么抵触呢?是 join 本身有问题,还是我们使…

【weblogic 报错 application webapp does not have any Components in it.】

当你启动你的web时,报错weblogic 报错 application webapp does not have any Components in it. 检查你的startWeblogic.sh 看一下你的项目路径是否正确。

G1018选择排序

题目描述 完善程序&#xff1a; 输入N个整数&#xff0c;使用选择排序法从小到大输出。 #include<bits/stdc.h> using namespace std; int N; int a[100010]; int main() {freopen("1455.in","r",stdin);freopen("1455.out","w&quo…

私募证券基金动态-24年2月报

成交量&#xff1a;2月日均9492.60亿元 2024年2月A股两市日均成交9492.60亿元&#xff0c;环比增加30.38%、同比增加5.77%。2月整体15个交易日&#xff0c;有4个单日交易日成交金额过万亿&#xff0c;单日交易日最高成交金额为13576.43亿元&#xff08;2月28日&#xff09;&am…

MySQL 学习笔记(基础篇 Day1)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 MySQL 概述 1.1 数据库相关概念 1.2 MySQL 数据库 2 SQL 2.1 SQL 通用语法 2.2 SQL 分类 2.3 DDL 2.4 图形…

【leetcode C++】电话号码的字母组合

17. 电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 题目链接 . - 力扣&#xff08;LeetCode&…

1.类和对象-友元

文章目录 1.全局函数做友元代码运行结果 2.类做友元代码运行结果 1.全局函数做友元 思路分析&#xff1a; 正常情况下&#xff0c;全局函数visit()中的ROOM 类变量r是访问不到Building类中的私有成员的。但是通过在Building类中添加使用全局函数做友元&#xff0c;即可访问私有…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

ThreadLocal通俗解读,举个例子?

ThreadLocal 解读 ThreadLocal 是 Java 中一个用来创建线程局部变量的类。它为每个使用该变量的线程提供独立的变量副本 线程局部变量意味着对于同一个 ThreadLocal 实例&#xff0c;在不同的线程中访问到的值是不同的&#xff0c;每个线程都有自己的变量副本。这样可以在多线…

代码学习记录13

随想录日记part13 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.06 主要内容&#xff1a;今天的主要内容是二叉树的第二部分哦&#xff0c;主要有层序遍历&#xff1b;翻转二叉树&#xff1b;对称二叉树。 102.二叉树的层序遍历226.翻转二叉树101. 对称二叉…

MySQL用户创建和权限分配

MySQL用户创建和权限分配 用户创建 查看用户 select user,host from user; 创建用户 create user ‘用户名’ ‘host’ identified by 密码’; 删除用户 drop user ‘用户名’ ‘host’; 更新host update user set host ‘%’ where user 用户名‘&#xff1b; 权限分配 查…

逢7过,从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过(1~100之间满足逢7必过规则的数据)

分析&#xff1a;这题就是碰到 7是个位&#xff0c;7是十位&#xff0c;7的倍数 就要过 // 1 2 3 4 5 6 过 8 9 10 11 12 13 过 14 15 16 过 18 19 20 过。。 69 过 过 过 过 过 。。80.。。 判断每个数字&#xff0c;如果符合条件&#xff0c;就打印过&#xff0c;如果不符…

2024中国重庆沐浴博览会5月29日-31日

2024中国沐浴展——世界级温泉胜地&#xff0c;引领健康产业新风向 2024第五届中国沐浴健康产业&#xff08;重庆&#xff09;博览会暨第十一届中国沐浴温泉文化节 ——世界级温泉胜地&#xff0c;引领健康产业新风向 随着人们生活水平的提高和健康意识的增强&#xff0c;沐…

LeetCode-第67题-二进制求和

1.题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 2.样例描述 3.思路描述 将两个二进制字符串转换成整型&#xff0c;然后相加后的整型转为二进制字符串 4.代码展示 class Solution(object):def addBinary(self, a, b):# 将字符串…

AI新工具(20240306) mlx-swift-chat Mac运行本地模型;Comflowyspace开源AI图像和视频生成工具

1: mlx-swift-chat 专为 Apple 硅片设计的高效机器学习框架&#xff0c;支持在本地实时运行 LLM 模型&#xff08;如 Llama、Mistral&#xff09; mlx-swift-chat 是一个为苹果系统&#xff08;例如你的笔记本电脑上的Apple Silicon&#xff09;特别设计的机器学习框架 MLX 的…

计划任务和日志

一、计划任务 计划任务概念解析 在Linux操作系统中&#xff0c;除了用户即时执行的命令操作以外&#xff0c;还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务&#xff08;如定期备份、定期采集监测数据&#xff09;。RHEL6系统中默认已安装了at、crontab软件…

前端如何实现高度的自动过渡

主要是利用了浏览器的渲染机制。 <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, mini…

linux系统elk组件kibana部署

Kibana部署 Kibana部署安装配置Kibana安装配置启动 安装配置Nginx反向代理配置YUM源&#xff1a;安装&#xff1a;配置反向代理 配置授权用户和密码启动nginx Kibana部署 安装配置Kibana 安装 tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C /usr/local/配置 echo server.…