例如 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.饿汉
在 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对象 不都是在类加载时创建的吗。
新人,求给位前辈解答!!!
还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象
还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象看清楚,他说的是在Student类中定义private static 内部类,在内部类中定义static Student类型变量 single
还有类加载的时候会触发静态变量的赋值,静态块的执行,但方法肯定是需要调用时才会执行的,所以说第一种类加载时候创建了对象,第二种调用方法时候创建对象看清楚,他说的是在Student类中定义private static 内部类,在内部类中定义static Student类型变量 single
所以觉得很奇怪啊,这种用法有点奇葩,太绕了,为啥不用枚举呢?
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对象,内存利用率高
!!!!!!!!
我的疑问:内部类的静态属性不是在类加载的时候初始化吗?
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("内部类加载");
}
}
}
/*
类加载
激活函数
*/