Java 构造方法的继承/构造方法的调用顺序(一)

我们知道,在java中,类的实例化由 内存分配 + 构造两步完成的如果这个类存在父类,那么它的构造过程其实是由其 父类.构造() + 子类.构造()共同完成的。由于java中,所有的类都是继承自Object,所以其实所有的类的实例化过程中都包含类它的父类的构造过程,编译器会隐式地为我们加上每个类的super(),除非某个父类无参构造函数不存在。

如下所示:成员赋值 这一步取决于类在定义时是否已对成员变量指定值。

内存分配-----> 构造(父类.成员赋值--父类.构造() + 子类.成员赋值--子类.构造()) 

在这个过程中,其实也是有一些规则,那就是子类的构造是编译器默认调用父类.构造(void)无参方法,如果父类中并没有定义无参构造方法,那么就会出现编译报错。如果父类中只有带参数构造方法(此情况下,父类没有定义无参构造方法),由于编译器并不会调用带参数构造方法,那么在子类的构造方法中,必须由我们显式调用父类的带参数构造方法,否则 父类.构造() + 子类.构造()的这个过程会无法完成,编译器会报错

那么有人会问到,类不是有默认的无参构造方法么?怎么会有你说的这种情况呢?
其实类只有两种情况存在无参构造方法:
1、在没有显式定义任何一个构造方法的时候,默认存在一个无参数构造方法,
2、在类中显式定义一个无参构造方法。

有一种情况会导致类没有无参构造方法:
那就是一个类中存在一个或者多个构造方法,并且这些构造方法都是有参数的

如果父类是一个抽象类,那么会产生怎么样一种情况呢?
我们来看一段代码,假如一个抽象类Money 存在private 成员amount,并且该抽象类没有定义无参数构造方法,另一个类USD继承自这个类;
父类Money :
这里解释一下,抽象类其实也是有构造方法的,只不过抽象类是不能被实例化,也就是说,抽象类的构造方法不能在对抽象类进行实例化的场合调用。在java中,抽象类的构造方法用于子类访问父类数据的初始化,一旦一个普通类继承了抽象类,便可以在这个子类的构造方法中调用其父抽象类的构造方法。

我们将在下面的代码中来介绍这样一种特殊情况。

public abstract class Money {
    private double amount = 0; //类在定义时已对成员变量指定值为0,那么构造过程会多一步父类.成员赋值
    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);
    }
}

在这个例子中,我们看到,子类USD的构造方法中必须显式地调用父抽象类的构造方法,这也说明继承了抽象类的子类的构造过程同样也是父类.构造() + 子类.构造()共同完成的。

最后,我们在这段示例代码中,来看一下private 成员的继承,
我们可以看到,子类USD继承来父类Money 的private amount成员,但是并不能直接访问该成员,
子类必须通过父类的public/protected方法来访问这个成员。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值