黑马程序员技术交流社区

标题: super()和this()有什么区别? [打印本页]

作者: Geek_001    时间: 2014-6-21 19:59
标题: super()和this()有什么区别?
本帖最后由 Geek_001 于 2014-6-22 07:45 编辑

谁帮我复习一下?学着后面的,前面的想起来有点小模糊。现在理清了:
位置:若子类继承父类,子类的第一行都会有默认的隐藏的super(),用于访问父类空参数的构造函数,如不存在,需手动添加super(参数列表)或this(参数                列表),即两者都可以放于子类构造函数的第一行,但不能同时放;
作用:super():若子类继承父类,其用于调用父类空参数的构造函数,this():用于调用本类中空参数构造函数。




作者: 华绪海    时间: 2014-6-21 20:21
This一般指当前对象,super则指父类的。 如果你想要引用当前对象的某种东西或某个方法,成员,你可以使用this,  this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this   super是用在子类中,目的是访问直接父类中被屏蔽的成员, 如果你想引用父类的某种东西,就需要使用super,    一般在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,
作者: 轩辕冰晨    时间: 2014-6-21 20:31
this表示当前对象,也就是当前类对象,super表示当前类的父类。

举例:你定义一个新的类:A,这个A继承了类B,也就是说B是A的父类。那么如果A中 有个方法:a();B中也有个方法: a();
那么在A 中用this.a()调用的就是A中定义的方法,而super.aa()调用的就是A的父类B中定义的方法a();
作者: ╰繼/aiq戀い    时间: 2014-6-21 21:17
This指当前对象,super指父类的
作者: shoneworn    时间: 2014-6-21 21:57
一般用在父类和子类有重名的情况下。比如,在重写带参数的构造函数的时候,你自己定义了一个活多个全局变量,需要指定传入的值给这个全员变量,那么为了却别名称,那么,就要用到this。来说明,你将传入的值,是赋给了全局变量了。而,super则是重载父类的方法的时候,指定这个变量是父类的变量,你通过对象调用父类的方法后,传入的值,是付给了父类的这个同名变量。由它来参与运算。
作者: 姿_`态    时间: 2014-6-21 23:15
this 当成员变量和局部变量同名是,用this指定访问的变量; 把自己当做参数传递,此时this代表类类型变量; this在匿名内部类中指定访问的外部类; this用来指定要调用的构造函数; this传递当前对象实体;

super ( 1 ).在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。
   ( 2 ).但是父类是有参数的构造函数时,子类一定要有与之对应构造函数,因为子类第一句默认的是super();
   ( 3 ).同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
   ( 4 ).无论子类构造函数怎么互相调用,子类总有一个构造函数用super关键字访问父类构造函数,否则编译失败


作者: Geek_001    时间: 2014-6-21 23:35
姿_`态 发表于 2014-6-21 23:15
this 当成员变量和局部变量同名是,用this指定访问的变量; 把自己当做参数传递,此时this代表类类型变量; ...

额,这位童鞋答的好仔细啊,你总结的真全面......谢谢!
作者: 姿_`态    时间: 2014-6-21 23:54
不客气,嘿嘿
作者: 寐海流风    时间: 2014-6-22 00:32
* 1、在构造函数中,第一行代码要么是this();要么是super();如果第一行代码不是这两个语句,那么就是隐式的调用super();
* this()用在构造函数中表示:调用本类的其他构造函数;super()表示调用父类的构造函数;
* 至于他们调用的是哪个构造函数,则根据()内的参数而定,也就是调用参数个数、类型跟()内传入的参数、个数类型一致的对应构造函数;
* 而且:使用this()和super()的构造函数的参数,是包含()内所传的参数;
* 当然()内不穿参数表示调用空参构造器,但是()内所传参数必须是this和super语句所在构造函数的参数的子集;
*
* 2、如何证明创建GoodStudent时是否调用了Person的构造函数?
* 通过上述规律,一个类中若只有一个构造函数,那么这个构造函数的第一条语句必然是super(),或者隐式的super();
* 如果有x>=2 个构造函数,那么至多有x-1 个构造函数第一条语句是this()语句,
* 也就是至少有一个构造函数的是super()语句,而且这个构造函数一般都是空参的;
*
* 那么也就是说每个类中至少有一个构造函数是用super()语句调用了父类的某个构造函数(除了Object类),直到调用Object类的构造函数;
* 而且这个类中其他的构造函数就算第一条语句是this(),那么其最终也会调用逐级调用父类的构造函数,直到调用Object类的构造函数。
*
* 所以,创建GoodStudent时,必然调用了Person的构造函数。
*
* 3、GoodStudent中是否能指定调用Student的哪个构造函数?
* 综合前面所述,GoodStudent的构造函数能通过super()语句,调用()中所传参数一致的父类Student的构造函数;
* 但是super()语句中()所传参数必须是其所在GoodStudent的构造函数的参数的子集。
* 又因,父类是从其子类中抽象出来的类,所以父类拥有的属性,子类一般情况下都会有,
* 所以一般情况下,子类的构造函数的参数集>=父类的构造函数的参数集(如Student类的参数集name;age;score大于父类Person的参数集name;age);
*
* 所以GoodStudent类中的构造函数在构建类时,可以定义调用Student类的构造函数,
* 而保证子类的构造函数的参数列表>=父类的参数列表即可。
*
* 4、在GoodStudent中是否能指定调用Person的哪个构造函数?
* 综合上面所述,若Student类是先于GoodStudent创建的类,
* 那么GoodStudent的构造函数只能调用到,Student类的构造函数通过super()调用到的Person类的构造函数;
* 而调用不到Student类的构造函数中没有super()语句调用到的Person类的构造函数;
*
* 若Student类和其子类GoodStudent是同时创建的类,
* 那么GoodStudent则可以通过super()语句调用Student相应的构造函数,再通过Student的super()语句调用Person的相应构造函数;
* 但是都要确保super()语句所在函数的参数列表>= super语句的括号()中所传的参数列表,也就是>= super所调用的父类构造函数的参数列表。
* 5、上面所说的都是非静态的属性参数;但是在this()和super()中可传入static参数,而且在构造函数没有传入这个static参数时也可以在super和this中传入,具体用法又是怎样的呢?


——自己以前总结的。但是还是有漏洞。
作者: felixzr    时间: 2014-6-22 00:43
表示楼上的总结很详细,我也过来复习下
作者: 小夜    时间: 2014-6-22 00:55
哇哇哇,都说的好全哦。。。加油。。共勉。。。
作者: Geek_001    时间: 2014-6-22 07:46
华绪海 发表于 2014-6-21 20:21
This一般指当前对象,super则指父类的。 如果你想要引用当前对象的某种东西或某个方法,成员,你可以使用th ...

嗯!谢谢兄弟...............
作者: Geek_001    时间: 2014-6-22 07:47
轩辕冰晨 发表于 2014-6-21 20:31
this表示当前对象,也就是当前类对象,super表示当前类的父类。

举例:你定义一个新的类:A,这个A继承了类 ...

嗯,以后我也要常举例子,有例子理解起来更深刻.......................
作者: Geek_001    时间: 2014-6-22 07:48
╰繼/aiq戀い 发表于 2014-6-21 21:17
This指当前对象,super指父类的

黑马小伙伴,我知道,但你回答的不够详细,看看楼上楼下总结的好的,也算是帮你复习了。
作者: Geek_001    时间: 2014-6-22 07:50
shoneworn 发表于 2014-6-21 21:57
一般用在父类和子类有重名的情况下。比如,在重写带参数的构造函数的时候,你自己定义了一个活多个全局变量 ...

嗯!我现在能理解了,也记住了他们之间的区别。谢谢!
作者: Geek_001    时间: 2014-6-22 07:52
寐海流风 发表于 2014-6-22 00:32
* 1、在构造函数中,第一行代码要么是this();要么是super();如果第一行代码不是这两个语句,那么就是隐式的 ...

总结的so细致,佩服,我总觉得,我总结的可以了,和你一比起来,漏洞真不少。谢谢!

作者: 会飞De石头    时间: 2014-6-22 08:07
本来想回答 ,看那么多回答的 基本理理就顺了  




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