首先假设有如下的一些辅助类,这些类被其他类使用作为静态变量或非静态变量:
public class C {
public C() {
System.out.println("C");
}
}
public class E {
public E() {
System.out.println("E");
}
}
public class F {
public F() {
System.out.println("F");
}
}
public class G {
public G() {
System.out.println("G");
}
}
public class H {
public H() {
System.out.println("H");
}
}
1)继承自Object的类的构造函数的执行顺序:
假设有如下的一个类I,I的定义如下:
public class I {
public G g = new G();
public static E statice0 = new E();
static {
statice0 = new E();
System.out.println("判断static执行的顺序");
}
public static E statice1;
public static F f1;
static {
System.out.println("测试在static块中执行的顺序1");
statice1 = new E();
f1 = new F();
}
static {
System.out.println("测试在static块中执行的顺序2");
f1 = new F();
statice1 = new E();
}
public static H h = new H();
public E e;
{
System.out.println("aaa");
e = new E();
}
public I(int i) {
statice0 = new E();
f1 = new F();
e = new E();
}
public static void main(String[] args) {
I i = new I(1);
}
}
执行结果:
E
E
判断static执行的顺序
测试在static块中执行的顺序1
E
F
测试在static块中执行的顺序2
F
E
H
G
aaa
E
F
H
E
从这个结果来可以知道,从Object派生的类将会按照如下的书序执行:
1、静态变量,如果有静态块的话,则按照静态块中变量new的顺序执行静态变量构造函数。如果没有静态块的话,则按照声明的顺序执行。
2、非静态变量,如果有非静态变量初始化块的话,则按照new的顺序执行构造函数,如果没有初始化块则按照声明的顺序执行。
3、执行构造函数,所有的变量按照new的顺序执行构造函数。
2)如果是从非Object类结成的类
看如下的类:
public class A {
private static E e = new E();
private F f = new F();
public A() {
System.out.println("A");
}
}
public class B extends A {
private static D d = new D();
private C c = new C();
public B() {
System.out.println("B");
}
public static void main(String[] args) {
B b = new B();
}
}
public class C {
public static E e = new E();
public C() {
System.out.println("C");
}
}
执行B中的main,则会打印出如下的结果:
E
H
G
D
F
A
E
C
B
首先分析各个类的调用情况,在父类A中有一个E的静态变量,和一个F的非静态变量,B类继承自A,B有一个D的静态变量和C的非静态变量,D中又有一个H的静态变量和g的非静态变量。
从执行得到的结果可以得到如下的结论:
1、首先执行父类中的静态变量的构造函数,在执行构造函数之前执行静态变量的类中的静态变量的构造函数。因此在上例中首先输出:E
2、执行本类的静态变量的构造函数,同上,需要执行静态变量的类中的静态变量的构造函数。上例中会在执行了A中的E的静态变量后执行D的静态变量的构造函数,在此之前需要执行D中的静态变量H的构造函数,然后执行D中的非静态变量G的构造函数。打印出:H G D
3、执行父类中的非静态变量的构造函数。打印出:f
4、执行父类的构造函数。打印出: A
5、执行本类的非静态变量的构造函数,打印出:E C
6、执行本类中的构造函数,按照new的顺序执行构造函数。打印出:B
分享到:
相关推荐
3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private) */ public class Test{ public Test(){ System.out.println("类Test构造方法被执行 6"); } { System.out.println("类...
java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。
对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。
主要介绍了举例说明Java中代码块的执行顺序,包括静态属性和非静态属性以及构造函数等相关的执行先后,需要的朋友可以参考下
具体的题目我肯定记不清,不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序...
java中的自由块分为静态的自由块和非静态的自由块。非静态自由块的执行时间是:在执行构造函数之前。静态自由块的执行时间是:class文件加载时执行。
* 继承树中的从最高层开始的实例语句块{}、然后对应的构造函数、以及构造函数中调用的方法 * (如果是重写即子类将父类的实例方法重写类,则调用子类的,如果是隐藏即方法则父类中声明为静态方法,则调用父类本身的...
讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。 是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 JAVA8 的 ...
(3) super.([paramlist]) //调用父类中的构造函数 在类方法中(static),不能使用this或super修饰符 " Q0045 Java中是怎样捕获异常的? "try { //statement01 } catch(Exception e) { //statement02 } finally { ...
JAVA面试题总览, 包含如下: 1. JAVA中的几种基本数据类型是什么,各自占用多少字节。...5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字 段,当new的时候,他们的执行顺序。
为什么 final 引用不能从构造函数内“逸出” 63 final 语义在处理器中的实现 65 JSR-133 为什么要增强 final 的语义 65 总结 66 处理器内存模型 66 JMM,处理器内存模型与顺序一致性内存模型之间的关系 68 JMM...
构造函数可以使用virtual修饰吗(头条) C++ 拷贝构造函数 如何禁用 什么时候要重载拷贝构造函数?(聊了以后发现他的意思是重写overriding) 构造函数的种类 构造函数的常用场景 构造函数和=运算符的区别 拷贝构造...
为什么final引用不能从构造函数内“逸出” final语义在处理器中的实现 JSR-133为什么要增强final的语义 总结 处理器内存模型 JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR...
c++小型企业工资管理系统
不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...
4.4 构造函数被调用后的详细执行过程 5、包 5.1 创建包 5.2 创建可复用类的步骤简要说明 5.3 包的导入 5.4 包的可见性 接口 6.1 接口的概念 6.2 接口的声明 6.3 接口的实现 四、IO流及异常处理 1、流和文件 ...
弄清构造函数和终结方法在继承层次结构中的调用顺序,强调子类必须调用超类的构造函数分配空间和初始化超类数据。 掌握方法重写(override)的基本要求。 理解和使用关键字final。 理解包的...
Java基础 java控制流程语句 数据交换 左(右)移 加密 java控制流程语句 switch语句 季节判断 while循环 1+...+100 do while循环 ...jvm类加载顺序决定代码执行顺序 super关键字 方法重写 instanceof关键字 fi
System.out.println(Sample默认构造函数被调用); } } class Test{ static Sample sam=new Sample(静态成员sam初始化); Sample sam1=new Sample(sam1成员初始化); static{ System.out.println(static块执行);...
2016,一些面试中出现率比较高的题,(来自蘑菇天堂) 基础: String类能被继承吗、为什么 ...类的实例化顺序、比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段、他们的执行顺序。。。。