Java中单例模式中为何静态成员变量可以访问非静态方法?比如:单例模式的唯一实例。由此引发的一些思考。
第一次写****博客,记录下自己发现的一个关于单例模式的一个小发现。
为何静态成员变量可以访问非静态方法。比如:单例模式的唯一实例。
引子:单例模式的一个简单例子
问题:可以看出:instance作为一个静态变量(instance)被实例化后就可以调用非静态方法(nonStaticMethod)了。
根据我们的常识理解:
1、类的静态成员是在类加载的时候初始化的,可以利用类或类的实例对象去调用;
2、反过来,类的静态成员(静态变量或静态方法)是不能访问非静态的类成员(普通变量和方法)的,因为:非静态的类成员属于对象,类对象实例化才会加载。那么,单例模式中的静态成员变量是如何访问非静态方法的呢?
分析:其实,静态成员变量被实例化就有了新名字"静态对象"。因此,要弄清楚上面的问题,我们就需要知道静态成员变量和静态对象的区别?
从生命周期看:
1、静态成员变量: 在类加载的时候,类加载完成,就分配完空间;直到类被卸载时空间被回收。静态对象是静态成员变量被实例化的一个对象,他拥有静态的属性:属于类,类的实例对象共享;同时具备对象的属性,可以调用对象自身的方法和属性(不论是静态成员,还是非静态成员)。
2、非静态成员: 创建对象的时候分配空间; 对象变为垃圾空间被回收的时候被销毁
结论:为何单例模式中的静态变量可以访问非静态方法?
1、静态变量被实例化后,就变成了静态对象,静态对象也是对象,当然可以调用对象中的静态方法和非静态方法了。
2、需要注意的是:静态对象是全局唯一的,一旦静态对象引用改变了。则所用利用类.静态对象.调用的方法都会改变。
备注。1
-
第一次发博客,内容可能有点乱。后续不断完善。 ↩︎