java 类加载-初始化顺序
代码:
package com.lczyfz.istep.modules.test.service;
class Root {
static
{
System. out .println( "Root的静态初始化块" );
}
{
System. out .println( "Root的普通初始化块" );
}
public Root(){
System. out .println( "Root的无参数构造器" );
}
}
class Mid extends Root {
static
{
System. out .println( "Mid的静态初始化块" );
}
{
System. out .println( "Mid的普通初始化块" );
}
public Mid(){
System. out .println( "Mid的无参数构造器" );
}
public Mid(String msg){
this ();
System. out .println( "Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid{
static {
System. out .println( "Leaf的静态初始化块" );
}
{
System. out .println( "Leaf的普通初始化块" );
}
public Leaf(){
super ( "疯狂java讲义" );
System. out .println( "执行Leaf的构造器" );
}
}
public class Test{
public static void main(String[] args){
new Leaf();
new Leaf();
}
}
答案:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数构造器
Mid的普通初始化块
Mid的无参数构造器
Mid的带参数构造器,其参数值:疯狂java讲义
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数构造器
Mid的普通初始化块
Mid的无参数构造器
Mid的带参数构造器,其参数值:疯狂java讲义
Leaf的普通初始化块
执行Leaf的构造器
============================================================
静态初始化块和声明静态Field时所指定的初始值都是该类的初始化代码,它们的执行顺序与源程序中的排列顺序相同。
代码:
package com.lczyfz.istep.modules.test.service;
/**
* Created by hpp on 2017/4/5.
*/
class Base{
static {
System. out .println( "Base static" );
}
public Base(){
System. out .println( "Base init" );
}
}
public class Test1 extends Base{
String m = "" ;
static String n ;
static {
System. out .println( "A static" );
}
public Test1(String mValue,String nValue){
m = mValue;
n = nValue;
}
public void print(){
System. out .println( m + " " + n );
}
public static void main(String[] args){
Test1 a1 = new Test1( "M1" , "N1" );
Test1 a2 = new Test1( "M2" , "N2" );
a1.print();
a2.print();
}
答案:
Base static
A static
Base init
Base init
M1 N2
M2 N2
public static void main(String[] args){
Test1 a1 = new Test1( "M1" , "N1" );
a1.print();
Test1 a2 = new Test1( "M2" , "N2" );
a2.print();
}
答案:
Base static
A static
Base init
M1 N1
Base init
M2 N2
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
