`
行者买刀
  • 浏览: 194676 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

JAVA类的初始化顺序(静态变量,静态模块,变量,模块,构造器)

    博客分类:
  • J2SE
阅读更多

           对于静态变量,与类变量及构造器初始化顺序的朋友们,大家看过来了,阅读了以后几段代码之后,你会发现原来也就是这么简单.先看下面这几个类.

  

/**类A**/
public class TestA {
    public TestA(String a){
        System.out.println(a);
    }
}
/**类B**/
public class TestB {
    public TestB(String b){
        System.out.println(b);
    }
}
/**类 Parent **/
public class Parent {
    private static TestA testA1 = new TestA("Parent的静态变量");
    static {
        System.out.println("Parent的静态初始化模块");
    }
    private  TestA testA2 = new TestA("Parent变量");
    {
        System.out.println("Parent的初始化模块");
    }
    public Parent(){
        System.out.println("Parent的构造函数");
    }
}

/**Parent的子类SubClass**/
public class SubClass extends Parent{
    private static TestA testA1 = new TestA("SubClass的静态变量1");
    static {
        System.out.println("SubClass的静态初始化模块1");
    }
    private static TestA testA2 = new TestA("SubClass的静态变量2");
    static {
        System.out.println("SubClass的静态初始化模块2");
    }
    private  TestA testA3 = new TestA("SubClass变量1");
    {
        System.out.println("SubClass的初始化模块1");
    }
    private  TestA testA4 = new TestA("SubClass变量2");
    {
        System.out.println("SubClass的初始化模块2");
    }
    public SubClass(){
        System.out.println("SubClass的构造函数");
    }
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
    }
}

 

打印结果如下:

    Parent的静态变量
    Parent的静态初始化模块

    SubClass的静态变量1

    SubClass的静态初始化模块1

    SubClass的静态变量2

    SubClass的静态初始化模块2

    Parent变量

    Parent的初始化模块

    Parent的构造函数

    SubClass变量1

    SubClass的初始化模块1

    SubClass变量2

    SubClass的初始化模块2

    SubClass的构造函数

 说明 :

1.静态变量与静态模块是最先初始化的,因为它是属于类的变量和模块.

2.Parent的构造器要先于它的子类,这一点是肯定的,但Parent的变量,初始化模块要先于它的子类,这一点可能理解起来有点困难,但我们只要知道父类的构造器先于子类,它的变量与模块也是理所当然的,这样理解起来会比较合理.

3.静态变量与静态模块的初始化顺序是根据在类里面定义的顺序,同理变量化初始化模块的顺序也是根据类里面定义的顺序(上面结果的红色部门)

分享到:
评论
5 楼 C_J 2009-04-17  
恩 我和C++混了

1,
局部静态变量放到STACK

全局静态变量在全局区(而JAVA没有全局静态变量这个说法了)

2,
有,常量不可改变  静态变量不可“运行赋值”
4 楼 行者买刀 2009-04-17  
C_J 写道
“放在java的线程栈中,每个java独立的线程都有自己的栈”

你的意思是 你这里的 静态变量和模块 是放在某个线程栈么???

或者是某个“类的常量区”么?


我想先问你两个问题:
一是你觉得静态变量是放在栈里还是堆里?
二是你觉得类的常量与类的静态变量有区别吗,区别是什么.

3 楼 C_J 2009-04-17  
“放在java的线程栈中,每个java独立的线程都有自己的栈”

你的意思是 你这里的 静态变量和模块 是放在某个线程栈么???

或者是某个“类的常量区”么?
2 楼 行者买刀 2009-04-17  
C_J 写道
我觉得你的总结有些偏差

1.静态变量与静态模块是最先初始化的,因为它是属于类的变量和模块.

   原因我觉得是 它是属于进程的静态常量区,[color=red]他的范围应该不能以“类”来划分[/color]

2.Parent的构造器要先于它的子类,这一点是肯定的,但Parent的变量,初始化模块要先于它的子类,这一点可能理解起来有点困难,但我们只要知道父类的构造器先于子类,它的变量与模块也是理所当然的,这样理解起来会比较合理.

  构造器可能涉及到类变量操作,所以既然先初始化了父类的构造器,那父类的成员变量也当然要先构造


1.静态变量与静态模块放在静态区没错的,而且是放在java的线程栈中,每个java独立的线程都有自己的栈,并且它们不是线程安全的,
"他的范围应该不能以“类”来划分"这句话,我想理解有些偏差了,如果它不以类划分的话,那么怎么去调用它,它不像C++那样属于全局变量,可以直接引用,它必须属于某个类中的静态变量,我们调用它也是用Class.param才能得到它.并且,在没有用到它的时候,它是不会被初始化的,只有在你引用到它的时候,它才会被初始化并且放中线程栈中.

2.第二点你的理的理解不错的,支持下.
1 楼 C_J 2009-04-17  
我觉得你的总结有些偏差

1.静态变量与静态模块是最先初始化的,因为它是属于类的变量和模块.

   原因我觉得是 它是属于进程的静态常量区,他的范围应该不能以“类”来划分

2.Parent的构造器要先于它的子类,这一点是肯定的,但Parent的变量,初始化模块要先于它的子类,这一点可能理解起来有点困难,但我们只要知道父类的构造器先于子类,它的变量与模块也是理所当然的,这样理解起来会比较合理.

  构造器可能涉及到类变量操作,所以既然先初始化了父类的构造器,那父类的成员变量也当然要先构造

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java程序初始化顺序

    - 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    Java变量初始化

    这也很容易理解,因为类变量是类加载的时候执行的初始化,且只执行一次,而调用构造器是对象实例化执行的,每实例化一次对象,执行一次。 总结 Java 变量初始化是 Java 语言的基础知识点之一。变量的初始化过程...

    JAVA面试题解惑系列——类的初始化顺序

    首先,需要了解Java类初始化的基本规则,即在类的静态变量、静态初始化块、变量、初始化块、构造器这五个部分中,它们的初始化顺序依次是:静态变量、静态初始化块、变量、初始化块、构造器。这个顺序在单个类中是...

    探究java的ClassLoader及类变量初始化顺序

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    Java初始化顺序1

    Java 中的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 Java 初始化顺序的知识点总结: * 类变量(静态变量)和实例变量(对象变量)的区别 * ...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    Java中static静态变量的初始化完全解析

    Java中的静态变量(static变量)是在类加载时初始化的,而不是在对象创建时。静态变量属于类,而不属于任何特定的对象,因此它们是共享的,所有类实例都可以访问。了解静态变量的初始化顺序对于理解和避免潜在的编程...

    java中静态与非静态的变量定义与使用

    在 `Table` 类和 `Cupboard` 类的构造器中,可以看到静态变量的初始化会导致它们关联的实例方法 `f()` 被调用。例如,`Table` 类的构造器在创建静态变量 `b2` 时调用了 `b2.f(1)`,这将打印出 "f(1)"。同样,`...

    JAVA类的初始化顺序文.pdf

    1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态变量" 先被初始化,然后分别执行对应的静态初始化块。 2. **...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    在 JAVA 中,类的初始化顺序可以分为四个阶段:静态变量、静态初始化块、变量、初始化块和构造器。其中,静态变量和静态初始化块的初始化顺序是最高的,接着是变量和初始化块,最后是构造器。 在了解类的初始化顺序...

    java 构造器的调用

    总结,Java中的构造器是至关重要的,它们负责对象的初始化,包括设置成员变量的初始值。了解和掌握构造器的调用、初始化、默认构造器、继承中的构造器调用以及构造器重载等概念,是编写高质量Java代码的基础。通过...

    JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf

    3. **父类的非静态部分**:在创建子类实例时,首先执行父类的非静态变量初始化和非静态初始化块,然后调用父类的构造器。 4. **子类的非静态部分**:最后执行子类的非静态变量初始化和非静态初始化块,以及子类的...

    C++和Java初始化顺序的比较代码

    2. 非静态数据成员:在构造函数初始化列表中,成员变量按照它们在类声明中的顺序被初始化。即使初始化列表中的顺序不同,也会按照声明的顺序进行。 例如: ```cpp class MyClass { public: int a; int b; static...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    它们在类加载时初始化,并且在整个程序运行期间都存在。 4. 成员方法(Member Methods): 成员方法是类中的函数,它们定义了对象的行为。成员方法可以访问和修改类的实例变量,也可以调用其他成员方法。成员方法...

    php 静态变量的初始化

    然而,如果你想要将静态变量初始化为一个对象,PHP并不支持像Java那样的静态构造器或静态初始化块。在这种情况下,你需要在代码的某个时刻显式地调用一个方法来完成初始化。例如: ```php class A { static ...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    在Java编程世界中,类的初始化顺序是理解面向对象编程概念的一个重要方面。尤其对于那些准备应对技术面试的Java程序员和工程师来说,掌握这一知识点是面试时的必备能力之一。本文将深入探讨Java中类的初始化顺序,...

Global site tag (gtag.js) - Google Analytics