Java构造函数复制对象值遇空值问题:原因与解决方法
问题分析与解决
问题原因
你的代码出现null的核心原因是每个构造函数只初始化了一个属性,另一个属性未被赋值,默认保持null:
- 用第一个构造函数
testing(String n)创建的对象(比如ab),只有name被赋值,aname默认是null,所以调用ab.display()时会打印null对应"second cons"的行。 - 用复制构造函数
testing(testing s)创建的对象(比如ab2),只有aname被赋值为原对象的name,name默认是null,所以调用ab2.display()时会打印null对应"first cons"的行。
解决方法
根据你的需求,分两种场景给出实现:
场景1:实现标准的复制构造函数(完全复制原对象属性)
如果你希望新对象和原对象的所有属性一致,复制构造函数应该把原对象的name和aname都复制到新对象对应的属性上:
public class Testing { String name; String aname; // 初始化name的构造函数 Testing(String n) { this.name = n; // 可选:给aname设置默认值,避免null this.aname = ""; } // 标准复制构造函数:完全复制原对象属性 Testing(Testing s) { this.name = s.name; this.aname = s.aname; } void display() { System.out.println(name + "\" -first cons\""); System.out.println(aname + "\" -second cons\""); } public static void main(String[] args) { System.out.println("\" \""); Testing ab = new Testing("\"test\""); Testing ab2 = new Testing(ab); ab2.display(); ab.display(); } }
运行后两个对象的属性都会被正确初始化,不会出现null。
场景2:保持原需求——把原对象的name复制到新对象的aname
如果你确实想让新对象的aname等于原对象的name,同时避免新对象的name为null,可以修改复制构造函数:
public class Testing { String name; String aname; Testing(String n) { this.name = n; // 给原对象的aname也初始化,避免打印null this.aname = "original default"; } // 复制原对象name到新对象aname,同时初始化新对象的name Testing(Testing s) { this.name = s.name; // 给新对象name赋值,避免null this.aname = s.name; // 实现原需求的赋值逻辑 } void display() { System.out.println(name + "\" -first cons\""); System.out.println(aname + "\" -second cons\""); } public static void main(String[] args) { System.out.println("\" \""); Testing ab = new Testing("\"test\""); Testing ab2 = new Testing(ab); ab2.display(); ab.display(); } }
额外规范提示
- Java类名首字母大写是编码规范,建议把
testing改成Testing。 - 成员变量建议用
private修饰,通过get/set方法访问修改,符合面向对象的封装原则。
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

