Java真的是面向对象的吗?

时间:2014-11-24 05:18:34

标签: java oop

据我所知,面向对象编程主张对象彼此交互。但据我所知(我学到了一点Java),这些程序有明确的做事路径。像main例程或其他一些函数强制对象使用它们的方法。

我还读到OOP程序应该与现实世界相似。在现实世界的例子中,猫和狗在没有外界干预的情况下进行交互。没有人会强迫狗对猫吠,但它是在“狗”对象的本性。

但在Java中,Objects并没有真正相互影响。有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.
 }

如果像这样我们可以创建一堆对象并让它们自动交互,那么程序根本就不是线性的。是的,它与普通的OOP或函数式编程不同。 但是我们可以在现实世界中获得相同的结果,或者我希望如此。

5 个答案:

答案 0 :(得分:4)

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);
    }
}

以下是两个Object s“互相交互”的一个非常简单的例子:是的,你必须从“外部”发起互动 - 毕竟,这不是“真实的”世界“,它是模拟 - 请参阅@ The111,@ Sujan和@ PelitMamani的答案,以获得有价值的想法。

那就是说,这里讨论的OO原则是你可以在你的程序中Object中对你域(狗和猫)中对象的性质和行为进行建模(DogCat),这可以包括“自动”发生的这些对象之间的交互,作为您编码的对象性质的函数。在此处的示例中,对barkAtDog()hissAtCat()的单个调用将导致这两个对象之间的无限交互循环。这显然是一个微不足道的例子,但如果你想象建模更复杂的行为和对象之间的关系,你可以开始想象更复杂,新兴的自然现象的模拟,我希望在这个答案中传达的是OO的有用性。这样做。

为了回应您的编辑 - 您的直觉认为多线程对于任何此类模拟都是必不可少的。事实上,在Java类的许多介绍中,多线程单元末尾的项目非常类似于您描述的模拟。

答案 1 :(得分:2)

有趣的哲学问题。只是我的拙见:

  1. 您不一定要被迫制作一份精确的世界副本。你只需要一个对你的企业来说足够好的模型(我甚至不知道"什么是一个准确的世界副本",有些人可能会觉得猫和狗受到一些更高的力量控制......)

  2. 关于'独立性:对于一些真实场景,对象做出独立决定(例如你的猫和狗的例子);在其他情况下,控制对象(例如,如果猫和狗是木偶)。 关于他们彼此的了解 - 如果java默认让他们彼此都知道,那也无法反映现实世界:如果有猫和对手怎么办?狗与他们之间的山丘?他们相互定位的能力取决于风的方向(=气味)或其他什么。 所以编程语言必须选择一些简单的默认值,知道他们选择的默认值 - 他们不能假设反映所有真实场景。需要额外的编码。

答案 2 :(得分:1)

任何类型的编程都会隐含地包​​含程序以及编写该程序的程序员。如今存在的编程并不涉及创造彼此玩耍的动物,除非程序员确切地定义了游戏的类型和每个游戏所需的条件,并将它们包含在他的书面程序中。而且他很可能会使用OOP编写该程序。

你的问题不是关于OOP或Java,而是一般的编程。

答案 3 :(得分:1)

你的问题不是关于 O bject O 定向的 P 编程,而是一般的编程和算法。程序只执行它所指示的操作,否则它不是程序。 我们可以想象,猫和狗之间的真实世界之类的交互可以被编程,就像其他任何东西一样。编程是关于将现实世界的算法和属性转换为代码行。

但是,我们现在可以同意,仅仅通过编写代码行就无法创建真实世界和物理世界。也许在未来,随着全息和量子计算的突破,我们将能够用一些代码行创建真正的猫狗。

答案 4 :(得分:1)

嗯,我想通过drewmoore回答来扩展答案。

<强>扩展 ONE 点需要清除。狗不会在猫身上吠叫。还有一种媒介让狗知道猫在他面前,媒介是心灵或大脑。所以我可以将每个大脑与每个 actionListener() 联系起来。在现实世界中,大脑会触发狗吠,在计算机/程序世界中 actionListener() 会触发狗吠...