对象是否封装数据,以便即使是同一类的其他实例也无法访问数据?
在Java中
对象是否封装数据,以便即使是同一类的其他实例也无法访问数据? 只有在使用关键字“private”时? 什么是Java中的“访问器方法” – 像getName()这样的方法?
谢谢
我不倾向于用一个访问另一个对象的对象来考虑它,而是用什么代码可以访问对象中的哪些数据。
在Java(和C#,btw)中,类中的代码可以访问同一类的任何对象的私有成员。 然后你就有了包/程序集访问权限和公共访问权限。
棘手的是受保护的访问,它是对子类中代码的访问 – 但它取决于目标对象:如果它是与对象的位置相同的实例,则只允许访问对象的受保护成员。代码或某个子类 – 即使它是由父类公开的。 例如,假设你有:
class Parent { protected int x; } class Child1 extends Parent class Child2 extends Parent class Grandchild extends Child1
然后在Parent.x
代码中,只能为已知(在编译时)作为Parent.x
的对象访问Parent.x
. 例如,你不能使用new Parent().x
或new Child2().x
。
不,甚至可以从其他实例(在同一类的方法中)访问私有字段。
但是,不能从子类访问它们,即使在同一实例中也是如此。
您提供了getter方法,允许“外部”代码访问您class级中的字段。 由于您可以获得所提供的getter,使用它们的可见性以及实现方式,因此您可以对谁可以访问数据以及如何访问数据进行大量控制。
请注意,如果存在getName
,则实际上不需要是name
字段:它完全取决于数据来自的getter的实现。
即使getter(或setter)只包含一个私有字段,拥有这些setter和getter(而不是允许直接字段访问)也是一种很好的方式。
getName()应该返回名称(wheather字段或其他“东西”)。
即使字段/方法是“私有”,仍然可以通过reflection访问/调用它,除非您安装了不允许这样做的自定义安全管理器。
封装的想法是允许不同单元的实现自由变化。 虽然我们谈论对象,但对于封装,我们实际上是指一个代码单元。 在基于类的语言中,代码单元通常是[外部]类。
如果在同一个类中没有访问权限,二进制操作(例如equals)也会变得愚蠢。 私有对[outer]类是私有的,而不是同一个实例中同一个类的私有。
访问器方法通常表示除了简单的值对象(仅限getter)之外的任何设计上的错误设计。 对象应该有行为,而不仅仅是一个愚蠢的数据集合。 使用getter将外部代码移动到对象上有意义的方法。 亲自动手,99%的吸气剂只返回一个场值。 如果要添加getter和setter,将字段设为私有的价值相对较小。
对象是否封装数据,以便即使是同一类的其他实例也无法访问数据?
当然,如果你没有使用静态成员。
摘自此链接 :
有时,您希望拥有所有对象共有的变量。 这是通过静态修改器完成的。 在声明中具有static修饰符的字段称为静态字段或类变量
什么是Java中的“访问器方法” – 像getName()这样的方法?
是 – getFoo()
和setFoo()
是名为foo
的“属性”的访问器方法 – 这是JavaBeans规范的一部分。 这些优先于公共字段的原因是它们允许您只有一个getter(使属性只读),执行额外的簿记(如计算派生字段)和validationset值(当值为throw时抛出例如PropertyVetoException )不能接受的)。
整个过程最初旨在与GUI工具一起使用,这些工具允许您以图形方式配置和组合JavaBeans以“构建应用程序”。 事实certificate,这主要是一个梦想,但JavaBeans和属性的概念已经certificate对常规编码有用并且变得广泛传播。
许多人误解了这个概念,并认为“封装”只是意味着为私有财产编写制定者和吸气剂而不是将其公之于众 – 然后理所当然地认为这是愚蠢的。 封装意味着除了以严格控制的方式外,根本不暴露类的内部工作。 在良好的面向对象设计中,你不应该在类中使用太多的get方法和很少的set方法。