Java 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?

Java 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?,java,encapsulation,conceptual,Java,Encapsulation,Conceptual,在爪哇 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?仅当使用关键字“private”时?什么是Java中的“访问器方法”,比如getName() 谢谢否,即使从其他实例(在同一类的方法中)也可以访问私有字段 但是,不能从子类访问它们,甚至不能在同一实例中访问 您提供getter方法来允许“外部”代码访问类中的字段。因为这取决于您提供了什么getter、它们的可视性以及它们的实现方式,所以您可以对谁可以访问数据以及如何访问数据进行大量控制 请注意,如果存在getName,则实际上不需

在爪哇

对象是否封装了数据,以至于同一类的其他实例都无法访问数据?仅当使用关键字“private”时?什么是Java中的“访问器方法”,比如getName()


谢谢

否,即使从其他实例(在同一类的方法中)也可以访问私有字段

但是,不能从子类访问它们,甚至不能在同一实例中访问

您提供getter方法来允许“外部”代码访问类中的字段。因为这取决于您提供了什么getter、它们的可视性以及它们的实现方式,所以您可以对谁可以访问数据以及如何访问数据进行大量控制

请注意,如果存在
getName
,则实际上不需要
name
字段:这完全取决于数据来源的getter的实现


即使getter(或setter)只是包装了一个私有字段,拥有这些setter和getter(与允许直接访问字段相反)也是一种很好的风格。

getName()应该返回名称(无论是哪个字段还是其他“东西”)。

我不倾向于将其视为一个对象可以访问另一个对象,而是什么代码可以访问对象中的什么数据

在Java(和C#,顺便说一句)中,类中的代码可以访问同一类的任何对象的私有成员。然后就有了包/程序集访问和公共访问

棘手的是受保护的访问,这是一种对子类中代码的访问——但这取决于目标对象:只有当对象是与代码位置相同类型的实例或某个子类时,才允许访问对象的受保护成员,即使它是由父类公开的。例如,假设您有:

class Parent
{
    protected int x;
}

class Child1 extends Parent
class Child2 extends Parent
class Grandchild extends Child1

然后,在
Child1
代码中,您只能访问
Parent.x
对象,这些对象(在编译时)已知是
Child1
孙子的实例。例如,您不能使用
newparent().x
newchild2().x

即使字段/方法是“私有”的,也可以通过反射来访问/调用它,除非您安装了不允许这样做的自定义安全管理器

封装的思想是允许不同单元的实现自由变化。虽然我们谈论对象,但对于封装来说,我们实际上是指一个代码单元。在基于类的语言中,代码单位通常是[outer]类

在同一个类中,如果没有访问权限,二进制操作(如equals)也会变得愚蠢。所以private是指对[outer]类私有,而不是对同一实例中的同一类私有

访问器方法通常表示除简单值对象(仅限getter)之外的任何对象的设计都不好。对象应该有行为,而不仅仅是一个愚蠢的数据集合。使用getter将外部的代码移动到对象上有意义的方法。切记,99%的时间getter只返回一个字段值。如果要添加getter和setter,则将字段设置为私有相对没有什么价值

Java中的“访问器方法”是什么- 像getName()这样的方法

是-
getFoo()
setFoo()
是名为
foo
的“属性”的访问器方法-这是规范的一部分。与公共字段相比,这些字段更受欢迎的原因是,它们只允许您使用getter(使属性为只读)、执行其他簿记(如计算派生字段)和验证设置值(例如,当值不可接受时抛出)

整个过程最初打算与GUI工具一起使用,这些工具允许您以图形方式配置和组合JavaBeans,以便“构建应用程序”。这在很大程度上是一个白日梦,但是JavaBeans和属性的概念对于常规编码非常有用,并且得到了广泛的传播

许多人误解了这一概念,认为“封装”只意味着为私人财产而不是让公众公开写定位器和吸气剂,然后理所当然地认为这是白痴。封装意味着除了以严格控制的方式外,根本不公开类的内部工作。在良好的OO设计中,一个类中不应该有太多的get方法和很少的set方法。

对象是否封装了数据,以便同一类的其他实例都不能访问数据

当然,如果您不使用静态成员

摘录自:


有时,您希望拥有对所有对象通用的变量。这是通过“静态”修改器完成的。声明中包含静态修饰符的字段称为静态字段或类变量

,它应该返回名称。无论它是保存在名为name的字段中,还是从其他对象等派生而来,都是一个实现细节。您还可以通过JNI访问这些字段。谁在乎呢?(另外,安全管理器不需要定制。)好的,是的。这是尽可能避免反思的原因之一。