| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5961 人关注过本帖
标题:子类实例化父类时之不解
取消只看楼主 加入收藏
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
 问题点数:0 回复次数:9 
子类实例化父类时之不解
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
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
但是callFather()并不是由实例调用的阿。。。是父类构造器调用的。。。怎么也会是这样?并没有哪个对象现实的调用阿。。。。
2007-08-27 18: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
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
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
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
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
[QUOTE]class Father {

...

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

...

}

...

[/QUOTE]

打印的是
class com.abc.test.Son +@@@
是什么原因?
2007-08-29 19:06
andywu
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-26
收藏
得分:0 
[QUOTE]
huwangvs
我说的子类自己的方法是父类没有的。
像在子类里添加个callSon().
既然你说this是子类的,那你看能不能调用这个callSon()呢???
[/QUOTE]
兄弟 看清楚我说的是什么了吗?我说的是子类上转型后的this。。。明白上转型吗?不用给你解释了吧?还是说下吧,上转型后只能访问父类和重写父类的方法,不能访问子类新的方法(即父类没有的)
晕。。。。
2007-08-29 19:12
快速回复:子类实例化父类时之不解
数据加载中...
 
   



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

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