从 java 中的另一个方法更改静态变量

changing static variables from another method in java

我想创建一个方法 moveQ(),我可以在方法 find() 中调用它来更改 find() 的变量,但是在方法 moveQ() 我收到错误 cannot find symbol variable x 在此示例中 xyz 是我需要更改的变量。

已编辑:

我也有一些限制,因为这是来自 Java 课程的练习: 1. 方法必须是静态的。 2.不允许使用全局变量。 3.时间复杂度应该小于O(n),我不能增加内存复杂度(意思是不能使用另一个数组或对象)。 4. find() 方法不能接受参数。

在实际程序中,我需要编写一个静态布尔方法,如果在一个分成象限的数组中找到数字x,则return为真。为此,它会搜索每个象限的最高数字。如果x大于象限最高数,那么我需要移动到下一个象限。

xyz是数组象限的最大数、中间数和最小数,通过改变它们,我可以移动象限。

我已经写了 find() 方法,但我想使用辅助方法来使代码更好。

我正在尝试做的事情是否可行,如果可以,我该如何完成?

public class Test
{
    public static boolean find()
    {
        int x = 10;
        int y = 20;
        int z = 30;
        change(x,y,z); // call helper method to change this method's variables.
        System.out.println(x); // should be 20
        System.out.println(y); // should be 22
        System.out.println(z); // should be 15
    }

    //helper method to be called from find() method
    private static void change(int changeX ,int changeY,int changeZ)
    {
        //change find() variables.
        x = changeX * 2; 
        y = changeY + 2;
        z = changeZ /2;
    }
}

您在方法内部声明了变量,因此您无权访问它们,如果您想更改它们,您要么将它们设为全局变量(在方法外部定义它们):

 public class Test
{
int x;
int y;
int z;
void yourMethod(){

  }
}

或者更改方法 find 以将 x、y 和 z 值作为参数。

您可以编写一个 class 封装您的 xyz 作为字段并将您的方法转换为其实例方法(也就是说,它们不应该不再是静态的)。

public class Calculation {
    private int x = 10, y = 20, z = 30;

    public boolean find()
    {
        x = 10;
        y = 20;
        z = 30;
        change(x,y,z); // call helper method to change this method's variables.
        System.out.println(x); // should be 20
        System.out.println(y); // should be 22
        System.out.println(z); // should be 15
    }

    private void change(int changeX ,int changeY,int changeZ)

等等。

然后创建它的实例并在其上调用您的方法:

Calculation calculation = new Calculation();
calculation.find();
...

问题出在你的第二种方法上。您传递了 changeX、changeY 和 changeZ,但尝试设置 x、y 和 z 的值。变量x、y、z不在这个方法的范围内,因此程序会报错。

此外,无论这些名称如何,此方法都不起作用。 Java 不允许您在将原语传递给新方法时更改原语的值。最好的解决方案可能是将它们放在一个数组中,然后将第二种方法更改为接受一个数组。您的第一个方法的主体现在可能看起来像

int [] intarray = new int[3];
intarray[0] = 10;
intarray[1] = 20;
intarray[2] = 30;
change(intarray);
System.out.println(intarray[0]);
System.out.println(intarray[1]);
System.out.println(intarray[2]);

第二种方法将变为

private static void change(int [] changeArray) {
    changeArray[0] *= 2;
    changeArray[1] += 2;
    changeArray[2] /= 2;
}

(*=、+= 和 /= 运算符是 shorthand 您在上面所做的。

您可以更有条理地实现这一点:

创建 Calculation class 然后将所有变量和方法放在上面

文件Calculation.java:

public class Calculation {

    private int x = 10;
    private int y = 20;
    private int z = 30;

    public void setX(int value){
        x = value;
    }
    public void setY(int value){
        y = value;
    }
    public void setZ(int value){
        z = value;
    }

    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public int getZ(){
        return z;
    }

    private void change(int changeX, int changeY, int changeZ){
        setX(changeX * 2);
        setY(changeY + 2);
        setZ(changeZ / 2);
    }

    public void find(){
        change(x,y,z);
        System.out.println(getX()); 
        System.out.println(getY()); 
        System.out.println(getZ());
    }
}

之后,只需在您的主程序中创建 class Calculation 的新对象,然后对该对象变量

调用 find() 方法

文件Main.java:

public class Main {

    public static void main(String[] args) {
        Calculation c = new Calculation();
        c.find();
    }   
}

输出:

20
22
15