初始化和实例化

 

 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 单例模式  
 


版权声明:本文为m0_59662444原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。