Java中的继承 一个示例(抽象类构造方法、构造方法继承、private成员继承)
在java中,假如一个类Money 存在private 成员amount,另一个类USD继承自这个类,那么 USD子类中与这个amount成员是一个什么样的关系呢?
我们知道,子类的构造,其实是由其 父类.构造() + 子类.构造()共同完成的,也就是子类的构造过程会调用父类的构造方法,然后调用子类的构造方法来补充子类独有的构造过程。
在这个过程中,其实也是有一些规则,那就是子类的构造是编译器默认调用了父类.构造(void)无参方法,如果父类中并没有定义无参构造方法,那么就会出现编译报错。如果父类中只有带参数构造方法,那么在子类的构造方法中,必须显示调用父类的带参数构造方法,否则 父类.构造() + 子类.构造()的这个过程会无法完成,编译器会报错
那么有人会问到,类不是有默认的无参构造方法么?怎么会有你说的这种情况呢?
其实类只有两种情况存在无参构造方法:
1、在没有显式定义任何一个构造方法的时候,默认存在一个无参数构造方法,
2、在类中显式定义一个无参构造方法。
有一种情况会导致类没有无参构造方法:
那就是一个类中存在一个或者多个构造方法,并且这些构造方法都是有参数的
但是如果父类是一个抽象类,那么会产生怎么样一种情况呢?
我们来看一段代码,父类Money :
这里解释一下,抽象类其实也是有构造方法的,只不过抽象类是不能被实例化,也就是说,抽象类的构造方法不能在对抽象类进行实例化的场合调用。在java中,抽象类的构造方法用于子类访问父类数据的初始化,一旦一个普通类继承了抽象类,便可以在这个子类的构造方法中调用其父抽象类的构造方法。
我们将在下面的代码中来介绍这样一种特殊情况。
public abstract class Money {
private double amount;
public Money(double amount){
this.amount = amount; //父类只有一个带参数方法,也就没有默认的无参数构造方法了
}
public void setAmount(double am){
this.amount = am;
}
public double getAmount(){
return this.amount;
}
public abstract String getCurrencyName();
}
子类USD:
class USD extends Money {
public USD()
{
super(4); //子类的构造方法必须显式调用父类的构造方法,否则编译器报错
//子类的构造方法调用了父类的构造方法,但是并不是实例化了一个父类对象,它只是子类实例化过程中的一部分
}
public double getAmount(){
return super.getAmount();
}
public String getCurrencyName(){
return "USD";
}
public void setCurrencyName(double x){
super.setAmount(x);
}
}
最后,我们在这段示例代码中,来看一下private 成员的继承,
我们可以看到,子类USD继承来父类Money 的private amount成员,但是并不能直接访问该成员,
子类必须通过父类的public/protected方法来访问这个成员。
上一篇: python 类的继承,类中的函数调用以及类输入数组
下一篇: amp学习