`
小张三
  • 浏览: 66854 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java 类成员的初始化顺序

阅读更多
初始化的顺序是先“静态”,(如果它们尚未因前面的对象创建过程而被初始化),后“非静态”。
具体的创建过程:
1.当首次创建某个类对象的时候,或者该类的静态方法/静态域首次被访问时,Java解释器必须查找该类的路径,以定位该类的class文件。
2.然后载入该class(创建一个Class对象),有关静态初始化的动作都会执行。静态初始化只在Class对象首次加载的时候进行一次。
  例如:按照出现顺序执行初始化动作
static int n1 = f(1);
static{
   n3 = f(3);
   //静态域的初始化语句不必担心非法向前引用,但是如果是访问n3,就会发生非法向前引用的错误
   System.out.println("println");
}
static int n2 = f(2);
static int n3;
static int f(int i){
   System.out.println("n"+i);
   return i;
}
 
创建对象或者访问此类的某个静态域/静态方法,打印出来:
n1
n3
println
n2

3.当使用new操作符创建对象的时候,首先将在堆上为待创建的对象分配足够的存储空间。
4.这块存储空间会被清零,这就自动的将类中所有基本类型数据设置成了默认值(数值和字符是0,布尔是false),而引用则被设置成了null。
5.按出现顺序执行所有出现于域(非静态域)定义处的初始化动作。
6.执行构造器。

运行一下下面的例子就都清楚了。

public class MembersInitializeSequence {
   
    public static void main(String[] args){
        Bowl.f();
        System.out.println("实例化一个Bowl对象");
        new Bowl();
        System.out.println("再实例化一个Bowl对象");
        new Bowl();
    }
}

class Cup {
    Cup(int i){
        System.out.println("new Cup("+i+")");
    }
}

class Bowl{
    Cup c1;
    Cup c2 = new Cup(2);
    {
        c1 = new Cup(1);
    }
    static{
        c4 = new Cup(4);
        System.out.println("Bowl中的静态快,静态块只在类加载的时候运行,所以只运行一次");
    }
    static Cup c3 = new Cup(3);
    static Cup c4;
    Bowl(){
        System.out.println("new Bowl()");
    }

    static void f(){
        System.out.println("Bowl中的静态方法f()被访问");
    }
}
 

在类被继承的情况下,初始化的顺序:

1.初始化子类,类加载器在加载它的时候会发现它继承了另外一个类,类加载器要先把父类加载进来。于是开始加载父类,父类的静态部分被按顺序加载。之后子类的静态部分被加载。这样的顺序是考虑子类的静态域可能会依赖父类的静态域;

2.父类的非静态部分被加载;

3.子类指定的父类的构造器;

4.子类的非静态部分被加载;

5.子类构造器的其余部分。

多个层次的继承关系,顺序也同理。

 

例如

public class MembersInitializeSequenceEx {
    public static void main(String[] args){
//        new Cat();
        new Tiger();
    }
}
class Cat{
    int c1 = f1(1);
    int f1(int i){
        System.out.println("Cat unstatic "+i);
        return i;
    }
    {
        System.out.println("Cat unstatic block");
    }
    static int c2 = f2(2);
    static int f2(int i){
        System.out.println("Cat static "+i);
        return i;
    }
    static{
        System.out.println("Cat static block");
    }
    public Cat(){
        System.out.println("new Cat()");
    }
}
class Tiger extends Cat{
    int c3 = f1(3);
    @Override
    int f1(int i){
        System.out.println("Tiger unstatic "+i);
        return i;
    }
    {
        System.out.println("Tiger unstatic block");
    }
    static int c4 = f2(4);
    static int f2(int i){
        System.out.println("Tiger static "+i);
        return i;
    }
    static{
        System.out.println("Tiger static block");
    }
    public Tiger(){
        super();
        System.out.println("new Tiger()");
    }
}
 
分享到:
评论

相关推荐

    简单了解Java类成员初始化顺序

    主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

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

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

    Java中对象初始化顺序的详细介绍

    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,网上关于Java中对象初始化顺序的文章很多,这篇文章我们将详细介绍Java中对象初始化顺序。有需要的可以参考学习。

    成员的初始化顺序和多态性

    这是我获得的java的代码,这个主要关于成员的初始化顺序和多态性,这个代码主要用于学习和交流,希望大家喜欢。

    Java类初始化顺序

    所有代码块是从上往下顺序执行的,所以代码块里面使用到的变量如果在块下面初始化会有问题 执行构造方法中内容。 所以看见的空构造方法,只能说第三部没有需要执行的内容。 下面举例子 public class TestClass { ...

    Java初始化顺序

    1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println(Sample默认构造函数被调用); } } class Test{ static Sample sam=new...

    类,对象,成员加载的顺序

    java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序

    java对象初始化顺序验证示例

    以下这段小程序对调用对象构造函数时,父类构造函数、成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块

    Java开发者文档,分享日常学习的一些小知识点 .rar

     ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。  构造方法的作用就是初始化。  (2) 静态对象的初始化  程序中主类的静态变量会在main方法执行前初始化。  不仅第一次创建对象时,类中的...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    JAVA复习资料

    12、在Java中有一种叫作__构造方法__的特殊方法,我们在程序中用它来对类的对象成员进行初始化。 13、面向对象技术具有_封装性___、_继承性___、_抽象性___、多态性等特性。 14、Java中所有类都是类 _Object___...

    JAVA基础知识精华总结 收藏

    ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的作用就是初始化。 (2) 静态对象的初始化 程序中主类的静态变量会在main方法执行前初始化。 不仅第一次创建对象时,类中的所有静态变量...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    java面试题静态加载顺序构造方法

    Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    javase子类父类继承关系图解

    用简单几句话说明java成员初始化顺序,适合初学者

    Java语言程序设计

    2.2.1 类的声明 2.2.2 对象的声明与引用 2.2.3 数据成员 2.2.4 方法成员 2.2.5 类的组织——包的概念 2.2.6 类的访问控制 2.2.7 类成员的访问控制 2.3 对象初始化和回收 2.3.1 构造方法 2.3.2 内存回收技术...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

Global site tag (gtag.js) - Google Analytics