class文件的加载、初始化、实例化
来源:互联网 发布:用手机淘宝搜白夜追凶 编辑:程序博客网 时间:2024/06/05 10:03
class文件的加载包含以下过程:加载(load class文件)-校验-准备-解析-初始化-实例化,上述过程是大致过程,具体过程可以参考:jvm class文件加载过程。
看下面的代码样例:
package staticclass;public class StaticClassTest { public static void main(String[] args) throws ClassNotFoundException { ClassLoader.getSystemClassLoader().loadClass("staticclass.User"); System.out.println("====="); Class.forName("staticclass.User"); System.out.println("+++++"); }}//展示class文件的加载class User{ public static int age=27; private String name; static{ System.out.println("this is static age="+age); } { System.out.println(" age ="+age); } public User(String name){ System.out.println("this is constructor age="+age); this.name=name; } public void print(){ System.out.println("this is "+name); } public static void printAge(){ System.out.println("this is static printAge age="+age); }}输出内容:=====this is static age=27+++++从输出内容看到:ClasLoader把class文件进行加载,只是把相关的class文件加载到了方法区,进行了解析,并没有进行初始化,而Class.forName除了上述步骤执行了相关的初始化。
把StaticClassTest 的main方法修改如下:
public static void main(String[] args) throws ClassNotFoundException { Class.forName("staticclass.User"); System.out.println("+++++"); User u = new User("jkf"); }输出内容:this is static age=27+++++ age =27this is constructor age=27从输出内容来看:Class.forName进行了初始化,而new User进行了实例化,但是static代码块,仅执行了一次,并且代码块的执行优先构造函数。
把StaticClassTest 的main方法修改如下:
public static void main(String[] args) throws ClassNotFoundException { int age = User.age; System.out.println("----------"); User u = new User("jkf"); }输出内容:this is static age=27---------- age =27this is constructor age=27从输出内容看:当我们调用类的静态属性或者方法时,仅进行了类的初始化,并不会进行实例化。
综上所述:
1 class文件的加载可以通过:ClassLoader进行加载。
2 class文件的初始化:Class.forName;调用类文件的静态方法或静态属性。
3 class文件的实例化:通过new;或者通过Class对象的newInstance()方法。
4 当然class文件的初始化包含了class文件的加载,同样class文件的实例化也包含上述两个步骤。
5 说一个有关数组的问题:
package com.classLoader;/**class对象的加载时机**/public class ClassLoaderTime { public static void main(String[] args) { ClassLoader[] arr = new ClassLoader[4]; System.out.println("数组赋值"); arr[0]=new ClassLoader(); }}class ClassLoader{ static{ System.out.println("对象初始化"); }}输出内容:数组赋值对象初始化从输出内容来看,对象数组创建时,并没有加载初始化对象,而是在数组手动赋值时进行加载初始化,这是因为我们new对象了
阅读全文
0 0
- class文件的加载、初始化、实例化
- Class文件加载及其初始化过程
- Java类加载机制 .class文件加载 .class文件实例化对象 Spring自动包扫描Bean原理
- Class文件的加载过程
- class文件的动态加载
- Class文件的加载过程
- java class文件的加载
- Java的Class对象的加载和初始化
- 自定义类加载器:从网上加载class到内存、实例化调用其中的方法
- 创建一个自定义类加载器实现class文件(字节码文件)的加密解密的实例
- JVM加载class文件的原理机制
- JVM加载class文件的原理机制
- JVM加载class文件的原理机制
- JVM加载class文件的原理机制
- JVM加载class文件的原理机制?
- JVM加载class文件的原理机制
- PHP自动加载class文件的方案
- JVM加载class文件的原理机制
- 联动滑动效果及不同Item效果的RecyclerView
- C++ 虚函数浅析与总结
- LeetCode [70. Climbing Stairs]
- Spring Boot (3) Jap使用
- 圆形进度条+二维码扫描+自定义组合控件标题栏+自定义矩形view+接口回调方法
- class文件的加载、初始化、实例化
- java 监听器
- SSM实现简单的CRUD之Service层
- im2col的原理和实现
- css的学习
- 有关dos的一些基本命令
- UVA
- sdnu1080.tan2x
- 自学:字符串的操作