在Java中,对象是否封装数据以使得即使是同类的其他实例也无法访问该数据?只有使用关键字"private"时才可以吗?在Java中,什么是"访问器方法" - 例如getName()这样的方法?
谢谢
在Java中,对象是否封装数据以使得即使是同类的其他实例也无法访问该数据?只有使用关键字"private"时才可以吗?在Java中,什么是"访问器方法" - 例如getName()这样的方法?
谢谢
我不倾向于认为一个对象可以访问另一个对象,而是认为什么代码可以访问对象中的什么数据。
在Java(以及C#)中,类内部的代码可以访问同一类的任何对象的私有成员。然后你还有包/程序集访问和公共访问。
棘手的是受保护的访问权限,这是对子类中的代码的某种程度的访问权限 - 但这取决于目标对象:只有当目标对象是与代码位置相同类型或某个子类的实例时,才允许访问对象的受保护成员,即使它被父类暴露出来。因此,例如,假设你有:
class Parent
{
protected int x;
}
class Child1 extends Parent
class Child2 extends Parent
class Grandchild extends Child1
在Child1
代码内部,您只能访问已知(在编译时)为Child1
或Grandchild
实例的对象的Parent.x
。例如,您不能使用new Parent().x
或new Child2().x
。
不可以,私有字段甚至可以从其他实例(在同一类的方法中)访问。
然而,它们无法从子类访问,即使是在同一个实例内也不行。
您提供getter方法以允许“外部”代码访问类中的字段。由于您决定提供哪些getter、将其设置为多少可见,并如何实现它们,因此您可以对谁可以访问数据以及如何访问数据进行控制。
请注意,如果存在getName
,则实际上不需要name
字段:获取器的实现方式完全取决于获取器。
即使getter(或setter)只包装了一个私有字段,使用这些setter和getter(而不是允许直接访问字段)也是很好的风格。
getName() 应该返回名称(无论是字段还是其他“东西”)。
对象是否封装数据,以至于即使是同一类的其他实例也无法访问该数据?
当然可以,如果您没有使用静态成员。
从此链接中提取:
有时,您希望拥有对所有对象都通用的变量。这可以通过使用 static 修饰符来实现。在其声明中具有 static 修饰符的字段称为静态字段或类变量。