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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡谭龙 中级黑马   /  2015-3-21 14:52  /  1661 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡谭龙 于 2015-3-22 07:51 编辑

  1. class Fu
  2. {

  3.         Fu( )

  4.         {

  5.                 System.out.println("fu null");

  6.         }

  7.         Fu(int x)

  8.         {

  9.                 System.out.println("fu x");

  10.         }

  11. }

  12. class Zi extends Fu

  13. {

  14.         Zi( )

  15.         {

  16.                 System.out.println("zi null");

  17.         }

  18.         Zi(int x)

  19.         {

  20.                 this( );

  21.                 super();  //报错的位置。

  22.                 System.out.println("zi:"+x);

  23.         }

  24. }
复制代码
如果Zi zi = new Zi(4);  因为Zi(int x)构造函数内第一行写this(),它默认调用了父类的无参构造函数,第二行的super();有调用了父类的无参构造函数,这么写是错误的 ,但为什么呢,这个语法上感觉说的过去,也就是初始化了两次父类

9 个回复

倒序浏览
this()和super()都只能放在构造函数第一句。所以二者不可能同时出现在一个构造函数中
回复 使用道具 举报 1 0
fantacyleo 发表于 2015-3-21 14:53
this()和super()都只能放在构造函数第一句。所以二者不可能同时出现在一个构造函数中 ...

就是想知道原理。。。
回复 使用道具 举报
胡谭龙 发表于 2015-3-21 15:27
就是想知道原理。。。

这就是原理,语法就是这么规定的。 java 语言规范原文:
The first statement of a constructor body may be an explicit invocation of another constructor of the same class or of the direct superclass

就像java的赋值运算符用=而pascal用:= 有什么原理呢?就是规定不同嘛
回复 使用道具 举报
使用this()来从某个构造函数调用同一个类的另外一构造函数,this()只能用在构造函数中,并且必须是第一行语句,而super()是调用父类滴。每一个构造函数是都可以调用this()或者super的,但是不能同时调用,因为他们都要放在第一行,而第一行的位置只有一个,一山不能容二虎啊!
回复 使用道具 举报
其实 子类中第二个构造函数中的super() 根本就不需要,super()无非就是想调用父类中的无参构造函数,它前面的this()会调用本类中的第一个构造函数,而第一个构造函数中有一句隐式的super(),会调用父类中的第一个构造函数。
回复 使用道具 举报
fantacyleo 发表于 2015-3-21 15:36
这就是原理,语法就是这么规定的。 java 语言规范原文:
The first statement of a constructor body may ...

看来super() 和 this()只能写在第一行
回复 使用道具 举报
记得视频里毕老师说过 是个初始化优先级的问题构造函数语句必须要放在第一行
回复 使用道具 举报
这个没什么道理记住就行了。一山不能容二虎,就像有些真理我们是无法解释的,那么记住就行了,拿来用。
回复 使用道具 举报
调用本类无参构造函数this()时,this()里面默认带有super().所以这里重复了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马