Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getter/setter在封装中扮演什么角色?_Java_Oop - Fatal编程技术网

Java getter/setter在封装中扮演什么角色?

Java getter/setter在封装中扮演什么角色?,java,oop,Java,Oop,据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用同一类的方法进行访问。这样他们就不能向外人展示你的个人资料。这是真的 private double amount; public void add(double value) { return this.amount + value; } 在这里,您的amount变量不会与使用private的外部人员共享,他们也不知道您使用的变量名称 但在类似的情况下,我们也提供了访问它们的getter/setter,那么封装如何能够从外部

据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用同一类的方法进行访问。这样他们就不能向外人展示你的个人资料。这是真的

private double amount;

public void add(double value) {
    return this.amount + value;
}
在这里,您的amount变量不会与使用private的外部人员共享,他们也不知道您使用的变量名称

但在类似的情况下,我们也提供了访问它们的getter/setter,那么封装如何能够从外部获得安全性呢?

public void setAmount(double value) {
    this.amount = value;
}

public double getAmount() {
    return this.amount;
}
这意味着getter或setter方法很可能具有相同的模式和局外人,他们对此有基本的了解。所以我想,在做了一些尝试之后,他能够使用getter获取或使用setter进行更改。在这种情况下,直接定义amount public或提供getter将变得相同


有人能解释一下吗?

想象一下,你有一个包含一百万行代码的程序,包括你已经提供的代码。除非你的财产是公共的

现在,想象一下,在代码中,您在第600行设置的金额等于300.00 然后在第4547行再次将其设置为500.50

然后在第585676行中再做一次

然后你运行你的程序,你会遇到错误。您不知道此错误来自何处,因为它都是有效代码。然后,您意识到一定是amount出了问题,但由于您只是直接访问amount属性,所以您在调试该属性时遇到了麻烦

然后,想象一下,你创建了一堆独立的类,所有这些类都在访问amount属性并对其进行更改。所以你永远无法得到你想要的数量,你也不知道它在哪里变化

最后,假设您决定在您的金额中添加14%的销售税,因此每个金额都是x*0.14。您可以在类中添加逻辑,但由于您将属性设置为public,因此该逻辑不会在您直接将值指定给amount的所有实例中强制执行

基本上:二传手和接球手是安全措施。您不希望其他类能够更改其他类中的属性。我们使用的示例很简单,但假设您有一个具有非常复杂属性的类,并且由于没有使用setter而意外更改了这些属性的逻辑


同样的道理也适用于getter。想象一下相反的情况,你改变了类的内部逻辑,但是你通过其他不是getter的方法得到了它的属性值,现在,您的所有代码都被破坏了,因为访问该属性的其他类没有意识到逻辑中的更改。

假设您有一个包含一百万行代码的程序,包括您已经提供的代码。除非你的财产是公共的

现在,想象一下,在代码中,您在第600行设置的金额等于300.00 然后在第4547行再次将其设置为500.50

然后在第585676行中再做一次

然后你运行你的程序,你会遇到错误。您不知道此错误来自何处,因为它都是有效代码。然后,您意识到一定是amount出了问题,但由于您只是直接访问amount属性,所以您在调试该属性时遇到了麻烦

然后,想象一下,你创建了一堆独立的类,所有这些类都在访问amount属性并对其进行更改。所以你永远无法得到你想要的数量,你也不知道它在哪里变化

最后,假设您决定在您的金额中添加14%的销售税,因此每个金额都是x*0.14。您可以在类中添加逻辑,但由于您将属性设置为public,因此该逻辑不会在您直接将值指定给amount的所有实例中强制执行

基本上:二传手和接球手是安全措施。您不希望其他类能够更改其他类中的属性。我们使用的示例很简单,但假设您有一个具有非常复杂属性的类,并且由于没有使用setter而意外更改了这些属性的逻辑


同样的道理也适用于getter。想象一下相反的情况,您更改了类的内部逻辑,但您是通过非getter的其他方式获取其属性值的,现在所有代码都被破坏了,因为访问该属性的其他类没有意识到逻辑的更改。

,这个问题基本上等同于问“当人们也可以使用门进入时,为什么我们有墙?”。你,程序员,控制着门,你选择了谁和怎么进来。如果你允许你的例子中的一切,那么这取决于你,但是如果你没有墙,那么你就没有什么可以检查/验证/阻止的。好吧,这个问题基本上等同于问“当人们也可以使用门进入时,为什么我们有墙”。你,程序员,控制着门,你选择了谁和怎么进来。当你允许你的例子中的一切时,那就取决于你了,但是当你没有墙的时候,你就没有什么可以检查/验证/阻止的了。我想你的意思是x*1.14?嗯?14%的小数表示为0.14。百分比的小数表示形式必须加起来等于1。1.14不是14%,是114%,我想你是说x*1.14?嗯?14%的小数表示为0.14。百分比的小数表示形式必须加起来等于1。1.14不是14%,而是114%。