学习java,为什么我的私有私有?

时间:2011-07-12 10:05:14

标签: java programming-languages private public

我正在学习java,来自python有很多我不完全理解的东西存在于java中,其中第一个必须是公共和私有声明。我的意思是从一种没有真正可见的公共私人声明的语言到一切必须是私人的语言,我理解他们所做的基本原则。我问'为什么'他们这样做。为什么有人会关心谁接触私处?如果你是一个优秀的程序员,你应该知道你应该'和'不应该'在代码中戳的那些位,这应该不是一个问题。为什么要保密呢?为什么隐藏,模糊,让世界变得私密?为什么要开始照顾。

9 个答案:

答案 0 :(得分:9)

(意见回答如下。)

这是因为Java是bondage and discipline language,旨在满足mediocre programmers。 Python,otoh,是一种针对consenting adults的语言,他们同意将对象的私有部分彼此暴露,信任其他程序员不要滥用提供给他们的无证件/无担保功能。如果他们做了什么,什么都打破了,那些破坏东西的人就可以保留这些东西。

Python确实有一些访问控制,例如__all__来隐藏/显示模块的某些部分,只是所有这些都是可选的,并且可以绕过这样做的风险。< / p>

(重复我在评论中所说的内容:我并不是说所有Java程序员都是平庸的。我只是说该语言的设计是为了让可以安全地使用它这样的程序员。)

答案 1 :(得分:6)

因为其他人并不像你一样关心你的私人。你决定什么是私有的。

严肃地说,公共事物定义了API - 与外界的合同 - 这是一个重要的决定。另一方面,尽可能多的东西应该是私有的 - 这就是封装。欢迎来到OO。

答案 2 :(得分:5)

您不希望其他程序员访问并可能修改您的私有变量。 e.g。

private int ryan; //its your responsibility to save private ryan

除了所有的笑话,私有对封装很有用。此外,私有构造函数不允许在工厂方法模式中进行子类化和特征化。具有私有构造函数的类只允许在此类中实例化对象(例如,可以通过静态公共方法完成)。

正如你所看到的,私有化可能非常有用......

答案 3 :(得分:4)

隐藏数据成员的原则称为Data Encapsulation

从上面的文章:

  

使用数据封装的优势来自   类的更改实现但接口仍然是   相同。例如,要创建一个可以包含整数的堆栈类,   设计者可以选择使用隐藏的数组来实现它   来自班级的用户。然后设计者编写push()和   pop()方法将整数放入数组并从中删除   分别是数组。用户可以访问这些方法。   如果用户尝试直接访问阵列,a   将导致编译时错误。现在,应该由设计师决定   将堆栈的实现更改为链表,数组即可   只需用链表和push()和pop()方法替换即可   重写,以便他们操纵链表而不是   阵列。用户编写的用于操作堆栈的代码是   仍然有效,因为它没有直接访问数组   从...开始。

答案 4 :(得分:2)

您可以自由地将班级中的每个字段声明为公开字段。为什么这不被视为“良好实践”是因为在多开发人员的情况下,代码库必须随着时间的推移(以及在您离开后)可维护,其他人能够理解您的类(以及如何它们应该而且不应该被使用)。将字段设置为“私有”是强制指示此字段是类的工作内部且不应从外部修改的极好方法。这不是关于“模糊”,而是关于“保护”和“维护”(参见上面关于API和合同的帖子)。

当然,如果有足够的时间,一个“优秀的程序员”最终能够弄清楚你的代码的确切运作方式 - 但是为什么你不会在那个时候饶过他或她,而只是努力揭露“公众” “功能(API)和隐藏不应该触及的东西?

另一方面,纯粹为了您的利益,不实践正确的数据封装和API /公共接口规则将使您的同事厌恶您,并且很可能会在短时间内解雇您。您生成的代码(正确地)将被视为非常脆弱且无法维护。

答案 5 :(得分:2)

举一个例子说明为什么你可能想阻止其他程序员,甚至你自己直接使用变量。

class Car() {
    public int speed;
}

您或其他程序员可能只是“速度= -20”(可能是因为计算错误或其他功能没有按预期运行)。然后当你尝试使用你的速度时,你会得到奇怪的结果,并花时间和精力追踪问题。这是一个更好的解决方案:

class Car() {
    private int speed;

    public void setSpeed(int newSpeed) {
        if (newSpeed < 0)
            throw new Exception("Car speeds can't be negative!");
        speed = newSpeed;
    }

    public int getSpeed() {
        return speed;
    }
}

如果您的界面是按照您的意愿使用,您将立即知道。

你的问题表明你可能对公共和私人方法甚至有用的原因有点困惑,所以让我们退后一步。

您不会将“所有内容”声明为私有。当您不希望其他类使用它们时,您将事物声明为私有 - 它们完全供内部使用。当您使用类需要调用该方法或使用该变量时,您将事物声明为public。实际上,没有公共方法的课程就没用了! (这句话纯属谎言,但它适用于我们所谈论的内容。)

通过将您打算在课堂外使用的内容公开,其他一切都是私有的,您正在为使用您的课程的人创建一个界面 - 无论是您还是其他人。每一个班级都隐藏着沉重的举重。

用一句话说:“编程到接口,而不是实现。”当你写一个类时,第一个想法应该是“我如何打算让其他类使用我的类?”,而不是“我应该如何获得我想要的功能?”在我看来,这种区别是在进行命令式编程和面向对象编程时应该具有的思维模式之间的区别。

答案 6 :(得分:0)

很容易理解java中私有修饰符的需求,纯粹是面向对象的语言

考虑一下你有一辆非常好的跑车A!

  

你想要一个名为gasPumped的领域,也许还有其他领域可能会提高速度吗?

  

你想要一个名为increaseSpeed()的函数来访问所有这些字段吗?

当你得到这款车的新版本时,它将具有相同的increaseSpeed(),其中包含更多被操纵的字段!

汽车制造商希望您知道您可以

  

increaseSpeed()

但他真的不想让你知道里面的部分!

答案 7 :(得分:0)

我会说私有在Java中是私有的,因为:

  • 该机制继承自C ++(在C ++中,客户端可以访问所有字段/方法意味着将它们放在头文件中,这会给客户端带来重大而不适当的负担)
  • 它允许一些静态优化,否则这些优化是不可能的(例如,您可以内联私有方法调用 - 从编译类中有效地删除方法,同时仍然保持源代码的结构化。)

答案 8 :(得分:0)

  • 它简化了API,以保持依赖于实现的内容。
  • 良好的面向对象设计要求每个类都有自己的功能范围。因此,通过直接访问这些字段或依赖于实现的方法来防止他人违反这一点是一件好事。
  • 通过这种方式更容易维护类。例如,更改内部数据结构不会影响其他人直接访问字段时的情况。
  • 其他人不能搞砸对象的状态。