`

类的初始化与清理

    博客分类:
  • Java
 
阅读更多

初始化时内存清零
当创建一个对象时,首先将在堆上为这个对象分配足够的空间,这块空间会被清零,即基本类型数据都设置成了缺省值,即数字为0,布尔型为false,字符为空白字符(是一个字符,但不是null),引用设置成null。

public abstract class P {
    //在构建子类时先调用父类构造函数
    public P() {
        //调用子类的方法
        f();
    }

    public abstract void f();
}

class S extends P {
    int integer = 11;
    double decimal = 0.1;
    boolean bool = true;
    char character = 'a';
    String str = "str";

    public S() {
        print("子类构造函数调用前");
    }

    public void f() {
        print("子类构造函数调用中");
    }

    private void print(String msg) {
        System.out.println(msg + " integer=" + integer + " decimal=" + decimal
                + " bool=" + bool + " character=" + (int) character + "("
                + character + ")" + " str=" + str);
    }

    public static void main(String[] args) {
        new S();
    }
    /*
     * output:
     * 子类构造函数调用中 integer=0 decimal=0.0 bool=false character=0() str=null
     * 子类构造函数调用前 integer=11 decimal=0.1 bool=true character=97(a) str=str
     */
}

 

 

初始化顺序
在一个类里,属性初始化的顺序是由属性在类内的定义顺序决定的。即使属性定义大量遍布于方法定义的中间,这些属性仍会在调用任何方法之前得到初始化——甚至在构造函数调用之前,如:

class Tag {
    Tag(int marker) {
        System.out.println("Tag(" + marker + ")");
    }
}

class Card {
    Tag t1 = new Tag(1); // 定义在构造函数前

    Card() {
        System.out.println("Card()");
        t3 = new Tag(4); // 重新初使化t3
    }

    Tag t2 = new Tag(2); // 定义在构造函数后

    void f() {
        System.out.println("f()");
    }

    Tag t3 = new Tag(3); // 最后
}

public class MainTest {
    public static void main(String[] args) {
        Card t = new Card();
        t.f();
    }
    /* output:
        Tag(1)
        Tag(2)
        Tag(3)
        Card()
        Tag(4)
        f()
     */
}

 但要注意的是,属性之间的引用初始化时,被引用的属性一要在先于引用属性的定义,如:

public class A {
    private int g(int ii) {
        /*
         * 此输入i语句在调用的方法定义在属性变量定义前是可以的,因为属性的
         * 初始化一定在调用前完成
         */
        System.out.println(i);
        return 1;
    }

    int i = f();
    /*
     * 注:这一行调用一定要放在i定义后,不然编译时出错,因为引用前一定要先
     * 定义
     */
    int j = g(i);

    private int f() {
        return 0;
    }
}

 注:上面讲的是非静态属性,静态属性也一样,比如将上面的i与j都是定义成静态时与面上规则是一样;但是如果i是静态j为非静态时,静态属性i是可以在引用它的非静态j后面定义的,因为静态属性要先于非静态属性初始(静态与非静态属性混合定义时先初始化静态的,再初始化非静态,后面还进一步讨论);当然不可能j是静态的,而i是非静态的,因为静态的方法或属性不能引用非静态的方法或属性。
上面讨论了非静态属性初始化顺序,下面来看看静态与非静态属行、静态与非静态块还有构造函数一起时初始化顺序:

class P {
    int i = 9;
    int j;
    {
        System.out.println("P's block");
    }
    int y = prt("P.y initialized");

    P() {
        System.out.println("P()");
        prt("i = " + i + ", j = " + j);
        j = 39;
    }

    static {
        System.out.println("P's static block");
    }

    static int x1 = prt("static P.x1 initialized");

    static int prt(String s) {
        System.out.println(s);
        return 47;
    }
}

public class S extends P {
    int k = prt("S.k initialized");
    {
        System.out.println("S's block");
    }

    S() {
        System.out.println("S()");
        prt("k = " + k);
        prt("j = " + j);
    }

    static int x2 = prt("static S.x2 initialized");
    static {
        System.out.println("S's static block");
    }

    static int prt(String s) {
        System.out.println(s);
        return 63;
    }

    public static void main(String[] args) {
        new S();//①如果注释掉此句,还是会输出下面结果中的前四行
    }
    /* output:
    P's static block
    static P.x1 initialized
    static S.x2 initialized
    S's static block
    P's block
    P.y initialized
    P()
    i = 9, j = 0
    S.k initialized
    S's block
    S()
    k = 63
    j = 39
     */
}

 最来后总结一下类的初始化顺序:
父类静态属性(块)初始化->子类静态属性(块)初始化->对象内存清零->父类非静态属性(块)初始化->父类构造函数->子类非静态属性(块)初始化->子类构造函数
注,静态属性与静态块的初始化顺序是按定义的先后顺序初始化,即静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的;非静态属性与非静态块的初始化也是这样。

 

分享到:
评论

相关推荐

    java编程思想-初始化与清理

    java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...

    初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt

    初始化和清理是编程中至关重要的概念,特别是在Java这样的高级编程语言中。本节主要讨论了Java中的构造器、成员初始化、对象创建过程、垃圾回收以及垃圾回收器的工作原理。 4.1 构造器 构造器是Java中用于初始化新...

    详解Java的初始化与清理

    Java的初始化与清理是编程过程中至关重要的环节,它关乎到程序的正确运行和资源的有效管理。本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即...

    第五章 初始化与清理

    本章“第五章 初始化与清理”可能详细探讨了这两个重要概念,特别是在软件工程和系统设计中的应用。下面将根据标题和描述,结合常见的初始化与清理实践,来阐述相关知识点。 初始化是程序启动时执行的一系列操作,...

    java初始化和清理

    Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性表现在类的加载过程上。与其他一些传统编程语言(如C++)不同,Java的类并不是在程序启动时立即加载的...

    Java编程思想初始化与清理PPT教案学习.pptx

    - 构造器是与类同名的特殊方法,用于在创建对象时初始化对象的状态。在C++和Java中,构造器的命名规则相同,即与类名一致。 - 有两种主要类型的构造器:无参构造器(默认构造器)和带参构造器。无参构造器通常用于...

    Java编程思想第05章初始化与清理.ppt

    《Java编程思想》第五章主要讨论的是对象的初始化与清理,包括构造器的使用、方法重载以及默认构造器的概念。下面将详细阐述这些知识点。 ### 一、构造器确保初始化 1. **为什么要引入构造器**:在Java中,构造器...

    winform NUNIT的测试初始化和清理

    值得注意的是,如果测试类中存在`TestFixtureSetUp`和`TestFixtureTearDown`,它们将分别在所有测试方法执行前和执行后调用,适用于更广泛的环境初始化和清理。 在实际项目中,你可能会遇到复杂的初始化和清理场景...

    第4章 初始化和清理.ppt

    在Java程序设计中,初始化和清理是至关重要的概念,它们涉及到对象的生命周期管理和资源的有效利用。本章将探讨几个关键的方面,包括构造函数、函数重载、成员初始化以及垃圾回收机制。 首先,构造函数是Java中用于...

    C++编程思想--第4章 初始化与清除

    C++通过引入构造函数和析构函数来解决这个问题,以确保对象在创建和销毁时能够正确地进行初始化和清理。 构造函数是C++中一种特殊的成员函数,它的主要任务是在对象创建时执行初始化操作。构造函数的名称与类名相同...

    ic卡m1卡初始化工具32位

    描述中提到的“此小工具为IC卡初始化小工具,可以快速清除卡的原始数据”,意味着这个软件的主要功能是清理M1 IC卡上的现有信息,使其恢复到出厂状态。在IC卡的生命周期中,初始化是一个重要的步骤,它允许用户或...

    PremiereProCS3初始化清理工具1.1.exe

    PremiereProCS3初始化清理工具清理视频合成过程中所有记录

    爱数-超易备 备份策略提示COM初始化失败:没有注册类.docx

    ### 知识点一:爱数-超易备简介与功能 ...通过以上详细的分析和解决步骤,可以有效地应对爱数-超易备在设置备份策略时遇到的“COM初始化失败:没有注册类”的问题,并采取相应的预防措施以避免类似问题再次发生。

    易语言线程初始化

    在易语言中,线程初始化是一个关键的概念,它涉及到多任务并行处理,使得程序能够同时执行多个不同的任务,提高系统的效率。 线程是操作系统分配CPU时间的基本单位,一个进程可以包含一个或多个线程。在易语言中,...

    c++之第四初始化与清除

    在C++编程语言中,初始化和清除是两个重要的概念,特别是在管理对象的生命周期时。第四初始化,通常指的是在对象创建过程中的第四种...因此,深入学习和理解C++中的初始化与清除机制,对于提升编程技能是非常有益的。

    Fences3.0.1初始化工具

    《Fences 3.0.1 初始化工具:优化桌面管理的新维度》 Fences是一款由 Stardock 公司开发的桌面组织工具,主要用于帮助用户更有效地管理和组织桌面上的图标。Fences 3.0.1 是该软件的一个版本,它提供了一种创新的...

    VC MFC下 的初始化 与结束 顺序过程,是mFC的基础

    在Microsoft Visual C++ (VC) 中使用MFC(Microsoft Foundation Classes)进行开发时,了解初始化与结束的顺序过程至关重要,因为这直接影响到程序的正确运行和资源管理。MFC提供了一套框架,使得应用程序的启动、...

    JEECG 3.6 MYSQL初始化问题

    **JEECG 3.6 MYSQL 初始化问题详解** JEECG是一款基于代码生成器的Java快速开发平台,它集成了大量的优秀开源项目,为开发者提供了一整套的企业级解决方案。在部署和使用JEECG 3.6的过程中,MySQL数据库的初始化是...

    Linux系统初始化相关脚本分析

    在Linux操作系统中,系统初始化是一个复杂且有序的过程,它确保了操作系统在启动后能正常运行所有必要的服务和程序。这个过程涉及到多个脚本和配置文件的执行,其中`rc.sysinit`和`rc.local`是两个关键的初始化脚本...

Global site tag (gtag.js) - Google Analytics