Java构造器内部的多态

多态, 也称作动态绑定,后期绑定或运行时绑定

构造器内部多态方法

一般的情况下多态并不会给我们带来很大的困扰, 但下面的例子例外

public class Demo3Test {

    public static void main(String[] args){
        Son son = new Son();
    }
}


class Parent{
    int value = -1;

    void method(){
        System.out.println("Parent.method()");
    }

    Parent(){
        System.out.println("Parent() before method()");
        method();
        System.out.println("Parent() after method()");
    }
}

class Son extends Parent{
    int value = 1;

    void method(){
        System.out.println("Son.method(), value = "+value);
    }

    Son(){
        System.out.println("Son.Son(), value = "+value);
    }
}

输出结果:

Parent() before method()
Son.method(), value = 0
Parent() after method()
Son.Son(), value = 1

Son 类继承了 Parent 类, 在 Parent 类的构造器中我们调用了 method 方法, 而这个方法在子类被重载了, 根据 Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定 故我们在 new Son() 时会执行子类重载的方法. 但这里有个问题, 为什么输出的 value=0 ,弄懂这个问题必须得知道 初始化的实际过程

初始化的实际过程

  1. 在其他任何事物发生之前, 讲分配给对象的存储空间初始化为二进制的零
  2. 调用基类构造器, 如上基类构造器中调用了被覆盖后的 method 方法,由于步骤1的缘故, 此时 value 的值为0
  3. 按照声明的顺序调用成员的初始化方法
  4. 调用导出类(子类)的构造器主体

实际上, 基类的 value 和导出类的 value 是两个不同的 , 若要访问基类的同名 , 使用 super.value

总结

明白了初始化的过程后上面的输出就很好理解了, 虽然实际中基本不可能有这种代码, 但我们应该了解以免被其困惑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值