黑马程序员技术交流社区
标题:
使用this和super时不理解的问题。
[打印本页]
作者:
周玉龙
时间:
2012-7-16 21:42
标题:
使用this和super时不理解的问题。
本帖最后由 周玉龙 于 2012-7-17 22:21 编辑
今天复习时感觉this与super有些不是很懂。然后看到了一个关于这个得帖子,说了七个应该注意的问题。其中有两个我不明白。第一个是:尽管可以用this调用一个构造器,但却不能调用两个。
第二个是:从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。super不也是指向父类对象的一个指针么?为什么这么说。
作者:
383105662
时间:
2012-7-16 22:04
this只能调用本类上的成员变量和方法,super能调用父类上的方法和变量,但使用super只能调用父类的东西!this却只能调用本类的!
作者:
韩伟
时间:
2012-7-16 22:32
首先不是说this和super不能同时用,而是说当定义类的构造函数时,如果要调用this或者super必须把它们放在第一句,因为只有一个第一句,不可能放两句话。
其次,super只在子类中使用,在子类中指向父类的成员。而this适用于所有的类,在父类中this指向父类中的成员,而父类中没有super存在(假定父类没有父类);在子类中this指向子类的成员,这里不仅包括子类自己定义的成员还包括从父类中继承的成员。super指的是父类中独有的,或者是在未被子类覆写之前的成员。
作者:
侯茂绵
时间:
2012-7-16 23:09
this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,如果你想引用父类的某种东西,就使用super。
在同一构造函数 他们不能共存
作者:
曹魁
时间:
2012-7-16 23:32
this是对本类对象的引用。
super代表的是直接父类的作用区域。
然而Super和this是不能共存的额,负责的话,,来回调用就会出现死循环,造成堆内存溢出的问题。
作者:
周坤
时间:
2012-7-16 23:45
在子类对象初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句 super();
super();会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
public class ExtendsDemo {
public static void main(String[]args){
Son demo1=new Son();
}
}
class Father{
//若没有第一个构造函数,那么子类将不能出现super();而必须出现super(int x);
Father(){
System.out.println("Father");
}
Father(int x){
System.out.println("Father1");
}
}
class Son extends Father{
Son(){
//super();若是加上super(),则自动分配的super将消失,打印的结果为Fatehr Son
//super(4);若是加上super(4),则jvm去调用父类的Father(int x)构造方法,打印的结果为Fateher1 Son。其中super(),super(4),不能同时存在,编译失败,因为对象属性初始化只能一次。
System.out.println("Son");
}
}
在对象引用时,会默认构造方法中有super();但同样可以被覆盖。
子类一定会调用父类的构造函数。若父类中有了其他构造函数,那么子类就不会默认加载空构造函数了,而必须调用和父类相对应的构造函数,否则编译失败。
调用父类构造函数super,和调用本类的构造函数this必须放在第一行,不能同时在一个构造函数中出现。因为this中其实已经包含了super,即this调用本类对象,但本类会先加载父类,所以必然不能同时出现。
子类中所有构造函数都会默认访问空参数的构造函数。因为子类每一个构造函数内部的第一行都有一句隐式的super();
当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来制定要访问父类的构造函数。
当然子类的构造函数第一行也可以手动指定this语句来访问本类的构造函数,子类中至少会有一个构造函数会访问父类中的构造函数。
作者:
熊雪莲
时间:
2012-7-17 01:13
this 是对对象的一个引用,谁调用我我就指向谁
super是代表父类所属的那片空间
关于,第一个问题:是因为对this的调用必须是构造器的第一句,因为初始化的动作要先完成,具体看代码
class Test
{
private String name;
private int age;
Test()
{
System.out.println("Test run");
}
Test(String name)
{
this.name=name;
}
Test(String name,int age)
{
this();
this(name);//这样写会提示错误,对this的调用必须是构造器的第一条语句,因为初始化动作要先执行
this.age=age;
}
public void speak()
{
System.out.println("name="+name+":age="+age);
}
public static void main(String[] args)
{
Test t=new Test("lisi",32);
t.speak();
}
}
作者:
京鱼龙
时间:
2012-7-17 01:31
第一个是:尽管可以用this调用一个构造器,但却不能调用两个?
this它本身表示的就是对当前对象的引用。谁引用它它就指向谁。假如能调用两个分别是A,B,那么this不可能既指向A,又指向B。
第二个是:从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字?
当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量。
super是访问父类被子类隐藏的变量或覆盖的方法。
通俗点说就是this是在自家范围内活动,而super可以走出自家的范围,能力比较大。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2