面向对象的加载

Base.java
public class Base {
    private String baseName="base";
    private static String testname="父类静态字段";
    public Base(){
        this.callName();
            }
    public void callName(){
        System.out.println("父类构造器"+baseName);
    }
}

Sub.java
public class Sub extends Base{
    private String baseName="Sub";
    @Override
    public void callName() {
        System.out.println(baseName);
    }

    public static void main(String[] args) {
        Base player=new Sub();
    }
}

上面这个是构建个子类对象,用无参方法构建子类对象,会先构建父类的无参构造器,这里父类的无参构造器里面调用了一个callName方法,但因为子类重写了这个方法,导致转入子类的callName方法中 最后输出Null,
看下调试过程
new 一个子类
在这里插入图片描述
会先找继承的父类
在这里插入图片描述
调用父类的构造器
在这里插入图片描述
看一下他的实例字段

在这里插入图片描述
进入到父类构造器,找到方法,可以看到,我们是新建子类对象,他直接先去找你父类的构造器,没有访问子类的实例字段,所以baseName其实是null
在这里插入图片描述
因为你是重写了这个方法,而且new 的是子类对象 会优先调用子类重写的方法,那这里通过这个callName直接就进入了子类的callName里面,baseName就是Null
在这里插入图片描述
会发现此时baseName是null,然后输出了一个Null
在这里插入图片描述
在这里插入图片描述
父类的构造方法结束 然后才访问子类的实例字段,那这时候已经晚了,输出已经是null了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
over
那如果不重写这个callName方法,那就会直接访问父类的callName()这个方法,输出在这里插入图片描述
在这里插入图片描述
如果加入顺序,有初始化构造块的话,按如下排列
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值