黑马程序员技术交流社区

标题: 关于super的一小段代码的运行结果?求解 [打印本页]

作者: 刘基军    时间: 2011-12-15 14:56
标题: 关于super的一小段代码的运行结果?求解
本帖最后由 monghuan 于 2011-12-15 20:48 编辑
  1. class Person
  2. {
  3.         private String name;
  4.         Person(String name)
  5.         {
  6.                 this.name=name;       
  7.         }
  8.         public String toString()
  9.         {
  10.                 return getClass().getName()+"["+name+"]";       
  11.         }       
  12. }

  13. class Student extends Person
  14. {
  15.         private String school;
  16.         Student(String name, String school)
  17.         {
  18.                 super(name);
  19.                 this.school=school;       
  20.         }
  21.         public String toString()
  22.         {
  23.                 return super.toString()+",["+school+"]";       
  24.         }               
  25. }

  26. public class Test
  27. {
  28.         public static void main(String args[])
  29.         {
  30.                 Student s = new Student("Jack","清华大学");
  31.                 System.out.println(s.toString());
  32.             
  33.         }
  34. }
复制代码
请教:输出结果+分析?谢谢关注,^_^
作者: 付旭    时间: 2011-12-15 15:06
       不懂{:soso_e112:}
作者: 刘基军    时间: 2011-12-15 15:09
付旭 发表于 2011-12-15 15:06
不懂

正好给老兄你解决解决,呵呵
作者: 付旭    时间: 2011-12-15 15:12
解决吧...    我洗眼恭看  
作者: 黑马巩伟伟    时间: 2011-12-15 15:22
结果是Student[Jack],[清华大学]
作者: 庄承荣    时间: 2011-12-15 15:29
输出结果: 【包名】+.Student[Jack],[清华大学]

Student s = new Student("Jack","清华大学");
调用了构造函数:
Student(String name, String school)
{
                super(name);
                this.school=school;        
}
Student类中的成员变量school 为 “清华大学” , 则在
public String toString()
        {
                return super.toString()+",["+school+"]";        
        }

中的  ",["+school+"]" = [清华大学]
而Student构造函数中的super(name); 将字符串“Jack”传给父类构造函数,使得父类Person的成员变量name为“Jack” 。
因而:
public String toString()
        {
                return getClass().getName()+"["+name+"]";        
        }
getClass().getName()+"["+name+"]"   --> getClass().getName()+[Jack]
所以,输出即为:getClass().getName()+[Jack],[清华大学]
由于是在Student类中,最后输出应为:【包名】+.Student[Jack],[清华大学]


作者: 刘基军    时间: 2011-12-15 15:36
庄承荣 发表于 2011-12-15 15:29
输出结果: 【包名】+.Student[Jack],[清华大学]

Student s = new Student("Jack","清华大学");

讲解很详细,谢谢呵。
输出结果应该是:“Student[Jack],[清华大学]”,我想知道为什么输出结果里是“Student”而不是“Person”,这个过程如何解释?


作者: 刘基军    时间: 2011-12-15 15:37
独行客 发表于 2011-12-15 15:22
结果是Student[Jack],[清华大学]

恩,那为什么输出结果里是“Student”而不是“Person”呢?

作者: 马伟奇    时间: 2011-12-15 15:54
结果:Student[Jack],[清华大学]因为父类里面没有
Student(String name, String school)
        {
                super(name);
                this.school=school;        
        }
这个方法,所以在子类里面寻找
作者: 杨扬    时间: 2011-12-15 15:57
应为getClass()在Object类中定义成了final,子类不能覆盖该方法。
作者: 黄杰    时间: 2011-12-15 16:00
其实这个题目的本质是this和super的本质区别是什么?我上网查了下是这样的,总结一下是这样的,
this是一个对象的引用,而super仅仅是一个指示编译器调用超类方法的特有的关键字,这里一定要记住!super不是一个引用,只是一个关键字!
super表现为指向作为父类的一个实例的当前对象的一个引用。所以super只是作为参考的引用,但不是引用
参考文章:http://topic.csdn.net/u/20101116/00/c656ee28-f849-4b32-a8f8-1171409e232f.html
作者: 刘基军    时间: 2011-12-15 16:00
马伟奇 发表于 2011-12-15 15:54
结果:Student[Jack],[清华大学]因为父类里面没有
Student(String name, String school)
        {

恩,另外可以讲一下为什么输出结果里是“Student”而不是“Person”呢,在子类的toString方法中,super.toString()这个方法如何调用的?

作者: 马伟奇    时间: 2011-12-15 16:04
monghuan 发表于 2011-12-15 16:00
恩,另外可以讲一下为什么输出结果里是“Student”而不是“Person”呢,在子类的toString方法中,super.t ...

你父类没有那个方法啊
作者: 宋双    时间: 2011-12-15 16:11
getClass
public final Class<? extends Object> getClass()返回一个对象的运行时类。该 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
被final修饰
你所建立的对象是Student类中对象,所以getClass()的值一定是Student
作者: 余松霖    时间: 2011-12-15 16:22
monghuan 发表于 2011-12-15 16:00
恩,另外可以讲一下为什么输出结果里是“Student”而不是“Person”呢,在子类的toString方法中,super.t ...

首先你建立个student对象.然后调用了student类中的toString方法   toString方法中返回的是super.toString()(父类中的方法toString)+",["+school+"]";     父类中返回的是getClass().getName()+"["+name+"]";
需要说明的是getClass().getName()返回一个类的名称    getClass().是对象的运行时类型  你建立的是student对象!  所以返回的是student

个人理解..
作者: 为梦而战    时间: 2011-12-15 16:28
因为 s 是类名是Student ,所以getclass()被调用,应该返回的是Student
作者: 黄杰    时间: 2011-12-15 16:29
看这个吧 http://topic.csdn.net/u/20101116/00/c656ee28-f849-4b32-a8f8-1171409e232f.html
作者: 刘基军    时间: 2011-12-15 16:32
黄杰 发表于 2011-12-15 16:00
其实这个题目的本质是this和super的本质区别是什么?我上网查了下是这样的,总结一下是这样的,
this是一个 ...

恩,我正在看。。。,同类的问题
作者: 刘基军    时间: 2011-12-15 20:46
按照“this是一个对象的引用,而super仅仅是一个指示编译器调用超类方法的特有的关键字,这里一定要记住!super不是一个引用,只是一个关键字!”来理解!谢谢大家的回复,就此结贴,若有更好的解释,欢迎回复,^_^




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