2012-03-19 77 views
2

这是一个简单的java程序。它包含一个“学生”类,我们正在将它的两个对象stud,stud1。同样,我也创建了一个String对象“a”,其值为“Hello”。Java对象与用户定义对象之间的区别

class Student{ 

    int age; 

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

    public int getAge(){ 
    return age; 
    } 
} 


class Hello{ 

    public static void main(String args[]){ 

    Student stud= new Student(); 
    Student stud1= new Student(); 
    stud.setAge(15); 
    int i=stud.getAge(); 
    String a=new String("Hello"); 
    System.out.println(stud); 
    System.out.println(stud1); 
    System.out.println(a); 
    } 

} 

我们知道,当我们创建一个类的对象,它只是持有的参考值对于object.That。这就是为什么当我试图打印螺栓和stud1我得到两个参考values.But因为“A”是一个类String的对象,我们应该期望一个参考值而不是值“你好”。为什么它的发生?

+3

请注意,“你好”已经是一个字符串,因此新的String()是不必要的。 – 2012-03-19 14:13:05

回答

4

此行

System.out.println(stud); 

相当于到

System.out.println(stud.toString()); 

由于StringoverridesObject.toString方法你得到的东西比一串字符和字符串打印时的数字更有意义。

你可以让你的用户定义的类也这样做。在您的Student类它是这样的:

class Student{ 

    int age; 

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

    public int getAge(){ 
     return age; 
    } 

    @Override 
    public String toString() {    // Called for instance when 
     return "Student with age " + age; // the student should be printed 
    } 
} 

下面是一个ideone.com demo对你的代码运行在那里Student覆盖toString

进一步阅读:

(用于做覆盖它的类的回退方法) 1)U nless stud等于null

+0

也许你可以通过这样实现:return“我的年龄是:”+年龄; – 2012-03-19 14:14:02

+0

事实上,不是'stud.toString()',而是'Straing.valueOf(stud)',对于非空对象调用'stud.toString()' – Betlista 2014-01-09 09:59:47

1

当您手动System.out.println()一个对象时,它将调用该对象的toString()方法以便能够打印出某些东西。 Object有一个默认的toString()方法,这就是为你的Student对象调用的东西,因为你没有重写toString()方法。但是,字符串必须以明显的方式定义toString(),所以它会打印出该对象的自定义字符串表示形式;即字符串的值。

1

当您调用System.out.println(Object)时,将调用该对象的toString()方法。由于您没有执行Student,所以调用Object.toString()将打印参考值。

要打印有意义的值,重写它像这样 -

@Override 
public String toString() { 
    return "Age = " + age; 
} 
+0

恐怕连编译都不会。你需要返回一个字符串。 – aioobe 2012-03-19 14:29:22

+0

错误..谢谢@aioobe。 – Kal 2012-03-19 14:31:08

0

的的toString()方法被调用并打印字符串“Hello”。

4

当你调用System.out.println(x),字符串输出为对象的.toString()传递给它。

当然.toString()String是字符串本身,所以你期望"Hello"

如果类没有定义.toString()方法(以及其不),对于它的父定义的.toString()(是Object类)被使用,其打印和的hashCode()基于类型/类别的值物体。

+1

+1用于提及hashCode – JohnnyK 2012-03-19 14:19:11

0

简单地说,PrintStream类(System.out是PrintStream的一个实例)中有println(Object obj)方法,并且在其实现中有obj.toString()。您可以覆盖任何对象的toString()以通过调用System.out.println(Object obj)来格式化字符串收益率。

相关问题