学习java,为什么我的私人空间是私有的?

学习java,为什么我的私人空间是私有的?,java,programming-languages,private,public,Java,Programming Languages,Private,Public,我正在学习java,来自python有很多东西我不完全理解java中存在的东西,首先是公共和私有声明。我的意思是,从一种没有真正可见的公私声明的语言,到一种一切都必须保密的语言,我理解它们所做的基本原则。我问他们为什么这样做。为什么有人会在意谁碰了这些私处?如果你是一个优秀的程序员,你知道哪些位应该插入代码,哪些位不应该插入代码,这应该不是什么问题。那为什么要保密呢?为什么要把事情隐藏起来,隐藏起来,让世界知道呢?为什么要开始呢 因为其他人不像你那样关心你的隐私。你决定什么是私人的,什么不是私人

我正在学习java,来自python有很多东西我不完全理解java中存在的东西,首先是公共和私有声明。我的意思是,从一种没有真正可见的公私声明的语言,到一种一切都必须保密的语言,我理解它们所做的基本原则。我问他们为什么这样做。为什么有人会在意谁碰了这些私处?如果你是一个优秀的程序员,你知道哪些位应该插入代码,哪些位不应该插入代码,这应该不是什么问题。那为什么要保密呢?为什么要把事情隐藏起来,隐藏起来,让世界知道呢?为什么要开始呢

因为其他人不像你那样关心你的隐私。你决定什么是私人的,什么不是私人的


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

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

考虑到你有一辆非常漂亮的跑车a

你想要一个叫做Gaspumpped的场地,或者其他一些可以提高速度的场地吗

是否希望有一个名为increaseSpeed()的函数来访问所有这些字段

也许当你得到这辆车的新版本时,它会有相同的increaseSpeed(),有更多的字段被操纵

汽车制造商想让你知道你可以

增加速度


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

这种隐藏数据成员的原理称为

从上述文章中:

使用数据封装的优势在于 类的实现发生了变化,但接口仍然保持不变 一样。例如,要创建可以包含整数的堆栈类, 设计者可以选择使用隐藏的数组来实现它 来自类的用户。然后,设计器编写push()和 pop()方法,该方法将整数放入数组并从 分别对阵列进行了优化。用户可以访问这些方法。 如果用户试图直接访问阵列,则 将导致编译时错误。现在,设计师应该决定 将堆栈的实现更改为链表,则数组可以 只需替换为链表和push()和pop()方法即可 重写,以便他们操纵链表而不是 数组。用户为操纵堆栈而编写的代码是 仍然有效,因为它未被授予对阵列的直接访问权限 首先

(下面是自以为是的回答。)

这是因为Java是一个专门为满足用户需求而设计的应用程序。Python,otoh,是一种语言,旨在帮助那些同意彼此公开对象的私有部分的人,相信其他程序员不会滥用提供给他们的未记录/未保证的功能。如果他们这样做了,任何东西都坏了,打破东西的人就可以保留碎片

Python确实有一些访问控制,比如隐藏/显示模块的某些部分,只是所有这些都是可选的,并且可以在人员这样做的风险下进行旁路


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

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

private int ryan; //its your responsibility to save private ryan
撇开所有的笑话不谈,私密对于封装是有用的。另外,私有构造函数不允许在工厂方法模式中使用子类和特性。具有私有构造函数的类只允许在此类中实例化对象(例如,可以通过静态公共方法来实现)


因此,正如您所看到的,private可能非常有用……

您可以自由地将类中的每个字段声明为public。之所以不认为这是“良好实践”,是因为在多开发人员的情况下,代码库必须随着时间的推移(以及在您离开后)进行维护,其他人能够理解您的类(以及它们应该如何使用和不应该如何使用)是很重要的。将字段设为“private”是一种很好的方法,可以强制指示该字段是类的内部工作,不应从外部修改。这不是关于“模糊”,而是关于“安全”和“维护”(参见上面关于API和合同的帖子)

当然,一个“优秀的程序员”在有足够的时间的情况下,最终能够弄清楚你的代码的确切工作原理——但是你为什么不腾出他或她那点时间,而只是努力公开“公共”功能(API)和隐藏不应该被触及的东西呢


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

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

class Car() {
    public int speed;
}
您或其他程序员可能只执行“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;
    }
}
class车(){
私人整数速度;
公共void设置速度(int newSpeed){
如果(新闻速度<0)
抛出新异常(“车速不能为负!”);
速度=新闻速度;
}
public int getSpeed(){
返回速度;
}