new 对象时,其静态成员变量、非静态成员、代码块、构建器的执行顺序
2013-04-22 15:12
381 查看
1、示例代码:
class Dmeo
{
int a=f1();
static int b=f2();
Demo()
{
System.out.println("构建器开始执行!");
}
{
System.out.println("非静态代码块执行!");
}
static {
System.out.println("静态代码块执行!");
}
int f1()
{
System.out.println("非静态变量开始初始化");
return 1;
}
int f2()
{
System.out.println("静态变量开始初始化");
return 2;
}
}
Demo d=new Demo();
结果:
静态变量开始初始化
静态代码块开始初始化
非静态变量开始初始化
非静态代码块开始初始化
构建器开始执行
注意:当同为静态或非静态时,那么执行的顺序就是它们在代码上出现的位置的先后。
2、当一个子类继承一个父类时,那么执行顺序又是如何呢。
class A11
{
A11()
{
System.out.println("A constructor");
}
{
System.out.println("A的非静态代码块");//非静态代码块与非静态成员变量的初始化的顺序与它们自身
//在代码中的位置顺序有关
}
static
{
System.out.println("A staic area");
}
int a=f1();
static int aa=methodA();//静态代码块与静态成员变量的初始化的顺序与它们自身
//在代码中的位置顺序有关
public static int methodA()
{
System.out.println("A 静态成员初始化!");
return 1;
}
public int f1()
{
System.out.println("A 对成员变量的初始化");
return 1;
}
}
class B11 extends A11
{
B11()
{
System.out.println("B constructor");
}
{
System.out.println("B的非静态代码块");
}
static
{
System.out.println("B staic area");
}
int b=f2();
static int bb=methodB();
public static int methodB()
{
System.out.println("B 静态成员初始化!");
return 1;
}
public int f2()
{
System.out.println("B 对成员变量的初始化");
return 2;
}
}
class C11 extends B11
{
C11()
{
System.out.println("C constructor");
}
{
System.out.println("C的非静态代码块");
}
static
{
System.out.println("C staic area");
}
int c=f3();
static int cc=methodC();
public static int methodC()
{
System.out.println("C 静态成员初始化!");
return 1;
}
public int f3()
{
System.out.println("C对成员变量的初始化");
return 3;
}
}
class InitializeSequenceDmeo
{
public static void main(String[] args)
{
C11 c=new C11();
}
}
结果:
A staic area
A 静态成员初始化!
B staic area
B 静态成员初始化!
C staic area
C 静态成员初始化!
A的非静态代码块
A 对成员变量的初始化
A constructor
B的非静态代码块
B 对成员变量的初始化
B constructor
C的非静态代码块
C对成员变量的初始化
C constructor
3、扩展
(1) . 类加载先执行的是静态部分(静态成员和静态代码块),再然后是在创建对象实例的时候进行非静态的成员变量还有非静态代码块的执行,再最后才是构造函数。
静态代码块与静态方法的区别:静态代码块是在类加载时自动执行的,而静态方法只有在被调用时才会被执行。
(2)
a.载入对象的.class文件,并在这时对static 进行初始化。
b.然后在堆在开辟足够多的内存空间
c.对所有的基本类型设为默认值
d.将所有的字断(类成员变量)进行初始化
e.执行构建器
class Dmeo
{
int a=f1();
static int b=f2();
Demo()
{
System.out.println("构建器开始执行!");
}
{
System.out.println("非静态代码块执行!");
}
static {
System.out.println("静态代码块执行!");
}
int f1()
{
System.out.println("非静态变量开始初始化");
return 1;
}
int f2()
{
System.out.println("静态变量开始初始化");
return 2;
}
}
Demo d=new Demo();
结果:
静态变量开始初始化
静态代码块开始初始化
非静态变量开始初始化
非静态代码块开始初始化
构建器开始执行
注意:当同为静态或非静态时,那么执行的顺序就是它们在代码上出现的位置的先后。
2、当一个子类继承一个父类时,那么执行顺序又是如何呢。
class A11
{
A11()
{
System.out.println("A constructor");
}
{
System.out.println("A的非静态代码块");//非静态代码块与非静态成员变量的初始化的顺序与它们自身
//在代码中的位置顺序有关
}
static
{
System.out.println("A staic area");
}
int a=f1();
static int aa=methodA();//静态代码块与静态成员变量的初始化的顺序与它们自身
//在代码中的位置顺序有关
public static int methodA()
{
System.out.println("A 静态成员初始化!");
return 1;
}
public int f1()
{
System.out.println("A 对成员变量的初始化");
return 1;
}
}
class B11 extends A11
{
B11()
{
System.out.println("B constructor");
}
{
System.out.println("B的非静态代码块");
}
static
{
System.out.println("B staic area");
}
int b=f2();
static int bb=methodB();
public static int methodB()
{
System.out.println("B 静态成员初始化!");
return 1;
}
public int f2()
{
System.out.println("B 对成员变量的初始化");
return 2;
}
}
class C11 extends B11
{
C11()
{
System.out.println("C constructor");
}
{
System.out.println("C的非静态代码块");
}
static
{
System.out.println("C staic area");
}
int c=f3();
static int cc=methodC();
public static int methodC()
{
System.out.println("C 静态成员初始化!");
return 1;
}
public int f3()
{
System.out.println("C对成员变量的初始化");
return 3;
}
}
class InitializeSequenceDmeo
{
public static void main(String[] args)
{
C11 c=new C11();
}
}
结果:
A staic area
A 静态成员初始化!
B staic area
B 静态成员初始化!
C staic area
C 静态成员初始化!
A的非静态代码块
A 对成员变量的初始化
A constructor
B的非静态代码块
B 对成员变量的初始化
B constructor
C的非静态代码块
C对成员变量的初始化
C constructor
3、扩展
(1) . 类加载先执行的是静态部分(静态成员和静态代码块),再然后是在创建对象实例的时候进行非静态的成员变量还有非静态代码块的执行,再最后才是构造函数。
静态代码块与静态方法的区别:静态代码块是在类加载时自动执行的,而静态方法只有在被调用时才会被执行。
(2)
a.载入对象的.class文件,并在这时对static 进行初始化。
b.然后在堆在开辟足够多的内存空间
c.对所有的基本类型设为默认值
d.将所有的字断(类成员变量)进行初始化
e.执行构建器
相关文章推荐
- Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
- 子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
- 执行顺序:(优先级从高到低)静态代码块>mian方法>构造代码块>构造方法。 其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
- 静态成员变量静态代码块和构造方法的执行顺序
- 代码块的解释,构造代码块,静态代码块,静态常量和常量以及静态成员变量和对象成员变量的区别
- 静态代码块的执行顺序(类中含有本类对象)
- java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)
- java成员变量,静态成员变量,静态代码块,代码块和构造函数等加载顺序
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- Java普通代码块,构造代码块,静态代码块,成员变量的执行顺序的代码实例
- 子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- 构造代码块,静态代码块,局部代码块与new对象时,执行的次序
- 【面相对象】静态代码块、构造代码块和构造函数的执行顺序
- 一个关于继承关系中静态快、成员变量、构造体代码的执行顺序的Java代码
- Java中静态代码块执行顺序
- Java:构造器,构造代码块,静态代码块的执行顺序。
- [Java]Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
- 静态 代码块执行顺序
- 静态代码块和构造器的执行顺序