首页编程java编程java什么时候加载类?Java中的类是什么时候被加载到虚拟机

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

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

大家好,今天给各位分享java什么时候加载类的一些知识,其中也会对Java中的类是什么时候被加载到虚拟机进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

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

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

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

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

public class Test6{

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

public static void main(String[] args){

new B();

new A.C();

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

}

}

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的比较核心的一个难题,我就针对问题做简要回答,不做深入讨论了:

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

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

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

java 类加载先后顺序

1.父类静态代码块;

2.子类静态代码块;

3.父类非静态代码块;

4.父类构造函数;

5.子类非静态代码块;

6.子类构造函数;

举例:

public class ExA{

static{

System.out.println("父类静态代码块。");

}

public ExA(){

System.out.println("父类构造函数。");

}

{

System.out.println("父类非静态代码块。");

}

public static void main(String[] args){

new ExB();

}

}

class ExB extends ExA{

static{

System.out.println("子类静态代码块。");

}

{

System.out.println("子类非静态代码块。");

}

public ExB(){

System.out.println("子类构造函数。");

}

}

执行结果:父类静态代码块。子类静态代码块。父类非静态代码块。父类构造函数。子类非静态代码块。子类构造函数。

好了,文章到此结束,希望可以帮助到大家。

java中什么是属性隐藏文件 文件属性中的只读和隐藏表示什么意思啊 夜书所见 夜书所见古诗朗读视频