黑马程序员技术交流社区

标题: 求解关于子父类的构造方法初始化问题 [打印本页]

作者: doitforyou    时间: 2013-12-28 23:15
标题: 求解关于子父类的构造方法初始化问题
本帖最后由 doitforyou 于 2013-12-30 01:53 编辑

代码如下,采用简写:
class  Super{
     Super(){   print();   }
     void print(){   syso( "父类方法" );  }
}

class Sub{
    Sub(){   print();   }
    void print(){  syso(  "子类方法"  );  }
}

main(){  new Sub();  }
此时显示的都是调用的子类中的print方法,父类隐式初始化中为什么调用的是子类的方法呢?求详细深入解释,谢谢了

作者: sd110572    时间: 2013-12-28 23:40
1访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。

2访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。

3访问一个引用型的变量的成员变量(包括静态变量和实例变量),运行时与声明的类的成员变量绑定。

第3点以前没注意过。你new的子类已经被绑定了,或者说虚拟机会先找子类,然后找父类。
作者: 刘旭升    时间: 2013-12-29 00:07
new Sub();这句话表明在内存会新建一个内存块,你可知道里面存的是什么?对,就是Sub类的变量和方法。然后会有【new Sub()=引用】,所以无论把引用给父类对象还是子类对象,一旦调用都是子类中的方法!这里跟父类的方法没啥关系,毕竟你重写(也可以理解成子类独有的)。
作者: 刘旭升    时间: 2013-12-29 00:32
看错了,你的问题问的很深。我知道子类实例出现,先访问父类构造方法,然后是自己的构造方法。在访问父类时显示的是子类重写的方法说明引用已经传递了。过程的实现还真不知道。{:soso_e136:}
作者: doitforyou    时间: 2013-12-29 01:03
sd110572 发表于 2013-12-28 23:40
1访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。

2访问一个引用型的变量的静态 ...

这个有些道理,但感觉不太确定,有木有源码什么的,研究下。
谢谢啊,我网上也没找到什么可信度高的答案。
作者: Kyle    时间: 2013-12-29 01:25
doitforyou 发表于 2013-12-29 01:03
这个有些道理,但感觉不太确定,有木有源码什么的,研究下。
谢谢啊,我网上也没找到什么可信度高的答案 ...

http://bbs.itheima.com/thread-102459-1-1.html
可以看看这贴,有内存图的深入解释。
作者: doitforyou    时间: 2013-12-29 02:07
Kyle 发表于 2013-12-29 01:25
http://bbs.itheima.com/thread-102459-1-1.html
可以看看这贴,有内存图的深入解释。

灰常感谢,今天太晚了,大致看了下,很不错,明天再细看。
睡了,晚安。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2