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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 十七 中级黑马   /  2014-3-16 12:44  /  2006 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 十七 于 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的值?哪里错了呢?请高人指点

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

19 个回复

正序浏览
  1. System.out.println(s1);
复制代码

你打印的是s1,肯定是地址啊,需要调用s1.getAge();获取age值
回复 使用道具 举报
本帖最后由 赵文超 于 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-16 18:29
这段代码中,打印语句打印的是一个Student类型的对象s1,打印出来的结果就是该对象在内存中的哈希值,如果 ...

谢谢,看懂了
回复 使用道具 举报
也许依然 发表于 2014-3-16 18:29
这段代码中,打印语句打印的是一个Student类型的对象s1,打印出来的结果就是该对象在内存中的哈希值,如果 ...

嗯,复写toString()方法,谢谢
回复 使用道具 举报
  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());

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
SyouRai_Tsk 发表于 2014-3-16 14:06
因为你没有覆盖Student类中的toString()方法,所以,它默认调用super()父类中的toString()方法
...

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

public String toString() {
                        return "Student [age=" + age + "]";
                }
你又写了toString()方法,为什么说没覆盖呢?
回复 使用道具 举报
小斥候 发表于 2014-3-16 12:54
你是不是想要打印s1.getAge()呢

嗯,刚看懂了
回复 使用道具 举报
Aimer_WJY 发表于 2014-3-16 12:53
class SingleDemo
{
        

哦,这样再定义变量也可以解决,谢谢
回复 使用道具 举报
duanyoujiji 发表于 2014-3-16 12:57
System.out.println(s1);  s1是一个对象,打印对象所以是个地址值。getAge()方法你并没有调用。

这句话 ...

好的,谢谢了
回复 使用道具 举报
2528870651 发表于 2014-3-16 14:19
你打印的不是age的值,而是age的内存地址值

嗯,:)明白了
回复 使用道具 举报
十七 中级黑马 2014-3-16 16:02:02
9#
菜小徐 发表于 2014-3-16 12:55
你要取出age的值,应该写System.out.println(s1.getAge);或者System.out.println(s1.toString());
...

嗯,谢谢。调用get方法,我懂了。后面那个解决方法是什么意思?
回复 使用道具 举报
你打印的不是age的值,而是age的内存地址值
回复 使用道具 举报
因为你没有覆盖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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
s1是个对象,直接打印对象一般是打印这个对象的引用也就是这个对象的地址,想得到age需要用System.out.println(s1.getAge()); 还有如果你想通过打印对象来获取信息可以自己重写toString();方法来自定义自己想要的信息
回复 使用道具 举报
本帖最后由 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 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
你是不是想要打印s1.getAge()呢
回复 使用道具 举报
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在内存中的地址池。      
        }
        
}

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马