

java类的初始化和实例化区别 - pu20065226 - 博客园

接口中的变量必须是 static final 修饰的初始化的变量
抽象类只能被继承 继承的子类才可以进行重写抽象方法 不能被实现
类加载器:
将编译后的class物理文件加载到jvm虚拟机内存中 这个是由类加载器完成的
bootstrapClassLoader 根类加载器 lib jr.jar
extension ClassLoader 扩展类加载器 lib/ext/
Applacation ClassLoaderLoader 应用类加载器
类加载时机:
创建类对象/ 调用类的方法/ 访问类或者类变量 或者 为该比例饿变量赋值
使用反射方式创建还会类的Class对象
出初始化子类
java.exe命令运行某类
类加载过程:
1)加载 :
通过类的全限类名来获取此类的二进制字节流
通过流将字节码文件加载到内存
在内存中生成一个代表这个类的Java.long.Class对象
任何类被使用时都会为此创建一个Class对象
2)连接:
验证: 检查载入Class文件数据的正确性; 是否符合虚拟机的要求
准备 : 为static变量分配存储空间 默认 初始值为null;
解析 :将类中的符号引用替换为直接引用 如果本类中用到其他的类 将符号转化为其他类的内存地址
3)初始化 :
给静态变量进行赋值 static String name = "nihao" 默认初始化值为null;
这个阶段是为常量字段赋值,然后执行静态代码块,将一堆静态代码块方法包装成<clinit>方法
执行,这个方法会加锁,有jvm来保障<clinit>方法只会执行一次。
双亲委派机制:
当一个类被加载是。先查询该是否别加载过,没有则委托父类加载器一般情况是appClassLoader委托extensionClassloader()再委托Bootstrapclassloader(),
顶层没有则会向下层一层一层加载,
实现双亲委派机制的原因:
沙箱安全机制:防止核心类库被篡改,比如自己在类路径下定义一个java.lang.String类,是无法被加载的。
避免类重复加载:当父类已经加载该类时,子类加载器不需要再次加载,保证了类的唯一性。
单例模式:使用反射暴力构建对象
防止使用if判断即可
private Student(){
//如果外界使用反射暴力构造方法进行创建对象,可以使用判断排除异常
if(Student != null){
throw new RunTimeExxception();
}
}
初始化过程调用clinit()方法
初始化是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收
集类中的所有类变量的赋 值动作和静态语句块(static)中的语句合并产生的。
在这个过程中instance已经被实例化了。并且虚拟机JVM会保证一个类 的<clinit>()
方法在多线程的环境中被正确加锁和同步。因此他是天然线程安全的
创建单例模式 懒汉式 :空间换时间 饿汉式:时间换空间 通过静态内部类延迟加载 饿汉式 防止反射判断对象
饿汉式 单例模式 线程是安全的 在类初始化阶段 调用clinit方法创建
public class SingletonClass{
private static SingletonClass singletonClass = new SingletonClass();
private SingletonClass(){
//防止通过反射暴力创建对象
if(null != singletonClass){
throw new RunTimeException();
}
}
public static SingletonClass getInstance(){
return singletonClass;
}
}
懒汉式 单例模式 用到时才加载 线程不安全 (加锁)
public class SingletonClass {
private static SingletonClass singletonClass = null;
public static synochoronized SingletonClass getInstance(){
if(singletonClass = null){
singletonClass = new SingletonClass();
}
return singletonClass;
}
private SingletonClass (){
if(singletonClass != null){
throw new RunTimeException();
}
}
}
通过静态内部内延迟加载 线程安全 不占用内存
public class SingletonClass {
private SingletonClass(){
//静态变量一但别调用类就会被加载 外部类就会被加载到内存
if(InnerSingletonClass.singletonClass != null){
// 防止反射暴力创建对象
throw new RunTimeException();
}
}
// 静态内部类
private static class InnerSingletonClass{
private static SingletonClass singletonClass = new SingletonClass();
}
public static SingletonClass getInstance(){
return InnerSingletonClass.singletonClass;
}
}
singleton 单例模式