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

Java 向上转型小白学习总结

Java 向上转型是指父类的引用指向子类的对象

说通俗一点,假设某个爸爸和他的孩子,把他的孩子当作爸爸看待,做他爸爸干的事儿,(访问父类的成员变量和方法,包括被子类重写的方法)。

但是孩子自己独有的那些本领(子类特有的成员变量和方法),你通过把他当作爸爸的这种看法,是没法让他展示出来的

也就是说,向上转型后,虽然我们用的是父类的称呼(引用),但实际上那个东西还是原来的孩子(子类对象),只是我们暂时只能让他表现像爸爸那部分特点

代码中,别人要的是爸爸类型,这时候把小孩传过来,这是就不能把这个小孩当小孩看,因为人家要的是爸爸类型,孩子继承爸爸,孩子也是爸爸,把孩子当爸爸看合情合理。

在向上转型中,对象在内存中仍然是子类的对象,只是通过父类的引用去操作它

从类型的角度来看,引用的类型是父类,但实际指向的对象是子类。这意味着,通过这个父类引用调用方法时,如果子类重写了父类的方法,会执行子类重写的版本;但对于子类特有的方法和成员变量,无法通过这个父类引用直接访问。

所以,本质上对象还是属于子类,但在引用和操作的层面,使用的是父类的类型。

这是 Java 语言故意这样设计的,是基于面向对象编程的原则和理念。

这样的设计有助于实现封装、继承和多态的特性,提高代码的可读性、可维护性和安全性。它强制开发者更清晰地思考对象之间的关系,避免混乱和错误的使用,使得程序的结构更加合理和稳定

向上转型中父类类型的引用变量不能调用子类特有的方法,主要基于以下几个原因:

  1. 封装和多态的原则:向上转型的目的是为了以更通用的方式处理对象,强调对象的共性(即父类定义的公共属性和方法)。如果允许通过父类引用调用子类特有的方法,就破坏了封装性和多态性的设计原则,使得父类的引用能够访问到子类特有的、可能不一致的行为。

  2. 类型安全性:Java 是一种强类型语言,编译器需要在编译时确保类型的正确性和安全性。父类并不知道子类特有的方法,因此不允许通过父类引用直接调用,以防止在运行时出现不可预测的错误。

  3. 设计的一致性和可维护性:如果允许这样做,会使代码的结构和逻辑变得混乱,降低代码的可读性和可维护性。开发人员可能会在不知情的情况下错误地使用父类引用调用子类的特有方法,导致难以理解和调试的问题。

总之,这种限制有助于保持代码的清晰、一致和可预测性,符合面向对象编程的原则和设计理念

演示代码如下:

class Parent {public void method() {System.out.println("Parent's method");}
}class Child extends Parent {@Overridepublic void method() {System.out.println("Child's method");}public void childSpecificMethod() {System.out.println("This is a child specific method");}
}public class UpcastingExample {public static void main(String[] args) {// 向上转型Parent parent = new Child();parent.method();  // 输出:Child's method// 以下代码会报错,因为不能通过父类引用访问子类特有的方法// parent.childSpecificMethod();}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • hive benchmark
  • zdpvue_primeadmin 登录相关界面的代码梳理和优化,一款Vue3开发的后台管理系统模板
  • IDEA如何进行断点调试
  • day 28 HTTP协议
  • C语言第20天笔记
  • 在Java程序中执行Linux命令
  • 对AI大模型的擅长能力的了解
  • 工作 sql 数据库创建 表的修改 插入数据
  • 数据库系统 第17节 数据仓库
  • 分享|华为测试OD岗面试流程
  • 高效记录与笔记整理的策略:工具选择、结构设计与复习方法
  • CentOS 上安装 Java 17
  • 【Bifrost】ubuntu24.04 远程构建及clion设置编码风格google
  • docker入门教程
  • kettle的Javascript组件获取T-1天和T+1天
  • [deviceone开发]-do_Webview的基本示例
  • 2017 年终总结 —— 在路上
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Java知识点总结(JavaIO-打印流)
  • JSDuck 与 AngularJS 融合技巧
  • leetcode386. Lexicographical Numbers
  • Linux链接文件
  • Python 反序列化安全问题(二)
  • React as a UI Runtime(五、列表)
  • underscore源码剖析之整体架构
  • uni-app项目数字滚动
  • 聊一聊前端的监控
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 数组大概知多少
  • 写给高年级小学生看的《Bash 指南》
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 如何在招聘中考核.NET架构师
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (Git) gitignore基础使用
  • (附源码)计算机毕业设计ssm电影分享网站
  • (排序详解之 堆排序)
  • (三)docker:Dockerfile构建容器运行jar包
  • (推荐)叮当——中文语音对话机器人
  • (一一四)第九章编程练习
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .gitignore
  • .net core Swagger 过滤部分Api
  • .net refrector
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @软考考生,这份软考高分攻略你须知道
  • []T 还是 []*T, 这是一个问题
  • [1]-基于图搜索的路径规划基础
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20190113]四校联考
  • [30期] 我的学习方法