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