You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:05:34