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

Java中跨类通过方法为变量赋值后获取值为空的问题求助

问题分析与解决思路

嘿,我一眼就看出问题所在啦!你遇到的null问题,核心原因是你在两个完全独立的SetGet实例上操作,它们之间没有任何关联,所以赋值的那个实例和你调用getName()的实例根本不是同一个。

为什么原来的代码会返回null?

来拆解一下你的代码执行流程:

  1. 在Main的main方法里,你创建了SetGet call = new SetGet()——这是第一个独立实例。
  2. 调用option.names()时,方法内部又新建了SetGet tell = new SetGet()——这是第二个完全独立的实例。
  3. 你给tell的info赋值为"Frank",但这个值只属于tell,和main里的call没有任何关系。
  4. 最后调用call.getName(),自然只能拿到call自身的默认值null。

几种可行的解决方法

方法1:传递同一个SetGet实例给List的方法

这是最符合面向对象设计的方式,让List的names方法直接操作外部传入的实例:

class Main {
    public static void main (String[] args) {
        List option = new List();
        SetGet call = new SetGet();
        // 把main里的call实例传给names方法
        option.names(call);
        // 现在调用getName就能拿到"Frank"了
        System.out.println(call.getName()); 
    }
}

class List {
    // 修改方法参数,接收外部传入的SetGet实例
    public void names(SetGet tell) {
        tell.setName("Frank");
    }
}

class SetGet {
    private String info;
    String getName() {
        return info;
    }
    public void setName(String name) {
        info = name;
    }
}

方法2:让List的names方法返回赋值后的实例

如果不想传递实例,也可以让names方法创建并赋值后,把实例返回给main方法使用:

class Main {
    public static void main (String[] args) {
        List option = new List();
        // 直接接收names方法返回的已赋值实例
        SetGet call = option.names();
        System.out.println(call.getName()); // 输出"Frank"
    }
}

class List {
    public SetGet names() {
        SetGet tell = new SetGet();
        tell.setName("Frank");
        return tell; // 返回赋值后的实例
    }
}

class SetGet {
    private String info;
    String getName() {
        return info;
    }
    public void setName(String name) {
        info = name;
    }
}

方法3:使用静态变量(不推荐,除非特殊需求)

如果你需要让所有SetGet实例共享同一个info值,可以把info改成静态变量,但这种方式会让变量变成类级别共享,可能带来意外的副作用,仅在明确需求时使用:

class SetGet {
    // 改成静态变量
    private static String info;
    String getName() {
        return info;
    }
    public void setName(String name) {
        info = name;
    }
}

总结

优先选择前两种方法,尤其是方法1,它能更好地控制实例的生命周期,符合面向对象的封装和依赖传递思想。

内容的提问来源于stack exchange,提问作者evogamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:52:41