黑马程序员技术交流社区

标题: 使用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