4 回答
TA贡献1911条经验 获得超7个赞
我打破了封装吗?
你没有破坏任何东西。受保护的成员对世界其他地方仍然不可见(不包括包中的类和子类)。
Modifier Class Package Subclass World
private N N N N
protected Y Y Y N
如果您需要直接控制受保护的字段并绕过可能会扭曲该访问的 getter/setter,那么受保护的字段绝对没问题。
另一方面,当您不经常使用该字段时,私有字段是有意义的:private String name;并且"Name is " + getName()是完全正确的,因为您不关心究竟会返回什么 - 任何代表名称的东西就足够了。
根据经验,“使用对特定成员有意义的最严格的访问级别。private除非您有充分的理由不这样做,否则请使用。”
TA贡献1777条经验 获得超3个赞
对于我所读到的内容,要进行强大的封装,您通常将属性设置为私有,然后使用公共方法访问它们。
对于强大/适当的封装,您将属性设置为私有。句号。您不应该通过任何方法访问这些属性,而应该提供使用这些属性来实现某些业务逻辑的方法。
[...]它说只有公共/受保护的成员才会继承到子类[...]
一切都将被继承,只是对子类不可见。所以它将是对象的一部分,你不能直接访问它。
[使用公共/受保护的属性] 但是如果我这样做,我会破坏封装吗?
是的。当您使内部状态可用时,您几乎总是会破坏封装,无论是直接(使其成为私有以外的任何东西),还是使用“getter”或类似方法。
TA贡献1883条经验 获得超3个赞
出于强封装的原因,将属性设置为私有并使用诸如 mutators 和 accessors 之类的公共方法访问它们是一种正确的方法。
但是当你有内在的时候,这是不行的吗?
是的,只有公共/受保护的成员可以继承给子类,私有类不能传递给子类。
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
我打破了封装吗?
并不真地。根据定义,封装是一个保护屏障,可以防止数据被该屏障之外的代码访问,并且一个类中的数据对其他类是隐藏的。使用受保护的成员进行继承允许子类访问数据。
但是封装的概念是对象内部的信息/数据是隐藏的,对象内部的属性或方法只能通过对象自身提供的接口获取。也就是说,对象内部的细节或逻辑是隐藏的,除非允许对象提供的方法/接口,否则其他对象无法理解和改变对象的内部细节。
说白了,我们只需要了解对象的外部,不需要了解内部结构。例如,我们可以通过 getDescription() 获取 Employee 信息,但我们不需要知道如何获取信息。因此,这似乎是封装的一种应用。
public void getDescription(){
return "Name is " + getName() + " and salary is " + this.salary;
} // void method can not return a value, modified to the following code
public void getDescription(){
System.out.println( "Name is " + getName() + " and salary is " + this.salary);
}
添加回答
举报