黑马程序员技术交流社区

标题: 此处为什么用super()? [打印本页]

作者: 李节起    时间: 2012-4-9 13:39
标题: 此处为什么用super()?
class Test extends Thread
{
       
        Test(String name)
        {
                //this.name = name;
                super(name);  //此处为什么用super();就可以用到下面的"one---","two+++"?
        }


。省略



class ThreadTest
{
        public static void main(String[] args)
        {
                Test t1 = new Test("one---");
                Test t2 = new Test("two+++");


。。。省略。。。。


在Java中,this通常指当前对象,super则指父类的。下面的ThreadTest 类是上面test的父类吗?:time:
作者: 蒙武辉    时间: 2012-4-9 13:43
super(name)是调用父类的构造函数给子类成员初始化用的。
作者: newlaw2013    时间: 2012-4-9 13:53
应该在Test的父类Thread中定义了String name 这一属性,Test类本身没有定义;
它要到父类中去找父类中对应的构造函数,这样才能对传入的name进行初始化。
作者: 黄或俊    时间: 2012-4-9 13:55
给子类初始化的时候必选先给父类的构造方法初始化
super(name);
同时你有重写了父类的构造方法
作者: 孙利川    时间: 2012-4-9 14:00
Test的父类是Thread呀,super的作用是调用父类的构造函数,在本例中,super(name);调用的是Thread类的Thread(String name);构造函数。
上面代码的意思是在子类Test的构造函数中再调用父类的构造函数,并把参数name传入。
作者: 黑马-刘昌文    时间: 2012-4-9 14:35
一个子类继承了某一个父类,当在创建子类的实例时都会去调用父类的构造方法,首先会隐式的调用父类不带参数的构造方法!要想调用带参数的构造方法,必须用supper关键字!
作者: 张昊镭    时间: 2012-4-9 15:50
这个问题确实非常蛋疼,在第九天讲自定义异常类的时候就会讲到,结果昨天想了半天还是没搞懂,我觉得我可
能到现在还没完全弄懂,先说下我的理解,错误的地方,烦请纠正.
Test(String name)这个是构造方法,Test是Thread子类,好吧:
1.super语句一定要定义在子类构造方法的第一行.因为子类会具备父类中的数据,所以要先明确父类是如何对

这些数据初始化的,所以要先初始化父类,所以第一行应该是super语句.当然了,也可以用this()访问本类的构

造方法.
2.当父类中没有空参数的构造函方法时,子类必须手动通过super()语句指定要访问父类中的构造方法.所以可

能是因为Thread里面没有定义空参数的构造方法,而是只定义了带参数的构造方法,就是
Thread(String name)
        {
            this.name = name;
        }
所以Test(String name)
{

}
第一行要写super(name);写了之后就能实例化Test对象往name赋值了.
3..this.用于在成员变量和局部变量同名时区分,表示所在类成员变量.也就是说你Thread里面的那个

this.name是指Thread的成员变量name,this指Thread.
4.所以lz的完整代码应该是这样吧:
class Thread
{
        String name;
        Thread(String name)
        {
                this.name=name;
        }
}
class Test extends Thread
{
      
        Test(String name)
        {      
                super(name);
        }
}
class ThreadTest
{
        public static void main(String[] args)
        {
                Test t1 = new Test("one---");
                Test t2 = new Test("two+++");
        }
}
作者: pray    时间: 2014-4-26 08:05
初来乍到,请多多关照。。。
作者: 詹绪长    时间: 2014-5-9 12:23
子类没有的方法而他的父类(super)里边有的话,可以通过(super)来调用。




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