美文网首页Java
java什么时候发生类的初始化

java什么时候发生类的初始化

作者: 小白拌豆腐 | 来源:发表于2020-05-22 16:52 被阅读0次

会发生类初始化的情况(5点)

1.虚拟机启动时,初始化main方法所在的类。

2.调用类的静态成员(final修饰除外),静态方法。

3.new一个类的对象

4.初始化一个类,其父类先被初始化,

下面一个例子概括前4点

public class Text {

    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        Son son =new Son(); 
    }
}

class Son extends Father{   //Son类继承Father类
    static {
        System.out.println("Son类被加载!");
    }   
}

class Father{

    static {
        System.out.println("Father类被加载!");
    }
} 

运行结果是:

main类被加载!
Father类被加载!
Son类被加载!

5.使用java.lang.reflect包的按方法对类反射调用

上例子:

public class Text03 {

    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("text.Son");  
    }
}
class Son extends Father{

    static {
        System.out.println("Son类被加载!");
    }   
}
class Father{
    static {
        System.out.println("Father类被加载!");
    }
}

运行结果,与实例化Son类一样:

main类被加载!
Father类被加载!
Son类被加载!

不会发生类初始化(3点)

1.子类引用父类变量

如下:在Father类中声明一个静态变量

static int fat=100;

接下来,我们直接用子类来引用父类中的静态变量,代码如下:

public class Text03 {

    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println(Son.fat);
    }

}
class Son extends Father{
    static {
        System.out.println("Son类被加载!");
    }   
}
class Father{
    static int fat=100;
    static {
        System.out.println("Father类被加载!");
    }
}

结果显示:

main类被加载!
Father类被加载!
100

在输出语句中可以看出,子类引用父类静态变量是,没有被初识化

2.引用常量

如果我们把变量换成常量,即用final修饰,不可被重写

static final int fat=100;

其他代码与上述不变

public class Text03 {
    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println(Son.fat);
    }
}
class Son extends Father{
    static {
        System.out.println("Son类被加载!");
    }       
}
class Father{
    static final int fat=100;
    static {
        System.out.println("Father类被加载!");
    }
}

结果显示:

main类被加载!
100

没有出现父类被初识化
因为:常量在链接阶段,就存入调用类的常量池中了

3.通过数组定义 类引用,也不会触发此类的初识化

public class Text03 {
    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        Son [] son=new Son[5];
    }
}
class Son extends Father{
    static {
        System.out.println("Son类被加载!");
    }       
}
class Father{
    static {
        System.out.println("Father类被加载!");
    }
}

输出结果:

main类被加载!

相关文章

  • java什么时候发生类的初始化

    会发生类初始化的情况(5点) 1.虚拟机启动时,初始化main方法所在的类。 2.调用类的静态成员(final修饰...

  • 类什么情况下会执行初始化

    初始化一个类,包括执行这个类的静态初始化和初始化在这个类中声明的静态字段。根据Java语言规范,在首次发生下列任意...

  • 关于java子父类关系的小坑

    学过JavaSE的都知道java类在初始化的时候,如果存在直接父类,是先初始化父类,然后才初始化子类。 ...

  • 类加载时机

    面试题 输出结果 从结果可以看到:1.类初始化发生在对象初始化之前;2.类初始化只发生一次;3.父类初始化先于子类...

  • 各种面试问题汇总

    1.JAVA变量什么时候需要初始化? 像memo[][]这样的 类的成员变量不需要,因为JVM会自动给其赋值; 像...

  • Java初始化理解与总结

    Java的初始化可以分为两个部分:(a)类的初始化(b)对象的创建(a)类的初始化 **一、概念介绍: ** 一个...

  • java 动态字节码技术

    aop在java中有几种实现方式? java proxy基于接口的实现,构建目标类的实现类(全新的类),初始化的时...

  • Java类加载与反射

    Java类加载与反射 类加载、连接、初始化 JVM和类 当运行某个Java程序时,将会启动一个Java虚拟机进程,...

  • java构造器初始化与清理

    java构造器初始化先后顺序: 若此类继承于某基类,则先初始化基类,以此类推,找到最基本的父类,先对基类进行初始化...

  • Java子类初始化顺序

    Print.java Person.java Child.java 输出结果 ->很显然,子类初始化的过程: 父类...

网友评论

    本文标题:java什么时候发生类的初始化

    本文链接:https://www.haomeiwen.com/subject/jfaqahtx.html