【问题标题】:Does Java follow Object Oriented Programming Model fully?Java 是否完全遵循面向对象的编程模型?
【发布时间】:2012-04-28 20:13:51
【问题描述】:

下面的代码说明了这种情况:

class Human {

 private String heart = "default heart";

    public void control(Human h) {

            h.heart = "$%^&*@@!#^";
      }

   public String getHeart() {
    return heart;
    }
  }

 public class HumanTest {

    public static void main(String[] args) {

    Human deb = new Human();
    Human kate = new Human();

    System.out.println(deb.getHeart());
    kate.control(deb);
    System.out.println(deb.getHeart());

   }

 }

不幸的是,这里 deb 的心脏 [私有变量] 被修改了。 :)

Java 允许代码在没有任何错误的情况下运行。但是即使代码在同一个类中,赋予对象访问其他对象的私有成员的特权是否合理? Java 不应该不允许这样做吗?

据我所知,私有意味着限制对类源代码之外的访问。但同样的概念也适用于上面的源代码。结果是灾难性的,因为一个人的心不能被任何随机的人改变。

【问题讨论】:

  • 很少有语言是纯 OOP。您只需阅读 public static void main 即可了解 main 是在没有对象的情况下运行的。
  • 您的问题根本与 OOP 无关。这是关于Java中的访问控制机制。它没有是/否的答案。 Jim Gosling 就是这样设计的:就是这样。如果你想知道为什么,要么在语言规范中,要么在 JVM 规范中,要么在 Jim 的脑袋里。
  • 那么你期望私人会员被什么使用?如果不被公共成员使用,那么你认为私人成员应该在哪里使用。

标签: java oop object jvm private


【解决方案1】:

有些语言在对象级别进行封装,而其他语言(Java、C++)在类级别进行封装。听起来您已经习惯(或刚刚阅读过)对象级别的封装。坦率地说,我发现类级别要自然得多,但也许这只是因为 C++ 为我提供了使用类进行编程的介绍。类级封装使一些习惯用法(工厂方法、复制构造函数、比较运算符)更容易编写。使用对象级封装,您最终会暴露比您真正想要的更多的东西来实现这些功能。

无论如何,这两种方法都不是“正确的”——它们只是不同而已。

【讨论】:

    【解决方案2】:

    查看防御副本以避免这种情况。这是因为 java 对象的操作更像引用。 'pointer' 不会改变,但是一旦你知道它,你就可以改变它包含的值。

    http://www.informit.com/articles/article.aspx?p=31551&seqNum=2

    【讨论】:

      【解决方案3】:

      这并没有破坏面向对象 - 它是关于对类内部元素的封装。

      你可以用这个例子来做这件事可能看起来很傻,但据我所知,这实际上并不是一件坏事。封装类元素的目的是让其他类无法修改它们——它们只能看到类Human的公共接口,例如进行更改。这意味着不止一个人可以在同一个项目上工作,编写不同的类(或者您可以在同一个项目上在不同时间编写不同的类),并且他们不需要知道代码的内部工作原理。

      但是,您可以直接在 Human 中访问私有字段的唯一位置(条形反射)是 from Human。当您编写 Human 类时,如果您选择对其他 Human 对象的私有字段进行修改,这取决于您 - 但它都包含在一个类中,这是您的设计。如果您以不合适的方式执行此操作,那么这是您的设计中的一个缺陷,而不是 Java - 在某些情况下这样做非常有意义!

      【讨论】:

        【解决方案4】:

        如果结果是灾难性的,则不应对类进行编码以使其允许。 “错误”不是由类外部的代码引起的,而是由类本身的代码引起的。所以这只是你代码中的一个错误。

        如果 Java 不允许,您只能通过其公共属性来比较同一类的对象,例如,这会破坏封装(通过公开私有内容)和/或非常慢(通过强制私有属性的防御性副本,以使它们可用于其他对象。

        【讨论】:

          【解决方案5】:

          嗯,我的看法,这只是我对 private 关键字的解释,private 是类私有的,可以在类内部访问。它不限于类的实例。因此,您不能在“humantest”类中​​执行 kate.heart="xpto",因为这会试图破坏它的隐私,但是允许使用 kate 的代码来改变 deb 的心脏,因为它是在类内部处理的。

          【讨论】:

            【解决方案6】:

            Java 语言严格遵循面向对象的概念。这也是正确的..对吗?使用您的类的对象,您正在修改您的类的变量。但这取决于可以控制他的对象的程序员。

            人类的心在人类的阶级中是私有的。但是使用控制方法,您可以从外部访问它。这就是它被修改的原因..那有什么问题.?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-07
              相关资源
              最近更新 更多