前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中构造方法私有化

java中构造方法私有化

作者头像
用户7886150
修改2020-12-15 10:37:09
1.1K0
修改2020-12-15 10:37:09
举报
文章被收录于专栏:bit哲学院

参考链接: Java中的私有构造函数和Singleton类

1. 类中的封装性不光体现在对属性的封装上,实际上方法也是可以被封装的,当然在方法封装中也包含了对构造方法的封装。 

 举例: 

 public class GzPrivate2 {  

  public static void main(String[] args) { 

    //声明对象,不会报错 

    Singleton s = null; 

    //实例化对象,调用了私有化的构造方法,程序报错 

    s = new Singleton();//错误,无法实例化对象 

   } 

  } 

  class Singleton{ 

   private Singleton(){ 

  //将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见! 

  } 

  public void prit(){ 

   System.out.println("nishuibaichuan"); 

  } 

 } 

 以上程序运行报错!因为此类Singleton中的构造方法被私有化了,只能在本类Singleton中可见,不能再外部直接实例化! 

 既然再外部不可用,那么我们就在内部使用! 

 举例: 

 public class GzPrivate {  

   public static void main(String[] args) { 

    //声明对象,不会报错 

    Singleton1 s = null; 

   } 

  } 

  class Singleton1{ 

   //在内部产生本类的实例化对象 

   Singleton1 singleton1 = new Singleton1(); 

   private Singleton1(){ 

   //将构造方法进行了封装,私有化,这时候此构造方法只能在本类中可见! 

   } 

   public void prit(){ 

    System.out.println("nishuibaichuan"); 

   } 

 } 

 由上代码可知,当构造方法在其类中被私有化,那么就只能在其本类内部中实例化对象了! 

 2.把在内部实例化的对象拿到外部类,这样外部就可以直接通过此对象实例化了。正常情况下,在1中可以知道 singleton1属性只能通过Singleton类的实例化对象才能调用,如果在没有实例化对象的时候依然可以取得singleton1对象,则就需要singleton1声明为static访问类型,因为它不仅让所有对象共享,更重要的是它可以直接通过使用类名称进行访问! 

 举例: 

 public class GzPrivate4 {  

   public static void main(String[] args) { 

    Singleton3 s1 = null;//声明对象 

    s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值 

    s1.fun(); 

   } 

  } 

  class Singleton3{ 

   //实例化s静态对象 

   private static Singleton3 s = new Singleton3(); 

   public static Singleton3 getSingleton3(){ 

    return s; 

   } 

   private Singleton3(){ 

    System.out.println("NISHUIBAICHUAN"); 

   } 

   public void fun(){ 

    System.out.println("nishuibaichuan"); 

   } 

 } 

 运行结果: 

 NISHUIBAICHUAN nishuibaichuan 

 构造方法私有化之后,就可以通过以上的形式取得实例化对象。 

 程序的意义:先看如下代码 

 public class GzPrivate4 {  

  public static void main(String[] args) { 

   Singleton3 s1 = null;//声明对象 

   Singleton3 s2 = null;//声明对象 

   Singleton3 s3 = null;//声明对象 

   s1 = Singleton3.getSingleton3();//用类名称.对象名,来给s1赋值 

   s2 = Singleton3.getSingleton3();//用类名称.对象名,来给s2赋值 

   s3 = Singleton3.getSingleton3(); 

   s1.fun(); 

   s2.fun(); 

   s3.fun(); 

  } 

 } 

 class Singleton3{ //实例化s静态对象  

  private static Singleton3 s = new Singleton3(); 

  public static Singleton3 getSingleton3(){ 

   return s; 

  } 

  private Singleton3(){ 

   System.out.println("NISHUIBAICHUAN"); 

  } 

  public void fun(){ 

   System.out.println("nishuibaichuan"); 

  } 

 } 

 运行结果: 

 NISHUIBAICHUAN nishuibaichuan nishuibaichuan nishuibaichuan 

 由上代码可知:不管外部声明了多少个Singleton4的对象,但是最终结果都是通过getSingleton4()方法取得的实例化对象,也就是说,此时的s1,s2,s3实际上都使用了一个对象的引用:s;因为他说static类型,为所有对象所共享的! 

 那么以上的设计模式是属于单态设计模式(单例设计模式):Singleton4 

 如果现在不希望一个类产生过多的对象的话,则就必须使用单态设计模式,而且使用 

 单态设计模式在以后的java学习中会经常遇到,因为在java的支持类库中,大量的采用了此种设计模式。 

 所谓的单态就是在入口处(构造方法)限制了对象的实例化操作。 

 总结:单态设计模式的核心就是将类中的构造方法私有化,之后在类的内部产生实例化对象,并可通过该类的静态方法返回实例化对象的引用。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档