class Bird
{
{System.out.println("b1");}
public Bird(){System.out.println("b2");}
}
class Raptor extends Bird
{
static {System.out.println("r1");}
public Raptor(){System.out.println("r2");}
{System.out.println("r3");}
static {System.out.println("r4");}
}class Hawk extends Raptor
{
public static void main(String[] args)
{
System.out.println("h1");
new Hawk();
System.out.println("h2");
}
}
这个输出有点意外。
不是说静态初始块要在父类构造函数运行后才执行吗?h1应该在最先才对吧,请高手答疑。多谢。
{
{System.out.println("b1");}
public Bird(){System.out.println("b2");}
}
class Raptor extends Bird
{
static {System.out.println("r1");}
public Raptor(){System.out.println("r2");}
{System.out.println("r3");}
static {System.out.println("r4");}
}class Hawk extends Raptor
{
public static void main(String[] args)
{
System.out.println("h1");
new Hawk();
System.out.println("h2");
}
}
这个输出有点意外。
不是说静态初始块要在父类构造函数运行后才执行吗?h1应该在最先才对吧,请高手答疑。多谢。
public class StaticTest{
public static void main(String args[]){
System.out.println("main Method1");
Base b=new Sub();
System.out.println("main Method2");
}
}
class Base{
public Base(){
System.out.println("父类构造方法");
}
static{
System.out.println("父类静态方法");
}
{
System.out.println("父类实例化方法");
}
}
class Sub extends Base {
public Sub(){
System.out.println("子类构造方法");
}
static{
System.out.println("子类静态方法");
}
{
System.out.println("子类实例化方法");
}
}
(1)主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。
(2)主类静态成员的初始化。
(3)主类的超类由高到低进行默认构造方法的调用。注意,在调用每一个超类的默认构造方法前,先进行对此超类进行非静态对象的初始化。
(4)主类非静态成员的初始化。
(5)调用主类的构造方法。
http://www.mowker.com/list/
class Bird
{
static
{
System.out.println("祖类的静态成员初始化");
}
{
System.out.println("祖类的非静态成员初始化");
}
public Bird()
{
System.out.println("祖类的构造函数调用");
}
}
class Raptor extends Bird
{
static
{
System.out.println("父类的静态成员1初始化");
}
public Raptor()
{
System.out.println("父类的构造函数调用");
}
{
System.out.println("父类的非静态成员初始化");
}
static
{
System.out.println("父类的静态成员2初始化");
}
}class Hawk extends Raptor
{
static
{
System.out.println("子类的静态成员初始化");
}
{
System.out.println("子类的非静态成员初始化");
}
public Hawk()
{
System.out.println("子类的构造函数调用");
}
public static void main(String[] args)
{
System.out.println("main函数开始运行");
new Hawk();
System.out.println("main函数结束运行");
}
}运行结果:祖类的静态成员初始化
父类的静态成员1初始化
父类的静态成员2初始化
子类的静态成员初始化
main函数开始运行
祖类的非静态成员初始化
祖类的构造函数调用
父类的非静态成员初始化
父类的构造函数调用
子类的非静态成员初始化
子类的构造函数调用
main函数结束运行