Java中继承的正确用法及私有属性问题技术求助
Java继承用法与私有属性处理指南
针对你给出的Kunde父类,我来一步步解释继承的正确用法,以及私有属性相关的常见问题解法:
一、Java继承的基础用法
要创建Kunde的子类,你需要用extends关键字,同时注意几个核心点:
1. 必须显式调用父类构造方法
你的Kunde类只定义了带参构造函数,没有无参构造,所以子类必须通过super()显式调用父类的带参构造,否则编译会报错。比如我们创建一个PremiumKunde子类:
public class PremiumKunde extends Kunde { private double rabatt; // 子类独有的属性 // 子类构造器,通过super()传递参数给父类构造 public PremiumKunde(String name, String adresse, int nummer, double rabatt) { super(name, adresse, nummer); // 初始化父类的name、adresse、nummer this.rabatt = rabatt; } }
调用super(name, adresse, nummer)后,父类会自动把marge设为2,完成父类属性的初始化。
2. 重写父类方法(按需)
如果子类需要自定义print()方法的输出,可以重写父类方法,还能通过super.print()复用父类的实现,避免重复代码:
@Override public void print() { super.print(); // 先打印父类的客户信息 System.out.println("Rabatt: " + rabatt + "%"); // 再添加子类独有的折扣信息 }
二、私有属性的访问问题
父类中的name、adresse、marge、nummer都是private修饰的,子类不能直接访问这些属性——这是Java封装性的要求。如果子类需要操作这些属性,有几种合理的解决方案:
1. 父类提供getter/setter方法
这是最推荐的方式,既能保证封装性,又能让子类间接操作属性。比如给marge添加getter和setter:
// 在Kunde类中添加 public double getMarge() { return marge; } public void setMarge(double marge) { // 可以在这里加合法性校验,比如marge不能为负数 if (marge > 0) { this.marge = marge; } }
之后子类就可以通过getMarge()获取值,用setMarge()修改值了。
2. 谨慎使用protected修饰符
如果确实需要子类直接访问属性,可以把private改成protected——这样子类和同包下的类都能访问,但会降低封装性,只在必要时使用:
// 修改Kunde类的属性修饰符 protected double marge;
3. 通过父类的业务方法间接操作
比如父类提供一个调整利润率的方法,子类调用这个方法即可,父类依然能控制属性的修改逻辑:
// 在Kunde类中添加 public void erhoeheMarge(double betrag) { if (betrag > 0) { this.marge += betrag; } }
完整示例代码
把上面的内容整合起来,完整的子类代码如下:
public class PremiumKunde extends Kunde { private double rabatt; public PremiumKunde(String name, String adresse, int nummer, double rabatt) { super(name, adresse, nummer); this.rabatt = rabatt; } @Override public void print() { super.print(); System.out.println("Rabatt: " + rabatt + "%"); } // 子类通过父类的setter修改私有属性 public void setPremiumMarge(double neueMarge) { super.setMarge(neueMarge); } }
这样你就能正确实现继承,同时合理处理父类私有属性的访问问题啦。
内容的提问来源于stack exchange,提问作者japorto100
相关产品推荐
相关产品推荐

