Java中跨类通过方法为变量赋值后获取值为空的问题求助
问题分析与解决思路
嘿,我一眼就看出问题所在啦!你遇到的null问题,核心原因是你在两个完全独立的SetGet实例上操作,它们之间没有任何关联,所以赋值的那个实例和你调用getName()的实例根本不是同一个。
为什么原来的代码会返回null?
来拆解一下你的代码执行流程:
- 在
Main的main方法里,你创建了SetGet call = new SetGet()——这是第一个独立实例。 - 调用
option.names()时,方法内部又新建了SetGet tell = new SetGet()——这是第二个完全独立的实例。 - 你给
tell的info赋值为"Frank",但这个值只属于tell,和main里的call没有任何关系。 - 最后调用
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
相关产品推荐
相关产品推荐

