探讨Java中的父子类转化问题
有两个问题:
(1)子类对象可以转化为父类对象吗?
(2)父类对象可以转化为子类对象吗?
------------------------------------------------------------------------------------------------------------------------------------
第(1)个问题应该都不陌生,也没什么好探讨的,肯定可以,因为在多态中经常用到。
如:class Father{}
calss Son extends publc Father{}
Father f = new Son(); //父类引用指向子类对象
其中,new Son()表示在在堆中分配了一段空间来存放类Son中的数据,
并返回一个Son的对象,并赋值给Father的引用f,即f指向子类的对象,
此时,子类的对象并没有定义一个名字。
定价于:
Son s = new Son();
Father f = s;
------------------------------------------------------------------------------------------------------------------------------------
第(2)个问题:一般情况下,父类对象是不可以强制转化为子类对象的,
如:
class Father{}
calss Son : publc Father{}
Son s = new Father(); //error
因为,子类除了从父类继承一些东西外,它还增加了一些自己的东西,也就是说,
子类对象一般都比父类对象包含更多的东西。这样的话,子类如果访问子类新增的内容,
而这些内容父类并没有,所以就会报错。
但是,如果前提是:此父类对象已经指向了此子类对象,就可以转换。
如:
Father f = new Son(); //父类引用指向子类对象
Son s2 = (Son)f; //可以
因为,子类强制转换为父类对象时,并没有实际丢失它原有内存空间(比父类多的那些部分)
只是暂时不可访问,所以能再转回来。
一般在前面加一条判断语句 if(father instanceof Son);防止报ClassCastExcept异常。
如:
Father f = new Son(); //父类引用指向子类对象
if(father instanceof Son){ Son s2 = (Son)f;}
结论:(1)子类对象可以转化为父类对象
(2)一般不可以,但是如果此父类已经指向了此子类对象,可以
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PHP学习4——面向对象
主要内容: 创建类 成员方法 构造方法 析构方法 封装 继承 接口 多态 静态成员 常用关键字 常用魔术方法 从PHP5开始引入了面向对象的全部机制,面向对象的特性符合软件工程的3个目标:重用性,灵活性,扩展性。 创建类 类前面不用public修饰,只要class,类的属性不能在初始化赋值(除非你写了构造方法来初始化赋值),属性的使用符号->,比如$aClass->name; demo.php <?php //声明ren类,默认public,不写 class ren{ public $name; public $sex; public $age; } //实例化ren类 $xiaoli=new ren(); //设置name属性 $xiaoli->name="小李"; //获取name属性 echo $xiaoli->name; ?> 输出 =》小李 成员方法 就是类中函数,只是在原先的函数声明前面加修饰符public,即可,调用方法$aClass->func(),在函数中使用该对象的属性使用关键字$this,比如$this->name...
- 下一篇
springboot 日志问题记录
问题:新建工程busr,采用pandora boot,引入了需要的包,简单写了点代码发布,spring-boot启动报错: Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.apache.logging.slf4j.Log4jLoggerFactory loaded from jar:file:/opt/**.jar!/BOOT-INF/lib/log4j-slf4j-impl-2.6.2.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml Object of class ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群