黑马程序员技术交流社区

标题: super方法 [打印本页]

作者: 马胜平    时间: 2012-2-21 16:04
标题: super方法
java里在类中用super调用父类构造方法时候,为什么调用语句必须是子类的第一条语句
作者: 刘基军    时间: 2012-2-21 16:28
对于使用super()或this(),规定都必须放在第一行位置。
作者: 胡威    时间: 2012-2-21 16:34
因为子类继承了父类的的成员变量,那么在对子类中这些成员变量进行初始化时,就要先考虑父类是怎么对这些变量进行初始化的。所以需要放在子类构造函数中第一条被先执行,然后再完成子类构造函数对对象的初始化。
作者: tanlei200620    时间: 2012-2-21 16:52
同意楼上的意见, 不过我猜想这样设计更多的原因是为了避免进入一个 隐含的  递归死循环, 其实如果不放在第一行也是可以的,但是这样做的结果会导致  父类对象的属性覆盖 子类对象的特性。比如  牧羊犬 继承于 犬,而犬又继承于动物  , 那么我又定义了  自己的 一条牧羊犬 来实现特定的 牧羊方法,那么在我的特定的构造方法中,如果super 语句放在我的牧羊犬的属性描述之后,那么实际new出来的对象的牧羊方法的属性只能是普通的牧羊犬的牧羊属性了。这就破坏了面向对象设计的多态。  
作者: 花开~的季节    时间: 2012-2-21 17:35
和this用法相同》》
作者: 何招俊    时间: 2012-2-21 17:56
所谓的构造方法,就是为了保证对象的完整实例化.在构造方法内部不恰当的代码(比如开启一个线程)都有可能造成溢出.  
  实例化一个对象,同时会加载它所有的父类.  
  super()放在第一行的目的是为了完全初始化父类构造方法后再初始化子类构造方法,这样做是有原因的,假如子方法里用到了父类的一个成员变量,这就保证了子类用到的是经过父类完全初始化后的变量!  
作者: 陈伟    时间: 2012-2-21 21:14
Java code

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

子类的构造函数的调用必须先完成父类的调用,这是系统初始化特性,所以super必须在构造方法中的第一句
如果父类的不存在“有参构造方法”,此时写不写super无所谓,子类构造方法一定会调用super(),
如果父类的 存在“有参构造方法”,此时必须指定是哪一个父类的构造方法

作者: 袁野    时间: 2012-2-21 22:44
一个简单的道理 先有父亲才可以有儿子啊




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