如何更改未调用该方法的对象的实例变量的值?

How to change the value of an instance variable of an object that didn't call the method?

提问人:Beau 提问时间:6/16/2023 更新时间:6/16/2023 访问量:121

问:

我正在用 java 编写一个程序,其中我想更改方法中对象的实例变量的值,而该对象尚未调用该方法。我正在尝试做一些类似于附加代码的事情。我想在myMethod方法中更改object2.num,但这会产生错误,因为object2超出了myMethod的范围。

public class Main {

  public static void main(String[] args) {

    Item object1 = new Item(2);
    Item object2 = new Item(4);
    
    object1.myMethod();
    System.out.println(object1.num + " " + object2.num);
  }
}

class Item {
  
  int num;

  Item(int n) {
    num = n;
  }

  public int myMethod() {
    object2.num *= this.num;
    this.num *= object2.num;
  }
}

我想出的唯一解决方案是给 object1 一个额外的实例变量 num2,它将充当 object2.num。在方法之外,我将 object2.num 更改为 object1.num2。然而,这似乎非常不理想,并且在使用多个变量进行更改时会变得很烦人。有没有更有效的方法来实现这一目标?

我对编码还很陌生,可能已经有解决方案了,所以任何帮助或解决方案的链接将不胜感激。

Java 对象 方法 作用域

评论

1赞 codebod 6/16/2023
将参数传递给 例如 怎么样?myMethodpublic void myMethod(Item otherItem) {...}
0赞 Stephen P 6/16/2023
你发布的所有代码都在一个文件中吗?如果是这样,那可能会让你感到困惑。如果你有一个“Item”类的文件,它将包含它,从你发布的代码中,只有从行到最后一个右大括号的行 - 现在查看该文件。查看该文件,“myMethod”从何而来?不,不要看 Main.java ...看 Item.java,从哪里来?无处。它没有在 Item.java 中的任何地方声明——它不在类中,并且“Item”不知道 Main.java 的存在。Item.javaclass Item {}object2object2Item

答:

0赞 Reilas 6/16/2023 #1

"...我想更改方法中对象的实例变量的值,而该对象尚未调用该方法......”

从技术上讲,如果对象的变量是静态的,则可以。
虽然,对于您当前的设计来说,这似乎不合逻辑。

"...我想在myMethod方法中更改object2.num,但这会产生错误,因为object2超出了myMethod的范围。..."

没错,在 Java 中,如果没有实际对象,您将无法更改对象的变量。

"...我想出的唯一解决方案是给 object1 一个额外的实例变量 num2,它将充当 object2.num。在方法之外,我将 object2.num 更改为 object1.num2。..."

您必须提供有关任务的功能用途的更多详细信息。

我建议将 object2 作为参数传递给 myMethod
此外,我必须在这里添加一个返回值,因为该方法返回一个 int

public int myMethod(Item object2) {
    object2.num *= this.num;
    return this.num *= object2.num;
}

或者,可以只声明具有 void 返回类型的方法。

public void myMethod(Item object2) {
    object2.num *= this.num;
    this.num *= object2.num;
}

然后,提供 object2 作为参数。

object1.myMethod(object2);

输出

16 8

评论

0赞 Beau 6/16/2023
谢谢,目的是根据另一个对象的实例变量以及方法中的实例变量更改两个对象的实例变量。方法声明中的 int return 类型应该是空的,很抱歉。我不知道你可以为方法提供一个对象作为这样的参数,但这似乎正是我想要的!我假设在方法中更改的所有提供的对象的实例变量也将在 main 方法中更改?如果是这样,这正是我想要的。非常感谢!
0赞 Reilas 6/16/2023
@Beau,没问题,很高兴它有所帮助。“......我不知道你可以为方法提供一个对象作为这样的参数......“,是的,因为它是封闭类,有点令人困惑;从逻辑上讲,它似乎是递归的。它有效。“......我假设在方法中更改的所有提供的对象的实例变量也将在 main 方法中更改?...“,是的,传递的对象将被更新,因此 main 中的对象将具有相应的值。