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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马胜平 中级黑马   /  2012-2-21 16:04  /  2645 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java里在类中用super调用父类构造方法时候,为什么调用语句必须是子类的第一条语句

7 个回复

倒序浏览
对于使用super()或this(),规定都必须放在第一行位置。
回复 使用道具 举报
因为子类继承了父类的的成员变量,那么在对子类中这些成员变量进行初始化时,就要先考虑父类是怎么对这些变量进行初始化的。所以需要放在子类构造函数中第一条被先执行,然后再完成子类构造函数对对象的初始化。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
同意楼上的意见, 不过我猜想这样设计更多的原因是为了避免进入一个 隐含的  递归死循环, 其实如果不放在第一行也是可以的,但是这样做的结果会导致  父类对象的属性覆盖 子类对象的特性。比如  牧羊犬 继承于 犬,而犬又继承于动物  , 那么我又定义了  自己的 一条牧羊犬 来实现特定的 牧羊方法,那么在我的特定的构造方法中,如果super 语句放在我的牧羊犬的属性描述之后,那么实际new出来的对象的牧羊方法的属性只能是普通的牧羊犬的牧羊属性了。这就破坏了面向对象设计的多态。  

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
和this用法相同》》
回复 使用道具 举报
所谓的构造方法,就是为了保证对象的完整实例化.在构造方法内部不恰当的代码(比如开启一个线程)都有可能造成溢出.  
  实例化一个对象,同时会加载它所有的父类.  
  super()放在第一行的目的是为了完全初始化父类构造方法后再初始化子类构造方法,这样做是有原因的,假如子方法里用到了父类的一个成员变量,这就保证了子类用到的是经过父类完全初始化后的变量!  
回复 使用道具 举报
陈伟 中级黑马 2012-2-21 21:14:31
7#
Java code

开始--->
父类的静态代码--->
子类的静态代码-->
父类的非静态代码--->
父类构造函数--->
子类非静态代码--->
子类构造函数--->完成

子类的构造函数的调用必须先完成父类的调用,这是系统初始化特性,所以super必须在构造方法中的第一句
如果父类的不存在“有参构造方法”,此时写不写super无所谓,子类构造方法一定会调用super(),
如果父类的 存在“有参构造方法”,此时必须指定是哪一个父类的构造方法
回复 使用道具 举报
袁野 黑马帝 2012-2-21 22:44:20
8#
一个简单的道理 先有父亲才可以有儿子啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马