在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前帧中,Java虚拟机正是通过这个参数来决定当前所使用的类(通过判断该对象的类型)。
那么如下:
class A {
public A(){
}
public void fa() {
System.out.println("CLASS A :Function fa Runing......");
} public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}class B extends A {
public B(){
}
public void fa() {
System.out.println("CLASS B :Function fa Runing......");
} public void fb() {
System.out.println("CLASS B :Function fb Runing......");
super.fb();
System.out.println("CLASS B :Function fb Stop......");
}
}public class Polymorphism{
public static void main(String[] args) {
A b = new B();
b.fb();
}
}那么在上边的这个例子中:
main中调用b.fb()时,压入的当前对象自然是B类对象,我们记为b。在B的fb()中调用super.fb()时,压入的就是刚刚压入的对象为什么还是b呢?同样,在A的fb中调用fa()时,为什么也是b。这些方法具体是怎么样调用的,请高手详细解释一下~!
谢谢了~!
那么如下:
class A {
public A(){
}
public void fa() {
System.out.println("CLASS A :Function fa Runing......");
} public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}class B extends A {
public B(){
}
public void fa() {
System.out.println("CLASS B :Function fa Runing......");
} public void fb() {
System.out.println("CLASS B :Function fb Runing......");
super.fb();
System.out.println("CLASS B :Function fb Stop......");
}
}public class Polymorphism{
public static void main(String[] args) {
A b = new B();
b.fb();
}
}那么在上边的这个例子中:
main中调用b.fb()时,压入的当前对象自然是B类对象,我们记为b。在B的fb()中调用super.fb()时,压入的就是刚刚压入的对象为什么还是b呢?同样,在A的fb中调用fa()时,为什么也是b。这些方法具体是怎么样调用的,请高手详细解释一下~!
谢谢了~!
解决方案 »
- JList增加新数据后如何刷新?
- 请教JAVA中对于关闭JFrame的一些问题
- 根据 节点 和父节点 我用递归做的树 请大家指正一下 看有没有潜在的问题
- 怎么用java读取数据库表结构?(比如有表名,得到该表的字段名,字段类型,好像DatabaseMetaData可以得到)
- 关于线程循环问题
- 同一台计算机上做客户机/服务器聊天程序不能通信怎么办?
- Java有像MSDN的帮助文档吗,在哪儿能下载到?
- 求助:appletviewer一个最简单的applet程序出错1!(程序是书上的)
- 关于Look&Feel.写了一段代码,有些问题,大家看看~
- 想问一下语言的标准制定者和编译器制造商之间的关系
- 在求一个数组中绝对值相同的元素的个数时候,把结果保存在HashMap中出现的问题
- 关于linkedlist 中元素的排序 简单 又不简单
class A {
public A(){
}
public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}class B extends A {
public B(){
}
public void fa() {
System.out.println("CLASS B :Function fa Runing......");
} public void fb() {
System.out.println("CLASS B :Function fb Runing......");
super.fb();
System.out.println("CLASS B :Function fb Stop......");
}
}public class Polymorphism{
public static void main(String[] args) {
A b = new B();
b.fb();
}
}
在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前栈中吗,
那上例在B的fb()中调用super.fb()时,压入的就是刚刚压入的对象为什么还是b呢?同样,在A的fb中调用fa()时,为什么也是b。
class A {
public A(){
}
public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}fa()没有定义。
public A(){
}
//加下列代码才可以的!!!!!
public void fa(){
System.out.println("ClASS A:Function fa Runing.....");
}
public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}class B extends A {
public B(){
}
public void fa() {
System.out.println("CLASS B :Function fa Runing......");
} public void fb() {
System.out.println("CLASS B :Function fb Runing......");
super.fb();
System.out.println("CLASS B :Function fb Stop......");
}
}public class Polymorphism{
public static void main(String[] args) {
A b = new B();
b.fb();
}
}
结果:
CLASS B :Function fb Runing......
CLASS A :Function fb Runing......
CLASS B :Function fa Runing......
CLASS A :Function fb Stop......
CLASS B :Function fb Stop......分析:
如果不加上面的代码编译通不过,你可能考虑到动态绑定,但动态绑定是发生在运行中的。
至于为什么出现这个结果:
在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前栈中。看看Main()里面
new B() 对象B 压栈,类B后面有extends A
加载类A ,初始化A的数据成员,A构造器。接下来是B类的数据成员初始化,B构造器。b.fb(); 调用的当然是对象B的fb(); 打印:CLASS B :Function fb Runing......
super.fb();调用的当然是对象A的fb();打印:CLASS A :Function fb Runing......接下来调用fa();
此时的fa();不是类A的方法,而是类B的fa();(为什么?这个属于动态绑定的内容)打印:CLASS B :Function fa Runing...... CLASS A :Function fb Stop......
super.fb()完毕,接下来继续执行CLASS B :Function fb Stop......
不知道说清楚了没有!!!!