如何在非static的First类中,将a、b传递给Second类并直接修改其值
解决非static变量跨类修改的问题
嘿,这个问题的核心其实是要搞清楚:非static变量属于类的实例对象,而不是类本身——你没法直接通过First.a这种类名访问的方式去操作它们,必须拿到First类的具体实例引用才行。我猜你之前的方法没生效,大概率是没正确持有First的实例,直接试图访问类的非static成员了。
下面给你几种靠谱的实现方案:
方案1:通过构造方法传递First实例
这是最常用的方式,在创建Second对象的时候,把First的实例传进去并保存,之后就可以直接修改它的a、b变量了。
First类代码
public class First { // 非static变量,属于实例 int a = 10; int b = 20; }
Second类代码
public class Second { // 保存First的实例引用 private First firstInstance; // 构造方法接收First实例 public Second(First first) { this.firstInstance = first; } // 修改First实例的a、b变量 public void updateFirstVariables() { firstInstance.a = 100; firstInstance.b = 200; } }
测试代码(主类)
public class Main { public static void main(String[] args) { First myFirst = new First(); System.out.println("修改前:a=" + myFirst.a + ", b=" + myFirst.b); // 创建Second时传入First实例 Second mySecond = new Second(myFirst); mySecond.updateFirstVariables(); System.out.println("修改后:a=" + myFirst.a + ", b=" + myFirst.b); } }
运行后你会看到,First实例的a、b已经被成功修改了。
方案2:通过Setter方法传递First实例
如果不想在构造Second的时候就绑定First实例,或者后期需要更换First实例,可以用Setter方法来传递引用:
修改后的Second类
public class Second { private First firstInstance; // Setter方法设置First实例 public void setFirstInstance(First first) { this.firstInstance = first; } public void updateFirstVariables() { // 加个非空判断避免空指针异常 if (firstInstance != null) { firstInstance.a = 150; firstInstance.b = 250; } } }
测试代码
public class Main { public static void main(String[] args) { First myFirst = new First(); Second mySecond = new Second(); // 后期通过Setter传递实例 mySecond.setFirstInstance(myFirst); mySecond.updateFirstVariables(); System.out.println("修改后:a=" + myFirst.a + ", b=" + myFirst.b); } }
注意:如果变量是private的情况
如果First类的a、b是private修饰的(这是更规范的封装写法),你不能直接访问,需要给First类添加Getter和Setter方法:
封装后的First类
public class First { private int a = 10; private int b = 20; // Getter和Setter方法 public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } }
对应的Second类修改方法
public void updateFirstVariables() { if (firstInstance != null) { firstInstance.setA(300); firstInstance.setB(400); } }
这样既保证了封装性,又能实现修改变量的需求。
内容的提问来源于stack exchange,提问作者Aleksa Ristic
相关产品推荐
相关产品推荐

