Java真的是面向对象的吗?
我的理解是,面向对象编程提倡对象之间的交互。但就我所见(我学了一点Java),这些程序有明确的操作路径。像Java真的是面向对象的吗?,java,oop,Java,Oop,我的理解是,面向对象编程提倡对象之间的交互。但就我所见(我学了一点Java),这些程序有明确的操作路径。像mainroutine或其他函数一样,强制对象使用它们的方法 我还读到OOP程序应该与现实世界相似。在现实世界中,猫和狗在没有外界干预的情况下进行互动。没有人会强迫狗对猫吠叫,但这是“狗”的天性 但在Java中,对象之间并没有真正的交互。有一个main函数指导对象的交互。如果所有对象都能识别附近的对象(没有其他函数的帮助)并同时运行它们的操作,不是更好吗?我认为它更适合于真实世界 编辑:-
main
routine或其他函数一样,强制对象使用它们的方法
我还读到OOP程序应该与现实世界相似。在现实世界中,猫和狗在没有外界干预的情况下进行互动。没有人会强迫狗对猫吠叫,但这是“狗”的天性
但在Java中,对象之间并没有真正的交互。有一个main
函数指导对象的交互。如果所有对象都能识别附近的对象(没有其他函数的帮助)并同时运行它们的操作,不是更好吗?我认为它更适合于真实世界
编辑:-
@Makoto是的,我的观点是对象之间不会自动交互
如果对象可以识别同一区域内的其他对象并在同一时间运行(如线程),那么我们可以更接近真实世界,同时对其进行编码以完成我们的工作
例如:-
class Dog {
if you see a cat object in the same place
bark at it.
if you see the owner object
wag your tail.
}
如果像这样我们可以创建一组对象并让它们自动交互,那么程序就不会是线性的。是的,它不同于普通的面向对象编程或函数式编程。
但我们可以达到同样的结果,我希望在现实世界中也能如此
class Dog {
void barkAtCat(Cat c){
c.gotBarkedAt(this);
}
void gotHissedAt(Cat c){
barkAtCat(c);
}
}
class Cat {
void gotBarkedAt(Dog d){
hissAtDog(d);
}
void hissAtDog(Dog d){
d.gotHissedAt(this);
}
}
这是两个对象
s“相互作用”的一个非常简单的例子:是的,你必须从“外部”开始互动——因为毕竟,这不是“真实世界”,它是对它的模拟——关于这一点的有价值的想法,请参见@1111、@Sujan和@PelitMamani的答案
也就是说,这里讨论的OO原则是,您可以在程序的对象中(Dog
和Cat
)对域中对象(狗和猫)的性质和行为建模,这可以包括这些对象之间“自动”发生的交互,作为你所编纂的对象的性质的函数。在这里的示例中,对barkAtDog()
或hissAtCat()
的单个调用将导致这两个对象之间的无限交互循环。这显然是一个微不足道的例子,但如果你想象建模更复杂的行为和对象之间的关系,你就可以开始想象模拟更复杂的自然现象,我希望在这个答案中传达的是OO在这方面的有用性
根据您的编辑-您的直觉,多线程对于任何此类模拟都是必不可少的,这是正确的。事实上,在许多Java入门类中,多线程单元末尾的项目与您描述的项目非常相似。任何类型的编程都隐含着一个要遵循的程序和一个编写该程序的程序员。现在的编程并不涉及创造相互玩耍的动物,当然,除非程序员准确地定义了游戏的类型和每个游戏所需的条件,并将它们包含在他的书面程序中。很可能他会用OOP来编写这个程序
你的问题不是关于OOP或Java,而是关于一般编程。你的问题不是关于ObjectOp编程,而是关于一般编程和算法。一个程序只做它被指令做的事情,否则它就不是一个程序。
我们可以想象,猫和狗之间真实世界般的互动可以被编程,就像其他任何东西一样。编程是将真实世界的算法和属性转换成代码行
然而,我们现在可以同意,一个真实的物理世界不能仅仅通过编写代码来创建。也许在未来,随着全息和量子计算的突破,我们将能够用几行代码创造出真正的猫和狗。好吧,我想用drewmoore answer再扩展一下答案
扩展名:
有一个点需要清除。狗自己不向猫吠叫。还有一种媒介,狗通过它知道猫在他面前,而这种媒介是思维或大脑。所以我可以将每个人的大脑和每个人的actionListener()
联系起来。在现实世界中,大脑会触发狗吠叫,而在计算机/程序世界中,动作监听器会触发狗吠叫。
会触发狗吠叫。有趣的哲学问题。只是我的拙见:
您正在描述一个模拟器和数据点。您当然可以用Java创建其中一个,