首页编程java编程java中类什么时候加载(java中静态内部类什么时候加载)

java中类什么时候加载(java中静态内部类什么时候加载)

编程之家2023-10-11103次浏览

今天给各位分享java中类什么时候加载的知识,其中也会对java中静态内部类什么时候加载进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

java中类什么时候加载(java中静态内部类什么时候加载)

java中类的显示初始化是在什么时候执行的

java中类的显示初始化会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用包括:

1.创建类的实例

2.调用类的静态方法

java中类什么时候加载(java中静态内部类什么时候加载)

3.使用类的非常量静态字段

4.调用Java API中的某些反射方法

5.初始化某个类的子类

java中类什么时候加载(java中静态内部类什么时候加载)

6.含有main()方法的类启动时

初始化一个类包括两个步骤:

1、如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类

2、如果类存在一个初始化方法,就执行此方法

注:初始化接口并不需要初始化它的父接口。

Java中的类是什么时候被加载到虚拟机

这个问题java的比较核心的一个难题,我就针对问题做简要回答,不做深入讨论了:

1、编译和运行概念要搞清:编译即javac的过程,负责将.java文件compile成.class文件,主要是类型、格式检查与编译成字节码文件,而加载是指java*的过程,将.class文件加载到内存中去解释执行,即运行的时候才会有加载一说。

2、类的加载时机,肯定是在运行时,但并不是一次性全部加载,而是按需动态,依靠反射来实现动态加载,一般来说一个class只会被加载一次,之后就会从jvm的class实例的缓存中获取,谁用谁取就可以了,不会再去文件系统中加载.class文件了。

明白1,2点就够了,再深入要等一段才能明白了。

java中静态内部类什么时候加载

只有在加载内部类的时候才初始化

看懂以下的代码,那么对于类的加载,基本上就没问题了,最后类的加载过程的解释

public class Test6{

public static void main(String[] args){

new B();

new A.C();

}

}

class A{

private P p1= new P("A--p1");

static P p3= new P("A--p3");

public A(){

System.out.println("A()");

}

private P p2=new P("A--p2");

static{

new P("A--static");

}

{new P("A{...}");}

public static class C{

private P p1= new P("C--p1");

static P p3= new P("C--p3");

public C(){

System.out.println("C()");

}

private P p2=new P("C--p2");

static{

new P("C--static");

}

{new P("C{...}");}

}

}

class B extends A{

private P p1= new P("B--p1");

static P p3= new P("B-- p3");

public B(){

System.out.println("B()");

}

public P p2= new P("B-- p2");

static{

new P("B-- static");

}

{new P("B{...}");}

}

class P{

public P(String s){

System.out.println(s);

}

}

/*

有父类的情况

1.加载父类

1.1为静态属性分配存储空间并赋初始值

1.2执行静态初始化块和静态初始化语句(从上至下)

2.加载子类

2.1为静态属性分配存储空间

2.2执行静态初始化块和静态初始化语句(从上至下)

3.加载父类构造器

3.1为实例属性分配存数空间并赋初始值

3.2执行实例初始化块和实例初始化语句

3.3执行构造器内容

4.加载子类构造器

4.1为实例属性分配存数空间并赋初始值

4.2执行实例初始化块和实例初始化语句

4.3执行构造器内容

5回到main()

内部类的加载过程也一样

java的类加载后什么时候会被释放

java的类加载后且当使用阶段完成之后,java类就进入了卸载阶段,也就是所谓的释放。

使用阶段包括主动引用和被动引用,主动饮用会引起类的初始化,而被动引用不会引起类的初始化。

一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况,如图所示:

PS:关于类的卸载,在类使用完之后,如果满足下面的情况,类就会被卸载:

该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

加载该类的ClassLoader已经被回收。

该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。

关于本次java中类什么时候加载和java中静态内部类什么时候加载的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

吉林舒兰市属于哪里 舒兰市归哪个市管java oop是什么 java面试提问:什么是OOP