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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 skyfly 于 2014-4-16 17:57 编辑

难道是因为,子类实例化时无论如何都要调用父类构造函数中的原因吗,比如父类是无参构造函数JVM会自动调用,如果是有参构造函数必须用super(),但是为何不能同时出现。

10 个回复

倒序浏览
  1. 我想这应该是java构造函数的一种机制吧,首先以子类和父类为例。
  2. 当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示的调用它(如下面的例子),
  3. 在程序中的顺序是这样的:
  4.          
  5.                  super(...) //父类构造函数
  6.                   .....        //当前类构造函数语句
  7. 同样的道理,当一个类中有多个构造函数的时候,在其中一个构造函数中也可以先调用其他的构造函数来初始化对象,这种方法叫做“显式构造方法调用”,当那样的构造方法被调用,它将执行通常的super() 过程以及后续的操作。然后在执行本构造函数中的构造语句,这个时候的顺序是这样的:
  8.                   this(....)     //当前类的其他构造函数
  9.                   ...         //当前构造函数的其他语句

  10. 其实为什么要把this(...)放在前面很容易理解,因为任何的子类都必须要先调用父类的构造函数,而当你采用“显示构造方法调用”即用this(...)调用当前类的其他构造函数时,这个时候父类的构造就在this(...)里面执行了,this(...)里面应该不仅包括当前类的构造,还必须包括父类的构造,所以为了保证父类的构造函数先被执行,必须要先调用this(.....)
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
不是不可以同时出现,只是你不写的时候底层会自动帮你加上构造函数,你要写了,底层就不加了!我想底层代码应该有个判断语句,有就不加,没有就加,这和同时出现没什么关系吧,重载么,你自己写上也没有问题啊
回复 使用道具 举报
因为两者均必须编写在构造方法内的第一行,也就是因为这个原因,this和super无法同时存于同一个构造方法内。
回复 使用道具 举报
因为两者都必须写在构造函数的第一行。
回复 使用道具 举报
我想这应该是java构造函数的一种机制吧,首先以子类和父类为例。
回复 使用道具 举报
当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须在子类的构造函数中显示调用它
回复 使用道具 举报
对于变量:
如果子类中出现非私有的成员变量时
子类要访问本类中的变量用this,要访问父类的变量用super
this代表的是本类对象的引用
super代表的是父类对象的引用

对于子父类中的构造函数:
在对子类对象进行初始化时,父类的构造函数也会运行
那是子类的构造函数默认第一行有一条隐式的语句super();
super()会访问父类中空参数的构造函数,而且子类中所以构造函数默认第一行都是super();

为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类建立对象时,需要先查看父类是如何对这些数据进行初始化的
所以子类在对象初始化时要先访问一下父类中的构造函数
如果要访问父类中指定的构造函数,可以通过手动定义super语句来指定

注意:super语句一定定义在子类构造函数的第一行

子类的实例化过程:
子类的所有构造函数,默认都会访问父类中空参数的构造函数
因为子类每一个构造函数内的第一行都有一句隐式的super()

当父类中没有空参数的构造函数时,子类必须通过super或this语句来指定要访问的构造函数
当然子类构造函数的第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少有一个构造函数会访问父类中的构造函数

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 1 0
super()和this()都必须放在第一行,他们不可能同时都在第一行的位置。
回复 使用道具 举报
用this调用其他构造方法时,this必须为第一条语句,然后才是其他语句。

This表示当前对象。

Public  void  printNum(){
  Int number=40;
  System.out.println(this.number);
}
此时打印的是实例变量,而非局部变量,即定义在类中而非方法中的变量。
Super()表示调用父类的构造方法。
Super()也和this一样必须放在第一行。
This()用于调用本类的构造方法。
如果没有定义构造方法,那么就会调用父类的无参构造方法,即super()。
回复 使用道具 举报
都必须放在第一行,而super代表父类对象,this代表当前类的对象,jvm要疯掉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马