我真的很陌生,所以如果这太愚蠢我很抱歉。在Java中使用继承时,我很难决定使用哪种可见性。
对于我所阅读的内容,要进行强大的封装,通常会将属性设置为私有,并使用公共方法访问它们。
但是当你有内在的时候,这是不行的?当我阅读Oracle文档时,它表示只有公共/受保护成员才会继承到子类。但如果我这样做,我是否打破了封装?
同时,我在我的超类上使用私有属性,并且我使用公共方法在我的子类上访问这些字段。例如:
abstract public class Person{
private String name;
Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
public class Employee extends Person {
private int salary;
Employee(String name, int salary){
super(name);
this.salary = salary;
}
public void getDescription(){
return "Name is " + getName() + " and salary is " + this.salary;
}
}
也许在可见性上查看javadoc,但在您的情况下受保护是正确的关键字,您也可以省略可见性然后它默认为包
我打破了封装吗?
你没有破坏任何东西。受保护的成员对于世界其他地方仍然不可见(不包括包中的类和子类)。
Modifier Class Package Subclass World
private N N N N
protected Y Y Y N
如果您需要对其进行直接控制并绕过可能使该访问失真的getter / setter,则受保护的字段绝对可以。
另一方面,当你不经常使用该字段时,私有字段是有意义的:private String name;
和"Name is " + getName()
是完全正确的,因为你不关心究竟将返回什么 - 任何代表名称的东西就足够了。
根据经验,“使用对特定成员有意义的最严格的访问级别。使用private
,除非你有充分的理由不这样做。”
对于我所阅读的内容,要进行强大的封装,通常会将属性设置为私有,并使用公共方法访问它们。
要进行强大/适当的封装,请将属性设置为私有。完全停止。您不应该通过任何方法访问这些属性,您应该提供使用这些属性来实现业务逻辑的某些部分的方法。
[...]它说只有公众/受保护成员才会继承子类[...]
一切都将被继承,它只对子类不可见。所以它将成为对象的一部分,你无法直接访问它。
[使用公共/受保护的属性]但是如果我这样做,我是否打破了封装?
是。当你使内部状态可用时,你几乎总是打破封装,直接(使其成为私有),或者使用“getter”或类似的方法。