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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 朱荣宁. 于 2013-3-9 22:22 编辑

刚才看老师的视频 自己运行了小代码 关于继承的 代码如下:



运行结果如下:




我刚才想了想 我打印结果应该是 zi run 为什么会出现fu run ??? 我在程序中只给子类声明了对象Z 为什么虚拟机把父类也运行了??也就是说
在对子类对象进行初始化时,父类的构造函数也会运行???

12 个回复

倒序浏览
不对呀,没有继承,结果应该是:zi run     你再运行下,看看。。。。。。
如果继承的话:子类实例化:子类所有的构造函数都会默认访问父类中的空构造函数,因为子类的每一个构造函数的第一行都有一句饮食的super();
结果是
fu run
zi run


回复 使用道具 举报
你之前写过继承,然后你给修改了,然后没保存又运行了,是否是这样:L
回复 使用道具 举报
楼主是美女?
回复 使用道具 举报
代码是不是些问题啊。再仔细检查一下哦!
回复 使用道具 举报
我觉得你之前写的代码,子类继承父类了。  然后,又去掉 class Zi extends Fu 中的extends Fu之后,没有保存。
这个代码肯定只会输出,Zi run..    你再运行试试。。
回复 使用道具 举报
zi()
   {
           super();                            //在无特别调用父类构造函数时,比如super(5),是可以省略,默认。调用父类的构造函数。
           System.out.println("zi run");
   }
子类的实例化过程:子类中所有构造函数默认会访问父类中空参数的构造函数。
为什么子类实例化的时候要访问父类中的构造函数呢?
因为子类继承了父类,获取父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的(比如里面有成员变量的初始化值)。

注意:super语句必须定义在子类构造函数的第一行,因为父类的初始化动作要先完成。
注意
回复 使用道具 举报
代码运行结果为:
zi run

分析原因:
1.代码改完后没有重新编译,或者编译后又改动了代码
2.编译和运行的文件不是你贴出来代码的那个文件

{:soso_e141:}
回复 使用道具 举报
代码应该是正确的
回复 使用道具 举报
本帖最后由 戴乾刚 于 2013-3-9 23:20 编辑

重新编译一下,应该不会出现灵异事件、、
回复 使用道具 举报
本帖最后由 戴乾刚 于 2013-3-9 23:19 编辑

子类构造函数第一行会有一条隐式语句super()

如果父类没有空参数构造函数的话,子类构造函数没有指定调用父类的构造函数,会报错

但是你确定你那个代码运行结果是那样的?Fu和Zi压根没啥关系
回复 使用道具 举报
你的代码应该是Zi extends Fu
这样才会出现那种结果
原因是,当你创建子类对象的时候,如果不是手动加上调用父类有参数的构造函数时
系统会默认调用父类无参数的构造函数,因为子类继承了父类的成员,所以要先把父类的成员初始化。
如果子类有静态代码块,构造代码块,那么调用顺序应该是
静态代码块〉父类构造函数〉构造代码块〉构造函数。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马