初学java ,请问java对象初始化的过程是怎样的,包括子类父类构造器 实例变量的初始化的顺序
解决方案 »
- 读者写者问题的模拟出现java.lang.IllegalMonitorStateException异常
- 请教swt虚拟树问题,30分敬上
- 高分请教大家一个snmp4j相关问题
- 请教如何将JB9和TOMCAT5整合?
- 执行resultSet.next()为false后,会不会自动调用resultset.close啊?
- 用Applet实现图形的放大、缩小、移动
- 大家帮忙看一下这段代码的错误出在哪里,里面的两个文件默认已经存在,但却老提示fs1和fs2没有初使化
- java的重要性在哪里呢?
- 字符替换的问题,我都快烦死了,请各位高手指点,谢谢!
- 有关java构造方法
- 用Collection的方法实现以下问题????
- JAVA下拉框
static{
System.out.println("父类static 块 1 执行");
}
static Sample staticSam1=new Sample("父类 静态成员staticSam1初始化");
Sample sam1=new Sample("父类 sam1成员初始化");
static Sample staticSam2=new Sample("父类 静态成员staticSam2初始化");
static{
System.out.println("父类 static 块 2 执行");
}
Test()
{
System.out.println("父类 Test默认构造函数被调用");
}
Sample sam2=new Sample("父类 sam2成员初始化");}class TestSub extends Test
{
static Sample staticSamSub=new Sample("子类 静态成员staticSamSub初始化");
TestSub()
{
System.out.println("子类 TestSub 默认构造函数被调用");
}
Sample sam1=new Sample("子类 sam1成员初始化");
static Sample staticSamSub1=new Sample("子类 静态成员staticSamSub1初始化");
static{System.out.println("子类 static 块 执行");}
Sample sam2=new Sample("子类 sam2成员初始化");
}执行结果:
父类 static 块 1 执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2 执行
--------父类静态成员初始化
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块 执行
-------子类静态成员初始化
父类 sam1成员初始化
父类 sam2成员初始化
父类 Test默认构造函数被调用
-------父类普通成员初始化和构造函数执行
子类 sam1成员初始化
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用
-------父类普通成员初始化和构造函数执行
由此得出Java初始化顺序结论:
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
提点自己的理解:
举例:Person p1 = new Person()//创建父类对象
Child p2 = new Child()//创建子类对象
在上述情况下:
如果先创建父类对象:new Person()的话,在堆中开辟一个空间(内存),Person p意思于,在栈中存放变量p,用于在堆中找到Person对象的属性(也可以理解成p引用Person对象的地址)。
如果是先创建子类对象:new Child()的话,程序默认先调用父类的构造器,之后再调用子类的。如果是无参的话,子类的构造器首行自动添加super()调用父类构造器,构造器一般是用于初始化成员变量=全局变量的。再如果不考虑权限修饰符,通过对象调用方法和变量的过程是:p1.方法 或 p1.变量名
该句话都做了什么事情?
1、因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
2、执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3、在堆内存中开辟空间,分配内存地址。
4、在堆内存中建立对象的特有属性,并进行默认初始化。
5、对属性进行显示初始化
6、对对象进行构造代码块初始化
7、对对象进行对应的构造函数初始化
8、将内存地址付给栈内存中的变量。
2.对象初始化先会加载static的变量以及static块。其顺序为从上到下。
3.实例变量的初始化,包括初始化当前实例。其顺序也是从上到下。
public A(){System.out.println("我是父类构造方法`");}
}public class Test extends A {
public Test() {
System.out.println("我是构造方法9"); //构造方法在对象实例化时非静态初始化块执行结束以后被执行
System.out.println("我是构造方法10"); //同级别的安先后顺序执行
} {System.out.println("我是非静态初始化块5");} //非静态初始化块在对象实例化时构造方法被调用之前被执行
{System.out.println("我是非静态初始化块6");} //同级别的按先后顺序执行
String str2 = "我是非静态初始化代码块7";
{
System.out.println(str2);
str2 = "我是非静态初始化代码块8"; //这里重新赋值
System.out.println(str2); //可见 String str2=xxx 相当于
//String str; {str=xxx;}//在非静态初始化块赋值
//非静态初始化块同级别按先后顺序执行
} static {System.out.println("我是静态代码块1");} //静态块在类加载的时候被执行
static {System.out.println("我是静态代码块2");} //同级别的按先后顺序执行
static String str = "我是静态代码块3";
static {
System.out.println(str);
str = "我是静态代码块4"; //这里重新赋值
System.out.println(str); //可见 static String str=xxx 相当于
//static String str; static {str=xxx;}//在静态块赋值
//静态块同级别按先后顺序执行
} public static void main(String[] args) {
new Test(); //LZ自己理解一下例子的执行顺序
}
}