java 什么情况下 进行类加载(java中静态内部类什么时候加载)
大家好,如果您还对java 什么情况下 进行类加载不太了解,没有关系,今天就由本站为大家分享java 什么情况下 进行类加载的知识,包括java中静态内部类什么时候加载的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
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的比较核心的一个难题,我就针对问题做简要回答,不做深入讨论了:
1、编译和运行概念要搞清:编译即javac的过程,负责将.java文件compile成.class文件,主要是类型、格式检查与编译成字节码文件,而加载是指java*的过程,将.class文件加载到内存中去解释执行,即运行的时候才会有加载一说。
2、类的加载时机,肯定是在运行时,但并不是一次性全部加载,而是按需动态,依靠反射来实现动态加载,一般来说一个class只会被加载一次,之后就会从jvm的class实例的缓存中获取,谁用谁取就可以了,不会再去文件系统中加载.class文件了。
明白1,2点就够了,再深入要等一段才能明白了。
Java类加载机制
每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。电脑培训就得好好的为大家介绍一下。
那么什么是类的加载?
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
Java类加载机制
类加载器是Java语言的一个创新,也是Java语言流行的重要原因之一。它使得Java类可以被动态加载到Java虚拟机中并执行。类加载器从JDK1.0就出现了,最初是为了满足JavaApplet的需要而开发出来的。JavaApplet需要从远程下载Java类文件到浏览器中并执行。现在类加载器在Web容器和OSGi中得到了广泛的使用,而类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。
类的生命周期
类加载的过程中包括有加载,验证,准备,解析,初始化五个阶段。而需要注意的是在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
文章到此结束,如果本次分享的java 什么情况下 进行类加载和java中静态内部类什么时候加载的问题解决了您的问题,那么我们由衷的感到高兴!