从其他 Class 更改变量

Change Variables from other Class

如果我有一个 Java 项目 f.e 3 classes 并且认为在你的第一个 Class 中发生了一些事情,现在你想更改第三 Class 你怎么能这样!?当我有我的第一个 Class 时,我用

之类的东西引用了我的第二个 Class
SecondClass mSecondClass =new SecondClass()

然后至少在第二个 class 我用

创建了第三个 class
...=New ThirdClass()  

如果我在第二个 class 中实现了一个方法,例如 setValue(int v),我可以从第一个 class 更改第二个 Class 的值,然后执行相同的表格第二到第三 Class 但不应该有更简单的方法吗?

您正试图查看整个系统并同时控制它。面向对象编程的要点是隐藏你的第三个 class 可能需要做一些由你的第一个引起的事情的细节。

这些 class 和 link 之间肯定有一个原因。假设第一个 class 是所有事情的开始。 class 应该有一组明确的东西,它可以让用户向它提出要求,并且它应该通过修改其内部值并要求其中的任何对象做一些事情来帮助它来实现这些东西。保持这种思维方式沿着链条向下发展,它会更有意义。

您的评论是对的。您需要区分 class - 一堆定义对象如何工作的代码 - 和对象 - 在 运行 时间接收和发送消息的特定事物。

在 Java 中,对象消息实际上是函数调用,我们知道幕后有一些类似程序的流程。忽略那个。

希望对您有所帮助。

简而言之 - 考虑将责任委派给对象以及一种编程方式,其中事物向可以提供帮助的对象发出请求。

作为更具体的答案,这里是一些对象可能如何交互。

class Train {
    private Engine engine;
    private Whistle whistle;

    public Train() {
        // these components are part of the train and so
        // are constructed when it's constructed
        engine = new Engine();
        whistle = new Whistle();
    }

    public void go() {
        whistle.toot();
        engine.start();
    }
}


class Driver {
    private Train train;
    private IPod iPod;

    public Driver(IPod iPod, Train train) {
        // the driver may be given any ipod
        // and any train to drive
        this.iPod = iPod;
        this.train = train; 
    }

    public void drive() {
        iPod.startMusic();
        train.go();
    }
}

// main method
IPod iPod = new IPodNano();
Train train = new Train();

Driver driver = new Driver(iPod, train);
driver.drive();

现在您了解了在 运行 时间以几种不同的方式link 连接在一起的对象网络中如何存在责任委派。

是的,可以有一种简单的方法,直接从您的 FirstClass 更改 ThirdClass 对象的值。你为什么还要尝试通过 SecondClass 进行交流?您是要使用 encapsulation 吗?这不是封装在面向对象编程中的工作方式。封装是从所有其他 class 中创建数据的抽象,而不仅仅是一个(在您的情况下 FirstClass)。您可以在您的 ThirdClass class 中提供这些接口(不是那些 interface,而是这些函数 setValue),然后让 FirstClass 对象也使用这些函数。您可以在包裹中使用 classes,您知道不是吗?

其次,如前所述,更改变量值取决于您要更改的变量。

  1. 静态变量
  2. 实例变量

如果您尝试更改静态变量,请创建一个新实例并更新值,类似这样

ThirdClass three = new ThirdClass();
three.setValue(0); // int v

否则,如果是静态字段(变量),

ThirdClass.Value = 0; // public 整数值; "No encapsulation" 不好!

如果您正在封装,那么只需在 Class 中调用 (static) 函数即可,

ThirdClass.setValue(0); // int v
// it also assume you're having
public static void setValue(int v) { /* code here */ }

通过这种方式,您可以更新您的价值观。您可以考虑给“Understanding class members”看看,它会帮助您了解会员的待遇。

阅读 link "understanding class members" 之后,我终于明白了为什么您可以在变量或方法之前写 "static" 并且它也解决了我的问题。感谢大家的帮助!