如何将Child对象转型为仅保留Parent属性的Parent对象?
问题分析
你遇到的核心问题是Java的引用类型转换不会改变对象的实际类型。当你执行parent = (Parent) child;时,只是让编译阶段parent变量的声明类型变成了Parent,但运行时这个对象本质还是Child实例。所以调用toString()时,会优先执行Child类中重写的方法,导致输出还是Child的格式。
解决方案
要得到一个真正的Parent对象(仅包含Parent类的属性),你需要创建一个全新的Parent实例,并将Child中属于Parent的属性值复制过去,而不是仅仅做类型转换。
方法1:手动复制属性(简单直接)
直接调用Parent的setter方法,把Child里的父类属性值传递过去:
public class TestExtension { public static void main(String arg[]) { Child child = new Child(); child.setFirstName("fist name"); child.setLastName("last name"); // 创建新的Parent对象,复制父类属性 Parent parent = new Parent(); parent.setLastName(child.getLastName()); System.out.println(child); System.out.println(parent); } }
方法2:添加转换方法(优雅复用)
如果需要多次转换,可以在类中添加专门的转换逻辑,比如:
在Parent类中新增复制构造器:
// Parent类中添加接收Child对象的构造器 public Parent(Child child) { this.lastName = child.getLastName(); }
之后在测试类中直接使用:
Parent parent = new Parent(child);
或者在Child类中添加转换方法:
public Parent toParent() { Parent parent = new Parent(); parent.setLastName(this.getLastName()); return parent; }
调用时更直观:
Parent parent = child.toParent();
运行结果
修改后执行代码,就能得到你期望的输出:
Child [firstName=fist name, getLastName()=last name] Parent [lastName=last name]
补充说明
如果你的类有大量属性,手动复制会很繁琐,这时可以考虑用反射批量复制父类属性,或者使用第三方Bean工具类(比如Apache Commons BeanUtils的copyProperties方法)。不过对于简单场景,手动复制或自定义转换方法是最直接且无额外依赖的方式。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

