如果我有一个带有f.e 3类的Java项目,并认为你的第一堂课发生了一些事情,现在你想改变第三堂课的价值,你怎么能这样做呢?当我有我的第一堂课时,我用
之类的东西来引用我的第二堂课SecondClass mSecondClass =new SecondClass()
然后至少在第二节课中我用
创建我的第三节课...=New ThirdClass()
如果我在第二个类中实现了一个方法,如setValue(int v)
,我可以从第一个类改变第二个类的值,然后在第二个类到第三个类中执行相同的Form但不应该在那里一种更简单的方法?
答案 0 :(得分:0)
您正在尝试查看整个系统并立即控制所有系统。面向对象编程的目的是隐藏第三类可能需要执行第一类操作的细节。
这些类首先必须相互链接。让我们说第一堂课是所有事情的起点。该类应该有一组明确的东西,它允许用户从中提出要求,它应该通过修改内部值并要求其中的任何对象来帮助它来实现这些内容。保持这种思维方式顺其自然,这将更有意义。
您的评论者是对的。您需要区分一个类 - 一组定义对象如何工作的代码 - 和对象 - 在运行时获取和发送消息的特定事物。
在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();
现在,您将看到在连接对象的网络中如何存在责任委派,这些对象在运行时以几种不同的方式链接在一起。
答案 1 :(得分:0)
是的,可以有一种简单的方法,直接从ThirdClass
更改FirstClass
对象的值。为什么你甚至试图通过SecondClass
进行沟通?您的意思是使用encapsulation吗?这不是封装在面向对象编程中的工作方式。封装是从所有其他类创建数据抽象,而不仅仅是一个(在您的情况下为FirstClass
)。您可以在interface
类中提供这些接口(不是那些setValue
,但这些函数ThirdClass
),然后让FirstClass
个对象也使用这些函数。你可以在你的包里面使用你的课程,你知道不是吗?
其次,如前所述,更改变量的值取决于您要更改的变量。
如果您正在尝试更改静态变量,请创建一个新实例并更新该值,如下所示
ThirdClass three = new ThirdClass();
three.setValue(0); // int v
否则,如果是静态字段(变量),
ThirdClass.Value = 0; // public int Value; “没有封装”很糟糕!
如果您正在进行封装,那么只需在类中调用( static )函数,
ThirdClass.setValue(0); // int v
// it also assume you're having
public static void setValue(int v) { /* code here */ }
这样,您可以更新您的值。您可以考虑给出“Understanding class members”一下,它可以帮助您理解成员的处理方式。
答案 2 :(得分:0)
阅读链接后,了解班级成员"我终于明白了为什么你可以写"静态"在你的变量或方法之前,它也解决了我的问题。谢谢大家的帮助!