我在一本书上看到这个,这里的内容试讲java的构造方法私有化的
class Singleton
{
Singleton instance=new Singleton();
private Singleton()
{}
public void print()
{
System.out.println("Hello World");
}
}
这个我想请教一下,为什么这里能在类定义里实例化本类的对象?
这里还列出了另一种方式:
class Singleton
{
static Singleton instance =new Singleton();
private Singleton(){}
public void print(){
System.out.println("Hello World");
}
}
public class TestDemo
{
public static void main(String args[])
{
Singleton inst=null;
inst=Singleton.instance;
inst.print();
}
}
从这两个例子来看,为什么能这样?类中实例化本类的对象不会陷入死循环之中?这里书上还说这种方式在单例设计和多例设计中会用到
因为在实例化的时候,代码已经编译好了。编译好了,就可以执行了。
程序的执行不同于现场写代码,它是编译成功了才可以执行的。
1class Singleton
2{
3static Singleton instance =new Singleton();
4private Singleton(){}
5public void print(){
6System.out.println("Hello World");
7}
楼主的最大疑问是为什么第3行代码能执行?
因为当执行时,虚拟机是执行的Singleton.class中的代码,new Singleton()是先在堆区中开辟一空间能存Singleton对象,然后再调用Singleton()函数来初始化Singleton对象,调用函数的过程就是构造函数构造对象的过程
单例构造方法是私有的方法
私有的方法只能要本类中的函数来调用 ,
所以可以在类中实例化本类对象
1class Singleton
2{
3static Singleton instance =new Singleton();
4private Singleton(){}
5public void print(){
6System.out.println("Hello World");
7}
单例模式楼主看看资料就能理解了。
因为第4行的构造函数私有了,所以在类体以外的地方一般就不可能调用了,要注意是一般。
而第3行是个静态成员,也就是类变量,悲剧的是它不是public的,所以在同一包里面可以访问。一个类不可能有重名的的类成员,所以就单例了。
在构造函数里,构造函数就是一普通函数,只要符合语法,就可以随意调用重载的构造函数。