java JVM-类加载静态初始化块调用顺序

测试类加载的全过程

public class Have {

static {
    System.out.println("加载Have");//先加载Have再调用main方法
}
public static void main(String[] args) throws Exception {
    System.out.println("main方法"); //先调main方法
    A a=new A(); //先初始化父类,再初始化子类
    System.out.println(A.width);
    A a2=new A(); //第二次只会调用构造器,不会调用静态方法,类的加载和初始化只有一次
    System.out.println(A.common); //调用类里的常量时,并不会初始化该类,常量被放在常量池里

    //Class.forName("cn.sxt.in.A"); //反射调用类,也会加载静态方法

    //A[] a=new A[10];  //创建类的数组,不会初始化类

    System.out.println(B.common); //子类调用父类的常量,不会初始化本身和父类
    System.out.println(B.width); //子类调用父类非常量,则只会初始化父类
}

}

class A extends A_father{
    public static int width=100;
    public static final int common=10;
    //创建对象时,会首先运行赋值动作和static块内的内容
    static {

    System.out.println("静态初始化类");
    width=300;
}
public A(){
    System.out.println("AAA");
    }

}
class A_father{
    static {
        System.out.println("静态初始化A的父类");
    }
}
class B extends A{
    static {
        System.out.println("静态初始化B");
    }
}

原文地址:https://blog.51cto.com/14437184/2438726

时间: 2024-08-29 18:21:50

java JVM-类加载静态初始化块调用顺序的相关文章

java中的静态初始化块

Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 我们来看一段代码: 运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法.由于静态初始化块只在类加载时执行一次,所以当再次创建对

JVM 类加载过程、初始化、主动引用、被动引用、静态初始化块执行顺序

java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解

一.描述 java中类的静态代码块.构造代码块.构造方法.静态成员的初始化顺序: 首先,在类加载时,为类中的静态成员变量分配内存空间,并为其赋予默认值(整数型为0,浮点型为0.0,布尔型为false,字符型为'\u0000',引用型为null): 其次,执行静态成员变量的显式初始化操作.静态成员的初始化方法有两种,其一为在声明的时候直接初始化,其二为使用静态代码块进行初始化, 这两种初始化方式会按照在类中的出现顺序来执行,而且只在类加载的时候执行一次. 再次,如果创建了类的对象,便会在堆中为类的

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

class Root{ static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); }}class Mid extends Root{ static{ System.out.println("Mid的静态初始化块");

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

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

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

Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 参考文章     http://my.oschina.net/leoson/blog/103251 1. 一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 2. 两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量

Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块 静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值. 2. (非静态)初始化块 (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值. 3. 构造方法 构造方法在每次生成实例对象时都执行一次 4. 执行顺序:静态初始化块 --> 初始化块 --> 构造方法 测试代码如下: 1 public class Son extends Father { 2 static int sNum = 0; 3 int num =