一道题理解Java父子类初始化顺序什么是CopyOnWrite容器

携程Java工程师的一道面试题
题目的来源是携程的一道面向对象选择题,原题为:
public class Base
{
    private String baseName = "base";
    public Base()
    {
        callName();
    }
 
    public void callName()
    {
        System. out. println(baseName);
    }
 
    static class Sub extends Base
    {
        private String baseName = "sub";
        public void callName()
        {
            System. out. println (baseName) ;
        }
    }
    public static void main(String[] args)
    {
        Base b = new Sub();
    }
}

求输出。

此题的输出应该null。
为了更好地理解Java中父类子类的初始化顺序,我对题目稍微做了一下修改。
Java父子类初始化顺序

先说结论,然后用具体的例子作为说明。
实例化一个子类   子类名 a = new 子类名();
1.父类静态初始化方法 static{ }
2.子类静态初始化方法 static{ }
3.父类字段初始化 ,如private String name ="base"
4.父类非静态初始化方法 {}
5.父类构造方法
6.子类字段初始化,如private String name="sub";
7.子类非静态初始化方法{}
8 子类构造方法



public class Base
{
    private String baseName = "base";
    static
    {
        System.out.println("Base静态初始化代码块");

    }
    {
        System.out.println("Base非静态初始化代码块");
        System.out.println("baseName:"+baseName);
    }

    public Base()
    {
        System.out.println("Base构造方法");
       callName();
    }

    public void callName()
    {
        System.out.println("baseName:" + baseName);
    }

    static class Sub extends Base
    {
        private String baseName = "sub";
        static
        {
            System.out.println("Sub静态初始化代码块");

        }
        {
            System.out.println("Sub非静态初始化代码块");
            System.out.println("baseName:"+baseName);
        }


        public Sub()
        {
            System.out.println("Sub构造方法");
           callName();
        }

        public void callName()
        {

            System.out.println("baseName:" + baseName);
        }
    }
    public static void main(String[] args)
    {
        Base b = new Sub();
    }
}


输出:

Base静态初始化代码块
Sub静态初始化代码块
Base非静态初始化代码块
baseName:base
Base构造方法
baseName:null
Sub非静态初始化代码块
baseName:sub
Sub构造方法
baseName:sub

有不理解的可以留言


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值