疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中构造方法私有化-->单态


 

   

  在Java中类的封装不仅仅体现在对属性的 封装,对于方法同样是可以封装的,下面谈谈对构造方法的封装。

  看段代码:

  class Demo

  {private Demo()//构造方法私有了

  {}

  public void print()

  {System.out.println("Hello World!")}

  };

  public class RefDemo

  {

  public static void main(String agrs[])

  {

  Demo d1=new Demo();

  d1.print();

  }

  };

  以上代码在运行的时候,会提示出错的,原因对象无法实例化,因为实例化一个对象的时候必须调用构造函数,而此时构造方法被私有化,因此无法从类的外部,即主函数中调用。但是解决此问题的关键也在这里,封装对内可见,对外不可见,那么我们可以从类的内部着手解决这个问题。

  class Demo

  {

  Demo d1=new Demo();//在类的内部实例化

  private Demo()//构造方法私有了

  {}

  public void print()

  {System.out.println("Hello World!")}

  };

  以上的代码,在类的内部实例化了对象,那么我们可以通过Demo的对象d1来实例化其他的Demo对象,那么怎么去把d1传递出去呢?

  象想必大家还记static关键字,是用来声明一个全局变量或者是方法的,那么我们就将以上代码改为如下:

  class Demo

  {

  static Demo d1=new Demo(); //将d1定义为static类型,可以直接用类名访问

  private Demo()//构造方法私有了

  {}

  public void print()

  {System.out.println("Hello World!")}

  };

  public class RefDemo

  {

  public static void main(String agrs[])

  {

  Demo d1=null;

  d=Demo.d1; //由于d1是static声明的,因此可以使用类名直接访问

  d1.print();

  }

  };

  这样我们就完成了对,私有构造方法,如何声明并实例化,并且拿到类外。但是,还有个问题就是单态!

  从以上代码可以看出,有不合理之处,原因在于,类中的方法都是要求封装的,我们需要对d1进行封装,封装后外部又无法直接访问,因此需要定义一个方法,由于是对static属性访问因此,我们定义一个static方法,取得实例。

  如此一来,声明的所有实例,其实,都是同一块对内存空间,这就是单态!

  那么,单态有什么应用呢?

  想想电脑中的回收站,其实整个电脑就一个回收站,但是,每个硬盘都有一个回收站,实际上大家指向的都是同一个回收站,只不过在形式上貌似有很多,这就是单态。