| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5965 人关注过本帖
标题:子类实例化父类时之不解
只看楼主 加入收藏
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
不对。
如果super()时传的是new Son()的this指针。那么如果把父类里的callFather()删除掉以后,还是能打印出call son!的。
但是实际上是打印不出来的。编译器出错,说父类里没有callFather()方法。
Father father = new Son();就是强制把Son转换成Father.它就是Father类型。当调用callFather的时候,JVM会通过Class对象来确定Father的实际类型。来确定是调用哪个callFather。
LZ可以看看王森的java深度历险,里面对jdk的运行机制做了比较详细的介绍。
2007-08-28 09:01
风月_无边
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:60
帖 子:2960
专家分:652
注 册:2007-1-19
收藏
得分:0 
  呵呵,各位研究的都挺仔细的!!

我的网站 http://www.
2007-08-28 09:18
cos100
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2007-5-30
收藏
得分:0 

实例化对象时:类型是左边的,对象是右边的.
不了问为什么,记住就可以了.

2007-08-28 09:30
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
to huwangvs 但是实际上是打印不出来的。编译器出错,说父类里没有callFather()方法。

我感觉应该是在加载类信息时找不到那个方法报错的,并不是你所说的动态绑定,如果是动态绑定的原因那么不会在编译期间报错的,因该是运行时抛异常,在 Father father = new Son();编译器把方法作为类的信息加载,在构造方法中有callFather(),而在类信息中又找不到它,才报的错吧?
2007-08-28 12:52
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
to huwangvs Father father = new Son();就是强制把Son转换成Father.它就是Father类型。当调用callFather的时候,JVM会通过Class对象来确定Father的实际类型。来确定是调用哪个callFather。

那你能告诉我callFather()是谁调用的吗?没有任何对象显示的调用吧,只是在父类构造器中调用的吧?既然你说不对,能说明下在父类构造器中是哪个this起的作用吗?就说说这个就可以了,别把问题老弄到动态绑定上去,这谁都会说的。

我感觉按照狂放不羁的说法,this应该传进去了,这个this应该是子类的那个,在子类中他维护不了父类的私有属性和方法,但现在传到了父类他就有这个权限了,应为私有的允许在本类中访问。但是还是不能肯定这个this是否真的是子类的那个上转型的实例。
2007-08-28 13:04
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
那我问你个问题。
你说this是子类的。
那为什么它不能调用子类自己的方法??
2007-08-28 13:19
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
to huwangvs JVM会通过Class对象来确定Father的实际类型

Class对象封装的是Father类在运行时数据区中的方法区的数据结构,同样Son类也有这样一个Class对象来维护着方法在方法区的内存地址,当然Class实例是存放在堆区的,Father实例对象持有这个Class实例的引用。

如果我说的Class对象和你说的是一个东西,那么请问它如何能确定Father的实际类型呢?是不是你把Class对象理解成类(class)对象了?要是这样的话应该这么写吧class对象("class要小写")。
2007-08-28 13:24
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 

调的是子类的阿
打印结果不是在那放着呢吗?
call son!
call son!
我就是想确认下我想得对不对,只是自己这么想的根本没有什么确信的根据还是狂放不羁
告诉我的会传个this进去的 我才想明白的,但是他又没有明确地告诉我是谁的this所以 都是我的猜测。。。。

2007-08-28 13:28
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
我说的子类自己的方法是父类没有的。
像在子类里添加个callSon().
既然你说this是子类的,那你看能不能调用这个callSon()呢???
2007-08-28 13:34
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
狂放不羁 说的 调用super()其实是初始化子类中的父类子对象的this
并没说子类的this传给父类啊。
2007-08-28 13:41
快速回复:子类实例化父类时之不解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034796 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved