例如  Student类的单例设计
//1.饿汉
        在 Student 类中定义private static final 修饰的Student类型变量 single,并new 一个Student对象赋值;
//2.内部类
      (1)在Student类中定义private static 内部类,在内部类中定义static Student类型变量 single,并new 一个Student对象赋值;
       (2)在Student类中定义另外一个static方法create(),获取内部类中的single变量 并返回;
总结:(1)饿汉 和内部类中single变量都是在类加载阶段赋值,所以线程安全,保证了Student对象的唯一性;
            (2)饿汉中的  Student对象石在类加载创建,内部类的Student对象石在调用creat()方法时创建,所以内部类在内存的运用上更占优势
问题:总结中的第二点  是我们老师讲的,但其实两种方式中,Student对象 不都是在类加载时创建的吗。
           新人,求给位前辈解答!!!
     

解决方案 »

  1.   

    JVM启动的时候,并不会去类加载Student类,Student类加载的时候并不会创建对象
      

  2.   

    而且你们老师确定跟你们讲的时候把private static Student single;这段说成内部类了?你这个只是静态变量,内部类是其他概念
    还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象
      

  3.   

    而且你们老师确定跟你们讲的时候把private static Student single;这段说成内部类了?你这个只是静态变量,内部类是其他概念
    还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象看清楚,他说的是在Student类中定义private static 内部类,在内部类中定义static Student类型变量 single
      

  4.   

    而且你们老师确定跟你们讲的时候把private static Student single;这段说成内部类了?你这个只是静态变量,内部类是其他概念
    还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象看清楚,他说的是在Student类中定义private static 内部类,在内部类中定义static Student类型变量 single
    所以觉得很奇怪啊,这种用法有点奇葩,太绕了,为啥不用枚举呢?
      

  5.   

    public class Student {
    String name;
    int age;
    // final static Student single1 = new Student("zs",44); //用于饿汉式
    // static Student single2 = null;//用于懒汉式
    private public Student(){

    }
    private Student (String a,int b){
    name = a;
    age = b;
    }
    //饿汉式,调用任何静态方法,都会触发类加载
    static Student createHungry(){
    return single1;
    }
    //懒汉式
    static synchronized Student createLazy(){
    if(single2 == null){
    // single2 = new Student();
    }
    return single2;
    }
    //只有调用createInnerClass方法,才会创建Student对象
    //内部类,线程安全
    private static class InnerStudent {
    static Student s = new Student();//用于内部类实现方式
    }
    static public Student createInnerClass(){
    return InnerStudent.s;
    }
    }
    各位大哥,可能我前面描叙的不是很清楚,现在直接贴代码,  
    我理解我们老师的意思:
    (1)饿汉式:类加载式创建Student对象,浪费内存
     (3)内部类方式:调用createInnerClass()方法时创建Student对象,内存利用率高
    !!!!!!!!
    我的疑问:内部类的静态属性不是在类加载的时候初始化吗?
      

  6.   


    public class test{
    public static void main(String args[]) {
    Student.active();
    }
    }class Student{
    public static void active(){
    System.out.println("激活函数");
    }
    static{
    System.out.println("类加载");
    }
    static class InnerStudent{
    static{
    System.out.println("内部类加载");
    }
    }
    }
    /*
    类加载
    激活函数
    */