黑马程序员技术交流社区

标题: 单例设计模式的小问题 [打印本页]

作者: 十七    时间: 2014-3-16 12:44
标题: 单例设计模式的小问题
本帖最后由 十七 于 2014-3-17 21:53 编辑

  1. /*
  2. 面向对象
  3. 单例设计模式
  4. */
  5. class SingleDemo
  6. {
  7.         
  8.         public static void main(String[] args)
  9.         {
  10.                 Student s1=Student.getStudent();
  11.                 s1.setAge(15);
  12.                 System.out.println(s1);        
  13.         }
  14.         
  15. }
  16. class Student
  17. {
  18.         private int age;


  19.         private static Student s=new Student();
  20.         private Student(){}
  21.         public static Student getStudent()
  22.         {
  23.                 return s;
  24.         }

  25.         public void setAge(int age)
  26.         {
  27.                 this.age=age;
  28.         }
  29.         public int getAge()
  30.         {
  31.                 return age;
  32.         }
  33. }
复制代码

为什么得到的结果是:Student@c17164而不是age的值?哪里错了呢?请高人指点
作者: Aimer_WJY    时间: 2014-3-16 12:53
class SingleDemo
{
        
        public static void main(String[] args)
        {
                  
                Student s1=Student.getStudent();
                s1.setAge(15);
                int age=s1.getAge();//这里应该获取age
                System.out.println(age); //打印输出age。打印 s1是student在内存中的地址池。      
        }
        
}
作者: 小斥候    时间: 2014-3-16 12:54
你是不是想要打印s1.getAge()呢
作者: 菜小徐    时间: 2014-3-16 12:55
本帖最后由 菜小徐 于 2014-3-16 14:22 编辑

你要取出age的值,应该写System.out.println(s1.getAge);或者System.out.println(s1.toString());
  1.         public static void main(String[] args){

  2.                 Student s1=Student.getStudent();
  3.                 s1.setAge(15);
  4.                 System.out.println(s1.getAge());        

  5.         }
  6. public class Student {

  7.         private int age;

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

  9.         private Student() {
  10.         }

  11.         public static Student getStudent() {
  12.                 return s;
  13.         }

  14.         public void setAge(int age) {
  15.                 this.age = age;
  16.         }

  17.         public int getAge() {
  18.                 return age;
  19.         }
  20. }
复制代码


作者: duanyoujiji    时间: 2014-3-16 12:57
本帖最后由 duanyoujiji 于 2014-3-16 13:02 编辑

  System.out.println(s1);  s1是一个对象,打印对象所以是个地址值。getAge()方法你并没有调用。

  1. System.out.println(s1);
复制代码

这句话改成System.out.println(s1.getAge()) ;
作者: 乔钰博    时间: 2014-3-16 13:34
s1是个对象,直接打印对象一般是打印这个对象的引用也就是这个对象的地址,想得到age需要用System.out.println(s1.getAge()); 还有如果你想通过打印对象来获取信息可以自己重写toString();方法来自定义自己想要的信息
作者: SyouRai_Tsk    时间: 2014-3-16 14:06
因为你没有覆盖Student类中的toString()方法,所以,它默认调用super()父类中的toString()方法
  1. /*
  2. 面向对象
  3. 单例设计模式
  4. */
  5. class SingleDemo
  6. {
  7.       
  8.         public static void main(String[] args)
  9.         {
  10.                 Student s1=Student.getStudent();
  11.                 s1.setAge(15);
  12.                 System.out.println(s1);      
  13.         }
  14.       
  15. }
  16. class Student
  17. {
  18.         private int age;


  19.         private static Student s=new Student();
  20.         private Student(){}
  21.         public static Student getStudent()
  22.         {
  23.                 return s;
  24.         }

  25.         public void setAge(int age)
  26.         {
  27.                 this.age=age;
  28.         }
  29.         public int getAge()
  30.         {
  31.                 return age;
  32.         }
  33.                 @Override
  34.                 public String toString() {
  35.                         return "Student [age=" + age + "]";
  36.                 }
  37.                
  38.         
  39. }
复制代码

作者: 2528870651    时间: 2014-3-16 14:19
你打印的不是age的值,而是age的内存地址值
作者: 十七    时间: 2014-3-16 16:02
菜小徐 发表于 2014-3-16 12:55
你要取出age的值,应该写System.out.println(s1.getAge);或者System.out.println(s1.toString());
...

嗯,谢谢。调用get方法,我懂了。后面那个解决方法是什么意思?
作者: 十七    时间: 2014-3-16 16:03
2528870651 发表于 2014-3-16 14:19
你打印的不是age的值,而是age的内存地址值

嗯,:)明白了
作者: 十七    时间: 2014-3-16 16:05
duanyoujiji 发表于 2014-3-16 12:57
System.out.println(s1);  s1是一个对象,打印对象所以是个地址值。getAge()方法你并没有调用。

这句话 ...

好的,谢谢了
作者: 十七    时间: 2014-3-16 16:07
Aimer_WJY 发表于 2014-3-16 12:53
class SingleDemo
{
        

哦,这样再定义变量也可以解决,谢谢
作者: 十七    时间: 2014-3-16 16:08
小斥候 发表于 2014-3-16 12:54
你是不是想要打印s1.getAge()呢

嗯,刚看懂了
作者: 十七    时间: 2014-3-16 16:18
SyouRai_Tsk 发表于 2014-3-16 14:06
因为你没有覆盖Student类中的toString()方法,所以,它默认调用super()父类中的toString()方法
...

public String toString() {
                        return "Student [age=" + age + "]";
                }
你又写了toString()方法,为什么说没覆盖呢?
作者: 十七    时间: 2014-3-16 16:20
SyouRai_Tsk 发表于 2014-3-16 14:06
因为你没有覆盖Student类中的toString()方法,所以,它默认调用super()父类中的toString()方法
...

public String toString() {
                        return "Student [age=" + age + "]";
                }
你又写了toString()方法,为什么说没覆盖呢?
作者: 也许依然    时间: 2014-3-16 18:29
  1. public static void main(String[] args)
  2.         {
  3.                 Student s1=Student.getStudent();
  4.                 s1.setAge(15);
  5.                 System.out.println(s1);        
  6.         }
复制代码

这段代码中,打印语句打印的是一个Student类型的对象s1,打印出来的结果就是该对象在内存中的哈希值,如果要打印年龄,需要通过对象s1调用getAge方法,即
System.out.println(s1.getAge());
或者在Student类中,复写toString()方法
public string toString(){
       return "age="+age;
}
System.out.println(s1.toString());
作者: 十七    时间: 2014-3-17 09:30
也许依然 发表于 2014-3-16 18:29
这段代码中,打印语句打印的是一个Student类型的对象s1,打印出来的结果就是该对象在内存中的哈希值,如果 ...

嗯,复写toString()方法,谢谢
作者: 十七    时间: 2014-3-17 21:49
也许依然 发表于 2014-3-16 18:29
这段代码中,打印语句打印的是一个Student类型的对象s1,打印出来的结果就是该对象在内存中的哈希值,如果 ...

谢谢,看懂了
作者: 赵文超    时间: 2014-3-17 22:38
本帖最后由 赵文超 于 2014-3-17 22:39 编辑
  1.         public static void main(String[] args){

  2.                 Student s1=Student.getStudent();
  3.                 s1.setAge(15);
  4.                 System.out.println(s1.getAge());        

  5.         }
  6. public class Student {

  7.         private int age;

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

  9.         private Student() {
  10.         }

  11.         public static Student getStudent() {
  12.                 return s;
  13.         }

  14.         public void setAge(int age) {
  15.                 this.age = age;
  16.         }

  17.         public int getAge() {
  18.                 return age;
  19.         }
  20. }
复制代码

System.out.println(s1);Student@c17164你打印的是Student对象存储堆内存里的地址值是s1是存放栈内存的引用变量,存放的是指向对象的地址
作者: 刘一博    时间: 2014-3-17 22:55
  1. System.out.println(s1);
复制代码

你打印的是s1,肯定是地址啊,需要调用s1.getAge();获取age值




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