A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© doitforyou 高级黑马   /  2013-12-28 23:15  /  1799 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 doitforyou 于 2013-12-30 01:53 编辑

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

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

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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
1访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。

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

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

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

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

这个有些道理,但感觉不太确定,有木有源码什么的,研究下。
谢谢啊,我网上也没找到什么可信度高的答案。
回复 使用道具 举报
doitforyou 发表于 2013-12-29 01:03
这个有些道理,但感觉不太确定,有木有源码什么的,研究下。
谢谢啊,我网上也没找到什么可信度高的答案 ...

http://bbs.itheima.com/thread-102459-1-1.html
可以看看这贴,有内存图的深入解释。
回复 使用道具 举报
Kyle 发表于 2013-12-29 01:25
http://bbs.itheima.com/thread-102459-1-1.html
可以看看这贴,有内存图的深入解释。

灰常感谢,今天太晚了,大致看了下,很不错,明天再细看。
睡了,晚安。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马