声明:此内容参考书籍《疯狂java讲义第二版》
static修饰的成员就是类成员,static关键字不能修饰构造器,static修饰的类成员属于整个类,不属于单个实例。
类成员的生命周期:当系统第一次使用类时,系统为该类成员分配内存空间,类成员开始生效,知道该类被卸载,该类的类成员占有的内存才被系统的垃圾回收机制回收,类成员生存范围等同于该类的生命范围,当类初始化完成,类成员也不初始化完成。
类成员的访问:既可以通过类来访问,也可以通过类的对象来访问。但是通过对象来访问并不是访问该对象的所拥有的成员变量,系统不会再为类对象分配内存,也不会再次对类成员进行初始化。可以理解成当通过对象来访问类成员时,系统会在底层转换成通过该类来访问类变量。
类方法:也是类成员的一种,类方法也是属于类的,通过使用类作为调用者来调用类方法,但也可以使用对象来调用类方法。
class Person{
static int a =5;
static void test(){
System.out.println("这是类方法");
}
}
Person p=new Person();
//调用成变量
Person.a;
p.a;
//调用成员方法
Person.test();
p.test();
单例类
大部分情况下,我们把类的构造器定义为public访问权限,允许任何类自由创建该类的对象。但在某些时候,允许其他类自由创建该类的对象没有任何意义,还可能造成系统性能下降,如频繁的创建对象,回收对象带来的系统开销问题等。
如果一个类始终只能创建一个实例,则这个类被成为单例类。单例类有如下特征:
(1)构造器被private修饰。避免其他类自由创建该类的实例。
(2)提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)
(3)需要一个成员变量来保存曾经创建的对象,该成员变量需要被上面的静态方法访问,因此也需要static修饰。
class Singleton{
//使用一个变量来缓存曾经创建的实例
private static Singleton instance;
//对构造器使用private修饰,隐藏该构造器
private Singleton(){
}
//提供一个静态方法,用于返回Singleton实例
public static Singleton getInstance(){
//如果instance为null,则表明还不曾创建Singleton对象
//如果instance不为null,则表明已创建Singleton对象,将不会重新创建新的实例
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
public class SingletonTest{
public static void main(String args[]){
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1==s2);//返回true
}
}
Singleton类只能产生一个实例,所以s1==s2返回true。