A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 很儍↙佷迗眞 初级黑马   /  2012-9-17 09:55  /  1531 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 很儍↙佷迗眞 于 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吗???

评分

参与人数 1黑马币 +30 收起 理由
王德升 + 30 麻烦去上面通道改下名字,谢谢!.

查看全部评分

4 个回复

倒序浏览
晕,发现了,那2个属性都得有get方法,然后调用get获取
回复 使用道具 举报
本帖最后由 yangjianfengzj 于 2012-9-17 14:53 编辑

{:soso_e100:}{:soso_e100:}我试了下代码,结果是这样的,不能打印正确的类属性值,是因为,打印对象信息,是调用继承的toString() ;
可以用重写方法来获得自己想要的结果,至于GET,SET, 好像是什么标准 JAVABEAN 什么的,刚初学,不太懂,
回复 使用道具 举报
  看来楼主对于单例不是太清楚吧

  • package com.itcast.first;
  • class Person{
  •                 private String name;
  •                 private int age;
  •          //定义一个构造方法
  •                 private static Person p = new Person("lisi", 20);
  •                 private Person(){}
  •                 private Person(String name,int age){
  •                         this.name = name;
  •                         this.age = age;
  •                 }
  •                 public static Person getPerson()
  •                 {
  •                         return p;
  •                 }
  •                 private void eat(){
  •                         System.out.println("eat");
  •                 }
  •      public String toString() {
                    // TODO Auto-generated method stub
                    return "name:"+this.name+"age"+this.age;  
                  /*   覆写父类的toString()方法,默认的toString()返回的是
                        getClass().getName() + '@' + Integer.toHexString(hashCode())
                */
                    }
  • }
  • public class Demo9 {
  •         public static void main(String[] args) {
  •                 //Person p = new Person("lisi", 20);
  •                 Person pp = Person.getPerson(); //这里得到的是Person默认的实例对象
  •                 System.out.println(pp.toString());//覆写后调用自己写的toString()方法,这里不添加toString()方法也可以
  •         }
  • }
  关于单例模式重点在于:一旦把该类的构造器隐藏起来,则需要提供一个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();
    }
}



评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
武庆东 发表于 2012-9-17 16:18
看来楼主对于单例不是太清楚吧

toString方法什么时候使用,是不是如果打印出结果为哈希值,就复写他转为String??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马