Java 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?
在爪哇 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?仅当使用关键字“private”时?什么是Java中的“访问器方法”,比如getName()Java 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?,java,encapsulation,conceptual,Java,Encapsulation,Conceptual,在爪哇 对象是否封装了数据,以至于同一类的其他实例都无法访问数据?仅当使用关键字“private”时?什么是Java中的“访问器方法”,比如getName() 谢谢否,即使从其他实例(在同一类的方法中)也可以访问私有字段 但是,不能从子类访问它们,甚至不能在同一实例中访问 您提供getter方法来允许“外部”代码访问类中的字段。因为这取决于您提供了什么getter、它们的可视性以及它们的实现方式,所以您可以对谁可以访问数据以及如何访问数据进行大量控制 请注意,如果存在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访问这些字段。谁在乎呢?(另外,安全管理器不需要定制。)好的,是的。这是尽可能避免反思的原因之一。