为了账号安全,请及时绑定邮箱和手机立即绑定

使用继承时如何进行强封装?

使用继承时如何进行强封装?

肥皂起泡泡 2022-10-12 09:46:55
我对此真的很陌生,所以如果这太愚蠢了,我很抱歉。在 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;  }}
查看完整描述

4 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

也许查看有关可见性的javadoc,但在您的情况下,protected 是正确的关键字,您也可以忽略可见性,然后默认为 package



查看完整回答
反对 回复 2022-10-12
?
Smart猫小萌

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除非您有充分的理由不这样做,否则请使用。”


查看完整回答
反对 回复 2022-10-12
?
慕森王

TA贡献1777条经验 获得超3个赞

对于我所读到的内容,要进行强大的封装,您通常将属性设置为私有,然后使用公共方法访问它们。

对于强大/适当的封装,您将属性设置为私有。句号。您不应该通过任何方法访问这些属性,而应该提供使用这些属性来实现某些业务逻辑的方法。

[...]它说只有公共/受保护的成员才会继承到子类[...]

一切都将被继承,只是对子类不可见。所以它将是对象的一部分,你不能直接访问它。

[使用公共/受保护的属性] 但是如果我这样做,我会破坏封装吗?

是的。当您使内部状态可用时,您几乎总是会破坏封装,无论是直接(使其成为私有以外的任何东西),还是使用“getter”或类似方法。


查看完整回答
反对 回复 2022-10-12
?
白板的微信

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);

}


查看完整回答
反对 回复 2022-10-12
  • 4 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信