携程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
有不理解的可以留言