`
www219txl
  • 浏览: 7761 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

静态代码块 非静态代码块和构造函数执行顺序

阅读更多
class B
{
static int a = 0;
{
  System.out.println("B.scope is running");
  a = 10 ;
}
static
{
  System.out.println("B.static  scope is running");
  a = 20;
}
public B()
{
  a = 30;
  System.out.println("B.Constructor  is running");
}

public static void main(String arg[])
{
  System.out.println(B.a);
  System.out.println(B.a);
     B b1 = new B();
  B b2 = new B();
  System.out.println(b1.a);
  System.out.println(b2.a);
  System.out.println(B.a);

}

}

运行结果为:

B.static  scope is running
20
20
B.scope is running
B.Constructor  is running
B.scope is running
B.Constructor  is running
30
30
30

当我们在使用B类时,JVM将B的定义装载,这时它调用了B的静态定义初始化和静态代码块 由于是静态的,尽管我们打印了两次,静态定义初始化和静态代码块都只执行了一次。构造函数是后于非静态代码块执行的.
在屏蔽了Class B中的main方法后,我们再写一个C类继承B类,如下:
class C extends B
{
static int c = 0;
static
{
  c = 10;
  System.out.println("C.static code is runnning and now c is " + c);
 
}
{
  c = 20;
  System.out.println("C.non-static code is runnning and now c is " + c);
 
}

public C()
{
  c = 30;
  System.out.println("C.constructor is running and now c is " + c);
}
public static void main(String args[])
{
  System.out.println(C.c);
  System.out.println(C.c);
  C c1 = new C();
  C c2 = new C();
  System.out.println(c1.c);
  System.out.println(c2.c);
  System.out.println(C.c);
 
}
}

B.static  scope is running
C.static code is runnning and now c is 10
10
10
B.scope is running
B.Constructor  is running
C.non-static code is runnning and now c is 20
C.constructor is running and now c is 30
B.scope is running
B.Constructor  is running
C.non-static code is runnning and now c is 20
C.constructor is running and now c is 30
30
30
30

在此描述一下c变化过程,虽然定义了两个对象c1,c2但其实只有一份共有的c,c被装载时先被初始化为0,后来执行静态代码块时被初始化为10,接着执行c1的非静态代码快时被初始化为20,然后是c1的构造函数被出化为30,然后轮到c2的非静态代码块,这是又重新被初始化回20,然后c2的构造函数,变为30.



分享到:
评论

相关推荐

    静态代码块

    静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...

    java中静态代码块与构造方法的执行顺序判断

    在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

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

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

    深入浅析Java中普通代码块、构造代码块与静态代码块

    例如,在给定的示例中,静态代码块在程序启动时首先执行,然后是`main`方法,接着是构造代码块(每次创建对象时),最后是构造函数。如果类中还有其他类,如类`A`,那么`A`的静态代码块会在`structure`类的`main`...

    举例说明Java中代码块的执行顺序

    下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...

    Java类的完整构造执行顺序

    而类初始化则是指在类首次被使用时,JVM执行的一系列初始化操作,包括静态变量赋值、静态代码块执行等。 根据题目提供的内容,我们可以总结出Java类构造执行的详细步骤,这些步骤确保了类的正确初始化以及对象的...

    java中的static变量,方法,代码块

    2. 对象创建时,先执行类中的非静态代码块,再调用构造函数。 通过上述分析,我们可以清楚地看到`static`关键字在Java中是如何被运用的,及其在变量、方法和代码块管理上的独特优势。理解这些概念,对于编写高效、...

    JAVA程序:静态块代码

    它的执行顺序早于类的非静态初始化块和构造函数。当类第一次被加载时,静态块按照它们在代码中的顺序依次执行。 下面是一个简单的静态块示例,展示了如何使用静态块初始化静态变量: ```java public class ...

    java中静态与非静态的区别

    - 构造函数的执行顺序大致为:先分配静态成员的内存空间,然后执行静态成员初始化,接着执行静态构造函数;之后分配对象实例的内存空间,执行实例成员初始化,最后执行实例构造函数。 #### 三、静态成员与实例成员...

    Java——对象初始化顺序使用详解

    在上面的例子中,我们已经看到了构造代码块和构造函数的执行顺序:父类的构造代码块先执行,然后是父类的构造函数,最后是子类的构造代码块和构造函数。 四、初始化顺序的总结 1. 首先,执行类的静态初始化,包括...

    java代码的初始化顺序demo

    例如,可能会有一个类包含静态和非静态初始化块,一个构造函数,以及一些静态和实例变量。通过观察它们的执行顺序,你将更好地理解Java的初始化流程。 总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和...

    Java 八股文背诵版(113 道)

    - 详细的先后顺序:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数 7. Java 代码块执行顺序: ...

    java, java培训,团队转型技术培训

    - **类加载**:首先执行静态变量和静态代码块的初始化。 - **实例化**:接着执行成员变量的初始化,然后是构造代码块和构造方法。 类的执行顺序总结如下: 1. 静态变量的初始化 2. 静态代码块的执行 3. 成员变量...

    详解java中的四种代码块

    // 非静态代码块 // ... } public Test3() { // 构造函数 // ... } } ``` 了解这四种代码块的使用方式和执行时机对于Java程序员来说是基础且重要的,它们可以帮助优化代码结构,提高代码效率,并确保在多...

    类继承的初始化顺序类,继承的初始化顺序

    3. **基类非静态成员初始化**:当创建一个子类对象时,会首先调用基类的构造函数来初始化基类的非静态成员变量。 4. **子类非静态成员初始化**:接着是子类的非静态成员变量初始化。 5. **基类构造函数调用**:通过`...

    实验指导20160418计算机软件及应用IT计算机专业资料.doc

    2. **构造代码块和静态代码块**:第二题展示了构造代码块和静态代码块的执行顺序。静态代码块只在类加载时执行一次,而构造代码块则在每次创建对象时执行。在`StudentDemo`类中,静态代码块在外包的初始化阶段执行,...

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

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

    在Java中自由块的执行顺序

    4. 如果`Son`继承自`Father`,在创建`Son`的实例时,会先执行`Father`的非静态自由块和构造函数,然后执行`Son`的非静态自由块和构造函数。 需要注意的是,静态自由块仅在类加载时执行一次,即使类的实例被创建多次...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...

Global site tag (gtag.js) - Google Analytics