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