Java对象初始化顺序
2010-09-03 10:46
337 查看
java
对象是如何进行初始化的,新建一PrintClass
.java
文件如下(包括类PrintClass
以及A
和其子类B
),编译运行其中的main
方法,
public class PrintClass
{
public static void main(String[] args){
new B()
;
}
PrintClass(String var) {
System.out.println(var);
}
}
class A
{
static PrintClass pClassA1 = new PrintClass("A.
静态成员的初始化1");
static {
System.out.println("A.
静态初始化块1");
}
static {
System.out.println("A.
静态初始化块2");
}
static PrintClass pClassA2 = new PrintClass("A.
静态成员的初始化2");
{
System.out.println("A.
实例初始化块1");
}
PrintClass pClassA = new PrintClass("A.
实例成员的初始化");
{
System.out.println("A.
实例初始化块2");
}
public int Avar;
public A() {
System.out.println("A.
构造方法");
doSomething();
}
private void doSomething() {
//
public void doSomething() {
Avar = 1111;
System.out.println("Avar=" + Avar);
}
}
//class B extends A
class B
extends
A
{
public static void main(String[] args){
new B();
}
public int Bvar = 2222;
{
System.out.println("B.
实例初始化块1");
}
{
System.out.println("B.
实例初始化块2");
}
PrintClass pClassB = new PrintClass("B.
实例成员的初始化");
static {
System.out.println("B.
静态初始化块1");
}
static PrintClass pClassB1 = new PrintClass("B.
静态成员的初始化1");
static PrintClass pClassB2 = new PrintClass("B.
静态成员的初始化2");
static {
System.out.println("B.
静态初始化块2");
}
public B() {
System.out.println("B.
构造方法");
doSomething();
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
}
可以看到运行结果为:
A.
静态成员的初始化1
A.
静态初始化块1
A.
静态初始化块2
A.
静态成员的初始化2
B.
静态初始化块1
B.
静态成员的初始化1
B.
静态成员的初始化2
B.
静态初始化块2
A.
实例初始化块1
A.
实例成员的初始化
A.
实例初始化块2
A.
构造方法
Avar=1111
B.
实例初始化块1
B.
实例初始化块2
B.
实例成员的初始化
B.
构造方法
Bvar=2222
由此可知当新建一java
对象(上面main
方法中new B()
)时,它的内部初始化顺序为:
1.
父类静态成员和静态初始化块
,按在代码中出现的顺序依次执行
2.
子类静态成员和静态初始化块
,按在代码中出现的顺序依次执行
3.
父类实例成员和实例初始化块
,按在代码中出现的顺序依次执行
4.
父类构造方法
5.
子类实例成员和实例初始化块
,按在代码中出现的顺序依次执行
6.
子类构造方法
对象是如何进行初始化的,新建一PrintClass
.java
文件如下(包括类PrintClass
以及A
和其子类B
),编译运行其中的main
方法,
public class PrintClass
{
public static void main(String[] args){
new B()
;
}
PrintClass(String var) {
System.out.println(var);
}
}
class A
{
static PrintClass pClassA1 = new PrintClass("A.
静态成员的初始化1");
static {
System.out.println("A.
静态初始化块1");
}
static {
System.out.println("A.
静态初始化块2");
}
static PrintClass pClassA2 = new PrintClass("A.
静态成员的初始化2");
{
System.out.println("A.
实例初始化块1");
}
PrintClass pClassA = new PrintClass("A.
实例成员的初始化");
{
System.out.println("A.
实例初始化块2");
}
public int Avar;
public A() {
System.out.println("A.
构造方法");
doSomething();
}
private void doSomething() {
//
public void doSomething() {
Avar = 1111;
System.out.println("Avar=" + Avar);
}
}
//class B extends A
class B
extends
A
{
public static void main(String[] args){
new B();
}
public int Bvar = 2222;
{
System.out.println("B.
实例初始化块1");
}
{
System.out.println("B.
实例初始化块2");
}
PrintClass pClassB = new PrintClass("B.
实例成员的初始化");
static {
System.out.println("B.
静态初始化块1");
}
static PrintClass pClassB1 = new PrintClass("B.
静态成员的初始化1");
static PrintClass pClassB2 = new PrintClass("B.
静态成员的初始化2");
static {
System.out.println("B.
静态初始化块2");
}
public B() {
System.out.println("B.
构造方法");
doSomething();
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
}
可以看到运行结果为:
A.
静态成员的初始化1
A.
静态初始化块1
A.
静态初始化块2
A.
静态成员的初始化2
B.
静态初始化块1
B.
静态成员的初始化1
B.
静态成员的初始化2
B.
静态初始化块2
A.
实例初始化块1
A.
实例成员的初始化
A.
实例初始化块2
A.
构造方法
Avar=1111
B.
实例初始化块1
B.
实例初始化块2
B.
实例成员的初始化
B.
构造方法
Bvar=2222
由此可知当新建一java
对象(上面main
方法中new B()
)时,它的内部初始化顺序为:
1.
父类静态成员和静态初始化块
,按在代码中出现的顺序依次执行
2.
子类静态成员和静态初始化块
,按在代码中出现的顺序依次执行
3.
父类实例成员和实例初始化块
,按在代码中出现的顺序依次执行
4.
父类构造方法
5.
子类实例成员和实例初始化块
,按在代码中出现的顺序依次执行
6.
子类构造方法
相关文章推荐
- Java基础总结之类与对象的初始化顺序
- Java中初始化对象的顺序,静态代码块的用法以及Static的用法详解
- java对象实例初始化顺序
- Java对象初始化顺序
- JAVA--浅谈实例化对象时的初始化顺序
- Thinking in Java:对象初始化顺序
- 剖析一个java对象初始化顺序问题
- Java 类和对象的初始化过程及初始化顺序
- java对象的初始化顺序
- 《Thinking in Java》——静态、非静态成员变量、子句的初始化顺序(含继承)及对象创建过程
- Java中对象的初始化顺序
- java 用自身类的对象初始化静态变量 执行顺序
- java对象初始化顺序
- java中在创建对象时候的初始化顺序
- JAVA中静态代码块及对象的初始化顺序
- Java中对象初始化顺序
- Java类和对象的初始化顺序
- java对象初始化顺序
- Java创建对象的初始化顺序
- java中对象初始化顺序