类与对象 Spring虚拟机
程序员文章站
2022-06-08 21:34:23
...
在面向对象中讲,类是对象群体的抽象,对象是类的实例, 类做为对象的模板可以生成无数多个实体,每一个实体都是类的一种特例.
这是普通的情况,也是就一个类对应多个对象.
有普通就有特殊,
一个类没有实例对象,如工具类.
一个类只有一个实例对象,如单体类,
一个类有有限数量的实例对象,如枚举类.
定义一个工具类:
要注意的是:工具类的访问修饰符根据使用范围来定.
构造方法推荐使用private修饰符,以关闭实例化和子类化.
虽然Java中使用对象调用static方法是可以的,但这是不规则的写法,
子类化一个工具类是没有意义的,抽象类才是应该被子类化,具体类都不推荐子类化,子类化可以做到复用,但子类化最大的用处是为了封装变化的代码,进行多态调用.
定义一个单体类:
要注意的是:定义静态字段,并用静态代码块初始化.效果和用静态初始化语句相同,静态代码块和静态初始化语句在类型初始化时都会被虚拟机整到一个静态初始化方法中去.
如果用lazy加载方法要注意同步,如果不同步可能会现线程争用情况.
静态代码块不会出现线程同步问题在于静态数据的初始化是类型初始化的一部分,虚拟机会自动保证线程安全.
最后一个方法是在单体类实现Serializable接口后用于分布式环境下的正确性.反序列化本身是另一种创建对象的方式,初始化对象的数据是二进制流,显式的或默认的readObject方法都会重新生成一个新的对象,readResolve方法返回的对象会替代掉反序列化生成的对象.
定义一个枚举类:
要注意的是:count与SPRING,SUMMER,AUTUMN,WINTER在类中声明的先后顺序.像这种情况,count有无初值没有关系,count总是从零算起,如果count声明在上面,则按count的初始值算起,这个也是静态数据的初始化问题.
这里没有实现Serializable接口,如果实现了,处理方式与上面的单体类处理方式相同.
这种方式提高到了语法支持的高度.功能更加丰富.
总结:根据类的使用方式,针对不同的情况加以处理.
这是普通的情况,也是就一个类对应多个对象.
有普通就有特殊,
一个类没有实例对象,如工具类.
一个类只有一个实例对象,如单体类,
一个类有有限数量的实例对象,如枚举类.
定义一个工具类:
public class XXXUtil { private XXXUtil() { } public static void xxxxMethod() { } /* *其他工具方法 */ }
要注意的是:工具类的访问修饰符根据使用范围来定.
构造方法推荐使用private修饰符,以关闭实例化和子类化.
虽然Java中使用对象调用static方法是可以的,但这是不规则的写法,
子类化一个工具类是没有意义的,抽象类才是应该被子类化,具体类都不推荐子类化,子类化可以做到复用,但子类化最大的用处是为了封装变化的代码,进行多态调用.
定义一个单体类:
import java.io.Serializable; public class Singleton implements Serializable{ private static final serialVersionUID = 2342352342L; private static final Singleton INSTANCE; static { INSTANCE= new Singleton(); } private Singletion() (){ } public static Singleton getInstance() { return INSTANCE; } public synchronized void xxxxMethod() {} /* *其它方法. */ private Object readResolve() throws ObjectStreamException { return INSTANCE; } }
要注意的是:定义静态字段,并用静态代码块初始化.效果和用静态初始化语句相同,静态代码块和静态初始化语句在类型初始化时都会被虚拟机整到一个静态初始化方法中去.
如果用lazy加载方法要注意同步,如果不同步可能会现线程争用情况.
静态代码块不会出现线程同步问题在于静态数据的初始化是类型初始化的一部分,虚拟机会自动保证线程安全.
最后一个方法是在单体类实现Serializable接口后用于分布式环境下的正确性.反序列化本身是另一种创建对象的方式,初始化对象的数据是二进制流,显式的或默认的readObject方法都会重新生成一个新的对象,readResolve方法返回的对象会替代掉反序列化生成的对象.
定义一个枚举类:
//jdk1.5之前 public class Season { public static final Season SPRING = new Season("spring"); public static final Season SUMMER = new Season("summer"); public static final Season AUTUMN = new Season("autumn"); public static final Season WINTER = new Season("winter"); private static int count; private int index = count++; private String name; private Season(String name){ this.name = name; } public int getIndex() { return this.index; } public String getName() { return this.name; } }
要注意的是:count与SPRING,SUMMER,AUTUMN,WINTER在类中声明的先后顺序.像这种情况,count有无初值没有关系,count总是从零算起,如果count声明在上面,则按count的初始值算起,这个也是静态数据的初始化问题.
这里没有实现Serializable接口,如果实现了,处理方式与上面的单体类处理方式相同.
//jdk1.5以后 public enum Season2 { SPRING,SUMMER,AUTUMN,WINTER; }
这种方式提高到了语法支持的高度.功能更加丰富.
总结:根据类的使用方式,针对不同的情况加以处理.
下一篇: JZ2440裸机点亮LED【原创】