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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁錦泰 黑马帝   /  2012-5-19 21:34  /  2400 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁錦泰 于 2012-5-19 22:02 编辑
  1. public class Student {

  2.         private String name;
  3.         private int age;

  4.         private Student() {

  5.         }

  6.         private static Student s = new Student();

  7.         public static Student getInstance() {
  8.                 return s;
  9.         }

  10.         public void setName(String name) {
  11.                 this.name = name;
  12.         }

  13.         public String getName() {
  14.                 return name;
  15.         }

  16.         public void setAge(int age) {
  17.                 this.age = age;
  18.         }

  19.         public int getAge() {
  20.                 return age;
  21.         }

  22.         public static void main(String[] args) {
  23.                 // TODO Auto-generated method stub
  24.                 Student s1 = Student.getInstance();
  25.                 s1.setName("zhangsan");
  26.                 System.out.println(s1.getName());
  27.                 s1.setAge(20);
  28.                 System.out.println(s1.getAge());
  29.                 Student s2 = new Student();
  30.                 s2.setName("lisi");
  31.                 System.out.println(s2.getName());
  32.                 s2.setAge(21);
  33.                 System.out.println(s2.getAge());
  34.         }

  35. }
复制代码
帮忙分析一下我哪里写错了,运行竟然可以分别输出两个人的姓名和年龄

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

12 个回复

正序浏览
蒋映辉 发表于 2012-5-19 21:50
因为你的main方法跟你的单例模式在同一个类里边,然后对于构造方法的私有就无效了
private static Student  ...

一步到位,解释得清楚!!!! 给力。。。。
回复 使用道具 举报
踩单车的幸福 发表于 2012-5-19 21:40
你坑我呢哥哥  你这就在本类里边得瑟呢  把主函数写到其他类里边得瑟去  ...

你这么说我就懂了,我刚写时大意了,在本类中可以访问被private修饰的成员,所以即使被private修饰,其构造函数依然可以建立对象。
回复 使用道具 举报
袁錦泰 发表于 2012-5-19 21:52
可能是我理解能力不够强,还是没明白,不过谢谢你。

晕死了   没注意代码  你把主函数别跟这个单例写在一个类里。否则它创建多少个对应的都是你在本类中创建,你这样做没有意义。
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-19 21:52:43
9#
踩单车的幸福 发表于 2012-5-19 21:40
通过set方式它最终修改的是对象成员中的值,而不是这对象的地址值。
举个简单例子来说就是,屋子是同一个, ...

可能是我理解能力不够强,还是没明白,不过谢谢你。
回复 使用道具 举报
袁錦泰 黑马帝 2012-5-19 21:51:23
8#
孙宇晨 发表于 2012-5-19 21:44
01.public class Student {

第一行改成 public static class Student 静态 让他不能new

谢谢大家,不过我还是没有理解,我记得单例设计模式在建立对象的限制是将构造函数私有化,这一点我做到了,为什么我在后面再次建立对象的时候没有失败呢?
回复 使用道具 举报
因为你的main方法跟你的单例模式在同一个类里边,然后对于构造方法的私有就无效了
private static Student s = new Student();
在同一个类里边的方法可以访问私有方法,也就是说你的 Student s2 = new Student();

这句还是建立的新的对象,没有达到单例模式的效果。
你把main方法放在其他类里边

代码
  1. package com.a;

  2. class Student {



  3.     private String name;

  4.     private int age;



  5.     private Student() {}



  6.     private static Student s = new Student();



  7.     public static Student getInstance() {

  8.             return s;

  9.     }



  10.     public void setName(String name) {

  11.             this.name = name;

  12.     }



  13.     public String getName() {

  14.             return name;

  15.     }



  16.     public void setAge(int age) {

  17.             this.age = age;

  18.     }



  19.     public int getAge() {

  20.             return age;

  21.     }



  22.   



  23. }
  24. public class Test6{
  25.           public static void main(String[] args) {

  26.           // TODO Auto-generated method stub

  27.           Student s1 = Student.getInstance();

  28.           s1.setName("zhangsan");

  29.           System.out.println(s1.getName());

  30.           s1.setAge(20);

  31.           System.out.println(s1.getAge());

  32.           Student s2 = new Student();

  33.           s2.setName("lisi");

  34.           System.out.println(s2.getName());

  35.           s2.setAge(21);

  36.           System.out.println(s2.getAge());

  37.   }
  38. }

复制代码
这样才是单例模式  但是你的代码Student s2 = new Student();这里就会报错了,也就是说达到了单例模式的目的

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 杨尧 于 2012-5-19 21:50 编辑

这么说吧,你这个单例模式没有任何意义,你的main方法在这个单例的类里面,那么你把构造方法私有化就没用了,你同样可以在这个main方法里面new这个对象,
单例模式是为了限制别的类不能new他这个对象,所以你main方法不能放在这个类里,要不然没有意义了!!
回复 使用道具 举报
本帖最后由 孙宇晨 于 2012-5-19 22:00 编辑

01.public class Student {

第一行改成 public static class Student 静态 让他不能new

39行代码Student s2 = new Student(); 上面变成了静态这里是不能new的. 但是可以像34行一样 调用getInstance()方法


另外你的main方法要另放一个类里 不然在用一个类里你的私有化就无效了


这就像什么呢 我给你做一个比喻 你用播放器播放视频 先播放一个 再点击下一个的时候 播放路径就由第一个改变成了第二个了.
但是你是调用然后马上打印 所以还是可以看到2个人的信息的.
你说的只能看见一个人的信息 是在最后打印 只打印一次
望采纳

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-5-19 21:44 编辑
踩单车的幸福 发表于 2012-5-19 21:38
单例模式是要解决使用的是同一个对象,而你所说的分别输出了两个人的姓名和年龄,那是因为是对这个对象的属 ...

我的问题是为什么使用了单例设计模式之后我建立新对象时代码还可以正常运行而不报错。 重点是我试着建立新对象而没有报错。 你说我的概念混淆了,那你帮忙给我分析一下吧。
回复 使用道具 举报
的确是输出两个呀。你有4个输出语句吗,对象是只有一个。但你的语句是分别赋值的吗,后来的lisi会覆盖掉zhangsan。没有问题!
回复 使用道具 举报
本帖最后由 踩单车的幸福 于 2012-5-19 22:01 编辑

{:soso_e105:}你坑我呢哥哥  你这就在本类里边得瑟呢  把主函数写到其他类里边得瑟去
回复 使用道具 举报
本帖最后由 踩单车的幸福 于 2012-5-19 21:58 编辑

{:soso_e143:}丢人丢到家了  没看清题就瞎写 哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马