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

如何在非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:06:55