黑马程序员技术交流社区

标题: 构造函数,单例 [打印本页]

作者: 很儍↙佷迗眞    时间: 2012-9-17 09:55
标题: 构造函数,单例
本帖最后由 很儍↙佷迗眞 于 2012-9-17 11:06 编辑

一般产生单例是不是就是将构造函数私有化?然后用属性为对象,在方法中返回对象,接着其他类调用它的方法产生对象,我的理解没错吧?但是我写的怎么这样了。。。
  1. package com.itcast.first;

  2. class Person{
  3.                 private String name;
  4.                 private int age;
  5.                 private static Person p = new Person("lisi", 20);
  6.                 private Person(){}
  7.                 private Person(String name,int age){
  8.                         this.name = name;
  9.                         this.age = age;
  10.                 }
  11.                 public static Person getPerson()
  12.                 {
  13.                         return p;
  14.                 }
  15.                 private void eat(){
  16.                         System.out.println("eat");
  17.                 }
  18. }

  19. public class Demo9 {
  20.         
  21.         public static void main(String[] args) {
  22.                 //Person p = new Person("lisi", 20);
  23.                 Person pp = Person.getPerson();
  24.                 System.out.println(pp);//lisi 20
  25.         }

  26. }
复制代码
  1. com.itcast.first.Person@1c78e57
复制代码
怎么回事,不应该是lisi 20吗???
作者: 很儍↙佷迗眞    时间: 2012-9-17 11:08
晕,发现了,那2个属性都得有get方法,然后调用get获取
作者: 杨建峰    时间: 2012-9-17 11:35
本帖最后由 yangjianfengzj 于 2012-9-17 14:53 编辑

{:soso_e100:}{:soso_e100:}我试了下代码,结果是这样的,不能打印正确的类属性值,是因为,打印对象信息,是调用继承的toString() ;
可以用重写方法来获得自己想要的结果,至于GET,SET, 好像是什么标准 JAVABEAN 什么的,刚初学,不太懂,
作者: 武庆东    时间: 2012-9-17 16:18
  看来楼主对于单例不是太清楚吧

  关于单例模式重点在于:一旦把该类的构造器隐藏起来,则需要提供一个public方法作为该类的访问点,用于创建该类的对戏那个,且该方法必须使用static修饰(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)
   单例模式代码:
   class Singleton{
      //使用一个变量来缓存曾经创建的实例
      private static Singleton instance;
     //将构造器使用private修饰,隐藏该构造器
     private Singleton(){}
     //提供一个静态方法,用于返回Singleton实例
    //该方法可以加入自定义的控制,保证只产生一个Sinleton对象
     public static Singleton getSingleton(){
         //如果instance为null,表明还不曾创建Singleton对象
         //如果instace不为null,则表明已经创建了Singleton对象
         if(instance==null){
             //创建一个Singleton对象,并将其缓存起来
             instance=new Singleton();
         }
         return instance;
     }
    }
     public class TestSingleton {
          public static void main(String[] rgs){
        Singleton s=Singleton.getSingleton();
    }
}




作者: 严海荣    时间: 2012-9-17 16:55
武庆东 发表于 2012-9-17 16:18
看来楼主对于单例不是太清楚吧

toString方法什么时候使用,是不是如果打印出结果为哈希值,就复写他转为String??




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2