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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金龙 中级黑马   /  2012-7-29 22:38  /  3437 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如父类是Person,子类是Student。
这时候采用多态,将Student对象用父类类型来接收,即 Person p = new Student();
System.out.println(p.getClass().getName());    //嗯,,结果是Student

心里想想,觉得这答案也挺靠谱,隐约觉得是这么回事,但是,细节不明白,不想自我安慰随便找个理由就说服自己,求解答!

14 个回复

倒序浏览
在多态中成员函数的特点时:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
你把代码贴上来啊,代码贴上来我才能分析System.out.println(p.getClass().getName());这句啊

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多态就是父类类型的引用变量指向子类类型的对象,编译时,只要符合这点就可以,当运行时实际调用的是子类对象的方法
编译是看左边,运行时看右边
回复 使用道具 举报
子类继承父类的时候,父类的非私有方法,如果子类不覆盖的话,父类应该只是得到了父类给它了一个权限,更准确一点说,应该是子类在父类这个方法上加上了自己的标识(会不会是自己的内存地址?),要是这样的话,解释多态问题就简单了,子类穿着父类的衣服去调用父类的方法时,方法只认地址标识,所以执行子类的方法了,getClass()是object类的,所有类都直接或间接继承父类,所以子父类内都有这个方法的

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 周世阳 于 2012-7-29 22:50 编辑

Person p只代表引用的类型是Person,但是实际的对象类型是Student(new Student()),而getClass()是对象调用而不是引用调用的,所以自然返回的是Student
回复 使用道具 举报
你说的这个:可以这样理解吧,因为是父类引用指向子类,而你的Person p=new student();
在用p调用方法时其实是调用的父类的共性方法其实也是子类student的共性内容,而不是student的特有功能。
这样解释有点抽象,希望你能把代码贴上,我们会更好的给你解释!
回复 使用道具 举报
王峰 中级黑马 2012-7-29 23:36:56
7#
(1)每一个类在使用时都必须先装入,java虚拟机装入类时,创建一个包含类信息的对象,这些信息有类名,构造方法等。
(2)这个对象是java.lang.Class的一个实例,它描述了该类的有关信息,我们一般称这个对象为元对象,这个对象可以通过getClass()返回它的元对象,然后调用Class类中的方法getName()可以返回该类的名称。
(3)这里的p的类型为Person,而Student是person的子类,因此子类的实例隐式的转化为父类的变量,这里只是类型发生转化,实际上p中java虚拟机装入类时包含的类信息是Student的类信息,因此理所当然得到的是子类的名字:Student
回复 使用道具 举报
Person p = new Student()
     虽然p被指定是为Person类型的引用,但它实际指定的是Student类型的对象,所以执行Student中的方法是,首先看子类中有没有
重写父类的方法,如果重写了,就会执行子类的方法,而不是父类的方法。
   在Student中也覆盖了getClass方法,所以会执行子类的
getClass方法,返回的当然也是子类了。如果想得到父类的类名可以这样:p.getClass().getSuperClass().getName();

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在多态中,成员函数的特点
在编译时期:参阅应用型所属的类中是否有调用的方法。如果有编译通过否则便以失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点
无论在编译和运行都参考左边(引用型变量所属的类)。


在多态中,静态成员函数的特点
无论编译和运行,都参考左边。




把这些总结记住就行了~~

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先建议楼主重新观看老毕教程第八天的05,多态中成员的特点
多态中调用成员函数,编译看左边运行看右边
调用静态函数,编译运行都看左边,左边类里有你说的getClass 和getName 方法即可运行

回复 使用道具 举报
我对多态的理解是把一台打印机看做是父类,黑白打印机和彩色打印机是两个子类,父类的方法是‘ 打印’在没个子类中有不同的实现方式,比如黑白打印机执行打印操作效果是黑白色的, 彩色打印机执行操作后是彩色的,子类分别的父类的‘打印’方法进行了重写,多态与继承和方法重写是密切相关的。看Student重写了Person的方法。
回复 使用道具 举报
本帖最后由 龙卷风V龙卷风 于 2012-7-30 15:57 编辑

{:soso_e115:}
回复 使用道具 举报
龙卷风V龙卷风 发表于 2012-7-29 23:36
(1)每一个类在使用时都必须先装入,java虚拟机装入类时,创建一个包含类信息的对象,这些信息有类名,构造 ...

我也觉得回答的好,但是版主不给技术分,我就不想再回答了,为了清除,我还一条一条列出类,版主不给分,太不公平了
回复 使用道具 举报
陈红建 来自手机 中级黑马 2012-7-30 18:15:28
14#
向上转型。这是不是就是所谓的向上转型?
回复 使用道具 举报
龙卷风V龙卷风 发表于 2012-7-30 15:57
我也觉得回答的好,但是版主不给技术分,我就不想再回答了,为了清除,我还一条一条列出类,版主不给分, ...

其实没必要为了技术分!真正学到东西才是关键!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马