黑马程序员技术交流社区

标题: 刚运行出来的一个小问题 求指教啊 [打印本页]

作者: 小丑的媳妇2    时间: 2013-3-9 22:13
标题: 刚运行出来的一个小问题 求指教啊
本帖最后由 朱荣宁. 于 2013-3-9 22:22 编辑

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



运行结果如下:




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


作者: 黑马17期-闫东东    时间: 2013-3-9 22:27
不对呀,没有继承,结果应该是:zi run     你再运行下,看看。。。。。。
如果继承的话:子类实例化:子类所有的构造函数都会默认访问父类中的空构造函数,因为子类的每一个构造函数的第一行都有一句饮食的super();
结果是
fu run
zi run



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

注意:super语句必须定义在子类构造函数的第一行,因为父类的初始化动作要先完成。
注意
作者: 曾钦    时间: 2013-3-9 23:05
代码运行结果为:
zi run

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

{:soso_e141:}
作者: yhnan    时间: 2013-3-9 23:08
代码应该是正确的
作者: 戴乾刚    时间: 2013-3-9 23:16
本帖最后由 戴乾刚 于 2013-3-9 23:20 编辑

重新编译一下,应该不会出现灵异事件、、

作者: 戴乾刚    时间: 2013-3-9 23:16
本帖最后由 戴乾刚 于 2013-3-9 23:19 编辑

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

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

但是你确定你那个代码运行结果是那样的?Fu和Zi压根没啥关系
作者: 移动小坦克    时间: 2013-3-10 00:29
你的代码应该是Zi extends Fu
这样才会出现那种结果
原因是,当你创建子类对象的时候,如果不是手动加上调用父类有参数的构造函数时
系统会默认调用父类无参数的构造函数,因为子类继承了父类的成员,所以要先把父类的成员初始化。
如果子类有静态代码块,构造代码块,那么调用顺序应该是
静态代码块〉父类构造函数〉构造代码块〉构造函数。。。。。。。。。





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