变量初始化会在类加载阶段完成,这个时候主要执行<clinit>方法,这个方法是类构造器,只负责静态变量赋值和静态代码块执行,而<init>方法是实例构造器,主要负责实例变量初始化和构造方法的执行。
看下面代码:
public class TestDemo3
{
public static void main(String[] args)
{
Base base=new sssu();
}
}
class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
}
class sssu extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
类加载过程中,执行<clinit>方法,这时候没有静态变量和静态代码块,所以不执行,那么接下来执行<init>方法,那么,<init>方法怎么执行的,先执行父类<init>方法,初始化变量,执行构造函数,那么具体到这个类就是先执行
Base的<init>方法,Base执行object的<init>方法,为空,然后初始化变量,将baseName设置为base,执行构造方法,就是调用父类构造方法,发现执行callName(()方法,注意,这里是在子类中调用的,此时,baseName还没有被赋值,因为子类没有执行<init>方法呢,所以,为null