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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘基军 黑马帝   /  2011-12-15 14:56  /  3254 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码
请教:输出结果+分析?谢谢关注,^_^

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

18 个回复

倒序浏览
付旭 黑马帝 2011-12-15 15:06:43
沙发

回帖奖励 +1

       不懂{:soso_e112:}
回复 使用道具 举报
付旭 发表于 2011-12-15 15:06
不懂

正好给老兄你解决解决,呵呵
回复 使用道具 举报
付旭 黑马帝 2011-12-15 15:12:40
板凳
解决吧...    我洗眼恭看  
回复 使用道具 举报
结果是Student[Jack],[清华大学]
回复 使用道具 举报
输出结果: 【包名】+.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],[清华大学]

评分

参与人数 1技术分 +2 收起 理由
吴上储 + 2

查看全部评分

回复 使用道具 举报
刘基军 黑马帝 2011-12-15 15:36:29
7#
庄承荣 发表于 2011-12-15 15:29
输出结果: 【包名】+.Student[Jack],[清华大学]

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

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

回复 使用道具 举报
刘基军 黑马帝 2011-12-15 15:37:24
8#
独行客 发表于 2011-12-15 15:22
结果是Student[Jack],[清华大学]

恩,那为什么输出结果里是“Student”而不是“Person”呢?
回复 使用道具 举报
马伟奇 黑马帝 2011-12-15 15:54:13
9#
结果:Student[Jack],[清华大学]因为父类里面没有
Student(String name, String school)
        {
                super(name);
                this.school=school;        
        }
这个方法,所以在子类里面寻找

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
杨扬 黑马帝 2011-12-15 15:57:14
10#
应为getClass()在Object类中定义成了final,子类不能覆盖该方法。
回复 使用道具 举报
黄杰 黑马帝 2011-12-15 16:00:04
11#
其实这个题目的本质是this和super的本质区别是什么?我上网查了下是这样的,总结一下是这样的,
this是一个对象的引用,而super仅仅是一个指示编译器调用超类方法的特有的关键字,这里一定要记住!super不是一个引用,只是一个关键字!
super表现为指向作为父类的一个实例的当前对象的一个引用。所以super只是作为参考的引用,但不是引用
参考文章:http://topic.csdn.net/u/20101116/00/c656ee28-f849-4b32-a8f8-1171409e232f.html

点评

恩,赞一个,呵呵  发表于 2011-12-15 20:47

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
刘基军 黑马帝 2011-12-15 16:00:29
12#
马伟奇 发表于 2011-12-15 15:54
结果:Student[Jack],[清华大学]因为父类里面没有
Student(String name, String school)
        {

恩,另外可以讲一下为什么输出结果里是“Student”而不是“Person”呢,在子类的toString方法中,super.toString()这个方法如何调用的?
回复 使用道具 举报
马伟奇 黑马帝 2011-12-15 16:04:12
13#
monghuan 发表于 2011-12-15 16:00
恩,另外可以讲一下为什么输出结果里是“Student”而不是“Person”呢,在子类的toString方法中,super.t ...

你父类没有那个方法啊
回复 使用道具 举报
宋双 黑马帝 2011-12-15 16:11:50
14#
getClass
public final Class<? extends Object> getClass()返回一个对象的运行时类。该 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
被final修饰
你所建立的对象是Student类中对象,所以getClass()的值一定是Student

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
余松霖 黑马帝 2011-12-15 16:22:30
15#
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

个人理解..

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
因为 s 是类名是Student ,所以getclass()被调用,应该返回的是Student
回复 使用道具 举报
黄杰 黑马帝 2011-12-15 16:29:11
17#
看这个吧 http://topic.csdn.net/u/20101116/00/c656ee28-f849-4b32-a8f8-1171409e232f.html
回复 使用道具 举报
刘基军 黑马帝 2011-12-15 16:32:35
18#
黄杰 发表于 2011-12-15 16:00
其实这个题目的本质是this和super的本质区别是什么?我上网查了下是这样的,总结一下是这样的,
this是一个 ...

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

评分

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

查看全部评分

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