| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5961 人关注过本帖
标题:子类实例化父类时之不解
只看楼主 加入收藏
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
 问题点数:0 回复次数:35 
子类实例化父类时之不解
class Father {

public Father() {
callFather();
}

public void callFather() {
System.out.println("call father!");
}

}

class Son extends Father {

public Son() {
super();
}

public void callFather() {
System.out.println("call son!");
}

}

public class Init {
public static void main(String[] args) {
Son son = new Son();
Father father = new Son();
}
}

打印的结果为什么会是:
call son!
call son!

super();之后不是执行超类构造器的代码吗?那Father()调用callFather();为什么是子类重写的?这个callFather();
方法到底是谁调用的?父类是怎么没有获得子类对象引用的情况下实现调用的?
我的想法是子类偷偷把自己的this指针传给了super(),但我感觉有点奇怪,既然构造器不同于普通的成员方法,不能由对象调用,那么传this指针可能吗?
希望哪个高手能给我一点指点??
小弟不胜感谢!
搜索更多相关主题的帖子: 父类 子类 实例 
2007-08-27 18:34
cssky
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-20
收藏
得分:0 
new son();你得到的是子类的实例,当然只会调子类自已中的callFather()
2007-08-27 18:47
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
但是callFather()并不是由实例调用的阿。。。是父类构造器调用的。。。怎么也会是这样?并没有哪个对象现实的调用阿。。。。
2007-08-27 18:50
J华
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-7-2
收藏
得分:0 

继承中类的实例方法一定与对象的引用绑定,Father father = new Son(); Son中重写了callFather() .
super()内调用的是实例方法,当然就是调用被引用Son的callFather();

2007-08-27 19:43
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
这是多态。。记住一点多态中调用的方法一定是被最底层的子类重写的方法。。
2007-08-27 19:48
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
要想不通过多台态来调用请把方法设置为final或者是private的,这样调用的就是Fater类的方法了。
2007-08-27 19:50
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
能不能解决我的疑问?而不是只回答产生结果的原因?能深一点解释吗?我不要 多态 这样的答案。能告诉我
new Son().callFather() 和
public Father() {
callFather();
} 有没有区别。。。在实例调用callFather() 的情况下是多态,但是在父类构造器中调用时我就是转不过来弯来。。。

在new Son()的时候会执行该public Son(){....},那么new Son()时会不会传this指针?

都说成员方法都是由对象的引用调用的 隐式 this.callFather(); 就告诉我构造器初始化时是不是也是要靠this来维护的?子类在super()时是不是也要传个this?那这个this是子类的还是父类的?是子类的话,那么父类的属性初始化谁来维护?靠子类的this维护?那父类私有的属性子类的this维护的了吗?

2007-08-27 20:42
cssky
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2007-8-20
收藏
得分:0 


Son son = new Son();//new 出一个Son实例对象(堆中),同时son对象也是指向你new出来的实例的引用(栈中)
Father father = new Son();//同样new 出一个Son的实例,father指向这个Son实例的引用

//子类实例只会调用子类中被重写的方法,最好的办法用单步你就知道它们的调用关系了

[此贴子已经被作者于2007-8-27 21:41:57编辑过]

2007-08-27 21:27
J华
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-7-2
收藏
得分:0 

.....我在4楼说了啊 ..Father father = new Son(); father 是声明为Father的Son的引用

子类在super()时是不是也要传个this?那这个this是子类的还是父类的? 这个应该是java虚拟机处理的东西 所以叫多态..... 具体我不知道 我自己想的话: 如果硬是要传递this到super()的话 那这个this是有规则变化的
java虚拟机关于继承有相应的绑定原则.这个具体怎么实现 那只有问底层的开发人员了(写JVM的人).



2007-08-27 21:43
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 

谢谢大家了,我稍微改了下:
package com.abc.test;

class Father {

public Father() {
this("@@@");
callFather();
System.out.println(this + " +super");
}

public Father(String s) {
System.out.println(this + " +@@@");
}

public void callFather() {
System.out.println("call father!");
System.out.println(this + " +callFather");
}

}

class Son extends Father {

public Son() {
super();
System.out.println(this + " +this");
}

public void callFather() {
System.out.println("call son!");
System.out.println(this + " +callSon");
}

}

public class Init {
public static void main(String[] args) {
Father father = new Son();
System.out.println(father + " +new");
}
}

打印的是这样的:
com.abc.test.Son@10b30a7 +@@@
call son!
com.abc.test.Son@10b30a7 +callSon
com.abc.test.Son@10b30a7 +super
com.abc.test.Son@10b30a7 +this
com.abc.test.Son@10b30a7 +new
这是不是说明 super();时把引用new Son()的this指针传进去了?

2007-08-27 22:53
快速回复:子类实例化父类时之不解
数据加载中...
 
   



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

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