天天看点

java的单例、static修饰符及static的继承

单例设计模型:

static修饰符:

①:static静态只有一份(同一个虚拟机中) (节省资源),类代码被装载内存时,静态代码分配内存,并执行,并且常驻内存。

②:static修饰成员变量,成为"类变量",属于整个类,类的共享变量。注:不能修饰局部变量。

         static是一块为整个类共有一块存储区域,静态变量只有一份,值变化后,所有访问值变化生效。

         java中用类名调用static变量和方法(对象调用也可以):类名.变量(方法名)

③:static修饰类方法,属于类方法,继承中子类可以定义相同方法,静态不支持覆盖,此时不存在继承间的多态。

④:static静态块(定义和方法平行),在类加载时执行一次,以后不再执行,一般用于初始化静态成员。

④:类的方法继承与否取决于4大访问修饰符,和static修饰符无关(static不会发生继承多态)。

        注:main()主方法定义成static,是因为加载类代码入内存的时候还没有对象这个概念。

类a:

类b继承a:

输出结果为:

b static print method

a static print method

b instance display method

2

5

8

3

initial xxxxx

initial c field

static继承:

从上面执行结果,可以反映出:

①:静态属于所有它的类,不会被继承。

②:类的继承层次模型下的多态只发生在方法(成员方法)上。

③:类的成员属性,以及静态变量,静态方法,静态块,都不发生继承。

singleton模型:

static通常用于单例设计,singleton是一种设计模式,高于语法,可以保证一个类在整个系统中(同一个虚拟机中)仅有一个对象。

在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例,具有资源管理器功能。

单例类原则:  ①只有一个实例对象;  ②自己创建自己的这一个对象;  ③通过方法提供仅有的对象给其他对象使用。

                  综之:  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

实现的三种方式:

1:饿汉式单例

2:懒汉式单例类

3:登记式单例类

singletond继承singletonc:

测试类:

输出结果为:

1&2 t

3&4 t

name is null,name to ca.singleton.singletonc

5&6 t

hello,i am a schematic of the commercial method

7&8 t

5&7 f

使用“==”比较,基本类型,引用存储空间直接存储的真实值,所以比较的值;

对于其他类类型,在任何时候“==”比较的都是地址,这种比较永远不会被覆盖。

可以看出上边的单例都存在一个对象。

如果想让高并发下多线程在单例中生效,就要保证单例对象操作的方法为线程同步(对象锁)。