即
静态成员、块构造方法头实例成员、块构造方法体这种初始化顺序对不对
静态成员、块构造方法头实例成员、块构造方法体这种初始化顺序对不对
解决方案 »
- "The resource is not on the build path of a java project"
- 请问如何在JButton上弹出popupmenu,我做的怎么只能看到一个点。而在JPanel中确能正确弹出。
- 请教一个启动界面???
- 请各位大侠赐教 Exception in thread "main" java.lang.NoClassDefFoundError: MyApplication/class
- applet问题
- 如何在一个类文件中,显示另一个类文件中的记录集,(有分)
- 谁帮看一下这段JDBC程序错在哪里:
- 优秀的java集成开发环境
- 请问那里能下载JBUILD6?
- JComboBox的问题
- 求牛顿法解方程原代码
- 直接上运行结果(javac 编译)
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法
这个的4,6步是不是应该分成两步走,第一步执行方法头(包含初始化其参数,调用supper或this),第二步执行构造方法体,而且两步分别在实例成员和实例初始化块的初始化先后执行
*
* 初始化测试
*
* @author monitor
* Created on 2010-12-23, 17:28:58
*/
class Father {
public static int order=1;
public int num=0;
static{
System.out.println((order++)+":父类静态块 ");
} {
num=1;
System.out.println((order++)+":父类实体态块 num="+num);
} public Father(int param1,int param2){
num=2;
System.out.println((order++)+":父类方法头 num="+num);
}
public Father(int parm){
this(parm,3);
num=3;
System.out.println((order++)+":父类构造方法体 num="+num);
}
}public class Test extends Father{
static{
System.out.println((order++)+":子类静态块");
} {
num=4;
System.out.println((order++)+":子类实体态块 num="+num);
} public Test(int param1,int param2){
super(param1);
num=5;
System.out.println((order++)+":子类方法头 num="+num);
} public Test(int parm){
this(parm,3);
num=6;
System.out.println((order++)+":子类构造方法体 num="+num);
} public static void main(String[] args){
Test test = new Test(1);
}
}
1:父类静态块
2:子类静态块
3:父类实体态块 num=1
4:父类方法头 num=2
5:父类构造方法体 num=3
6:子类实体态块 num=4
7:子类方法头 num=5
8:子类构造方法体 num=6
静态块与静态成员的初始化工作与实例化过程无关,实例化必须先执行静态块和静态成员,但并不代表实例化一定会执行静态块和静态成员。只有当实例化的对应的类为加载入虚拟机的时候,才会进行这种操作。有些时候执行静态块或者初始化静态成员不一定就是实例化该类对象才会进行的,例如调研该类的某静态成员或者静态方法,又例如该类的子类被实例化或者调用了静态成员或静态方法等。还有实例化的实际顺序其实是(省略类初始化过程)
1、进入当前类构造方法。
2、进入父类构造方法递归直到java.lang.Object类构造方法。
3、执行java.lang.Object类构造方法,顺序依次为成员变量初始与初始化块(安装上下文顺序),对应调用的构造方法体。
4、执行java.lang.Object类的直接子类的构造函数,这个过程递归到当前类。
5、当前类执行顺序与前面java.lang.Object类相同。构造方法的本质其实就是一个普通的无返回参数的名字叫做<init>的方法,不过虚拟机调用这个方法的指令与其它方法不同而已,它的调用指令与调用private方法的指令相同。
在虚拟机中存在三种方法的调用指令,这三种调用指令在效率上不同。
接口方法的指令调用,这种调用速度最慢。
普通类方法的调用指令,这种调用速度中等。
构造方法与私有方法调用指令,这种调用速度最快。