类的初始化&实例化顺序

讲到类的初始化和实例化(见我的《Class的生命周期》),不得不提提初始化和实例化的顺序,我想这也是一直困扰了很大一部分人。

从大流程来说,类肯定是先初始化,再实例化的,这里得出第一个顺序:

静态域 --> 实例域 --> 构造函数。另外要符合任何子类的动作都会触发父类:父类 --> 子类。所以得出原则:【先静态后实例;先父类后子类】

而且同一个域的顺序可以分成两步: 创建-->赋值

对于静态域,其先经过链接创建静态变量,赋default值;再到初始化阶段给静态变量赋assign值和执行静态代码块。同理于实例域,也是分成创建和赋值两个部分,不同的只是加入构造函数(形参和代码块):先创建实例变量和构造函数形参以default值,然后对变量和形参赋assign值和执行实例代码块,最后执行构造函数的代码。

前提先要执行父类,再到子类;另外同一层次的就按从上到下顺序执行,如下面例子。

package com.jscai.java.classLoader;

public class LoaderLazy {
    {
        System.out.println("Parent Instance Code");
    }
    private PrintTmp p1 = new PrintTmp("Parent Instance Member");
    
    static {
        System.out.println("Parent Static Code");
    }
    private static PrintTmp p2 = new PrintTmp("Parent Static Member");

    public LoaderLazy() {
        System.out.println("Parent Constuctor");
    }
}

class SubLoaderLazy extends LoaderLazy {
    {
        System.out.println("Sub Instance Code");
    }
    private PrintTmp p1 = new PrintTmp("Sub Instance Member");
    
    static {
        System.out.println("Sub Static Code");
    }
    private static PrintTmp p2 = new PrintTmp("Sub Static Member");

    public SubLoaderLazy() {
        System.out.println("Sub Constuctor");
    }
}

class PrintTmp {
    public PrintTmp(String strOut) {
        System.out.println(strOut);
    }
}
SubLoaderLazy test = new SubLoaderLazy();

console:

Parent Static Code

Parent Static Member

Sub Static Code

Sub Static Member

Parent Instance Code

Parent Instance Member

Parent Constuctor

Sub Instance Code

Sub Instance Member

Sub Constuctor

另外我们看看下面的代码,说明了静态域先赋default值;然后按顺序赋assign值,先执行tester = new Test(),这时候count1和count2还是0,所以自加后都是1。

     private static Test tester = new Test();
     private static int count1;
     private static int count2 = 2;
     public Test() {
         count1++;
         count2++;
         System.out.println("c1=" +count1 + "; c2=" +  count2);
     }

console:

c1=1; c2=1

时间: 2024-10-11 19:06:13

类的初始化&实例化顺序的相关文章

条款十三: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同

template<class t> class array { public: array(int lowbound, int highbound); ... private: vector<t> data; // 数组数据存储在vector对象中 // 关于vector模板参见条款49 size_t size; // 数组中元素的数量 int lbound, hbound; // 下限,上限 }; template<class t> array<t>::a

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

Java类、实例初始化的顺序

求如下 java 代码的输出?? class T implements Cloneable{ public static int k = 0; public static T t1 = new T("t1"); public static T t2 = new T("t2"); public static int i = print("i"); public static int n = 99; public int j = print(&quo

C#类的初始化顺序

类在初始化时的执行顺序,依次如下: 1: 子类静态变量 2: 子类静态构造函数 3: 子类非静态变量 4: 父类静态变量 5: 父类静态构造函数 6: 父类非静态变量 7: 父类构造函数 8: 子类构造函数 对于静态变量与静态构造函数而言, 无论对一个类创建多少个实例,它的静态成员都只有一个副本. 也就是说,静态变量与静态构造函数只初始化一次(在类第一次实例化时) 原文地址:https://www.cnblogs.com/LagoOrLY/p/10767283.html

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

java类中各成员初始化的顺序

了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println

类的初始化顺序

原文地址:http://www.cjsdn.net/post/view?bid=1&id=194795&sty=3 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: Java代码 public class InitialOrderTest { // 静态变量 public static String staticField = "

java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和static--->* 2先初始化父类的static成员变量和static* 3再初始化本类的static成员变量和static * 类加载之后,对象创建开始* 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)* 2先加载父类的构造函数* 3再加载本类

Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)(转)

大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: Java代码 p