java - 面向对象编程中的访问修饰符

标签 java c++ oop programming-languages computer-science

我不了解 OOP 中的访问修饰符。例如,为什么我们在 Java 实例变量中将实例变量设为私有(private),然后使用公共(public) getter 和 setter 方法来访问它们?我的意思是这背后的推理/逻辑是什么?

您仍然可以访问实例变量,但是既然可以公开变量,为什么还要使用 setter 和 getter 方法呢?

请原谅我的无知,因为我只是想了解为什么?

提前致谢。 ;-)

最佳答案

这称为数据或 information hiding .

基本上,您不希望用户(读作:其他程序员或您自己)窥探您的类的内部结构,因为这使得更改内容变得非常困难。

另一方面,接口(interface)和实现之间的清晰分离(理论上)使得在内部更改某些内容变得容易,而不会影响您的类的任何用户。

例如,假设我有一个带有 public String text 字段的 Button 控件。现在每个人都开始使用我的 Button,但我意识到只要文本发生变化,按钮实际上应该重新绘制在屏幕上。我运气不好,因为我的对象无法检测到 text 何时被分配。如果我将其设置为 private 并提供了一个 setText(),我就可以向该 setter 方法添加一个重绘调用。

作为另一个例子,假设我有一些类在其构造函数中打开一个文件并将其分配给一个public FileStream 文件。如果无法打开文件,构造函数将抛出异常。因此,该类中的其他方法可以假定该字段始终有效。但是,如果有人在我的类中四处寻找并将 file 设置为 null,我类中的所有方法都会突然开始崩溃。

关于java - 面向对象编程中的访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428355/

相关文章:

javascript - 如何在JS中保存 'this'变量?

java - 如何在 onReceive() 中关闭 Activity

java - 如何将通用参数传递给hadoop jar

c++ - CMake 库目标并不总是出现在 Visual Studio 2017 的启动项下拉列表中

c++ 异常,what() 可以为 NULL 吗?

c++ - 删除引用

javascript - 检索对象的所有实例中保存的值

java - 使用java检查以ftp位置中的名称开头的文件

java - 我是否必须为连接查询创建单独的 @Entity 类才能提取结果? Jpa存储库

java - "code against"或 "resolve against"是什么意思?