理解类成员:类成员就是被static修饰的的成员
类变量属于整个类,当类初始化完成后,类变量也被初始化完成
类变量既可以通过类来访问,也可以通过对象访问,但是通过对象访问只是一种假象,通过对象访问依然是该类的类变量,可以这样理解:当通过对象来访问类变量时,系统会
在底层转换为通过该类来访问类变量
public class NullAccessStatic {
public static int id;
private static void test(){
System.out.println("static的静态方法");
}
public static void main(String args[]){
NullAccessStatic nas = null;
nas.id=12;
System.out.println(id);//输出:12
nas.test();//输出:static的静态方法
//如果null对象访问实例成员,将会引发异常,因为null表示该对象根本不存在
//所以采用对象来调用类方法和类变量时,是一种假象,系统会在底部转换为通过该类来访问类变量。
}
}
类成员不能访问实例成员,因为类成员是属于类的,类成员的作用比实例成员作用域更大,完全可能出现类成员已经初始化完成,但实例成员还不曾初始化的情况,如果允许类
成员访问实例成员将会引起大量错误
单例类:如果一个类始终只能创建一个实例,则这个类被称为单例类
class Singleton{
//使用一个类变量来缓存曾经创建的实例
private static Singleton instance;
//对构造器使用private修饰,隐藏该构造器
private Singleton(){
}
//提供一个静态方法,用于返回Singleton实例
//该方法可以加入自定义控制,保证只产生一个Singleton对象
public static Singleton getInstance(){
//如果instance为null,则表明还不曾创建Singleton对象
if(instance == null){
//创建一个Singleton对象,并将其缓存起来
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
}
}
上面通过getInstance方法提供的自定义控制,保证只产生一个实例。所以在main方法中,看到产生的两次Singleton对象实际上是同一个对象