黑马程序员技术交流社区

标题: 一个简单的问题,求助!!! [打印本页]

作者: 王杰123    时间: 2013-4-4 14:43
标题: 一个简单的问题,求助!!!
本帖最后由 王杰123 于 2013-4-4 18:14 编辑

package qq.com;

class Test extends Thread
{
        
        Test(String name)
        {
                super(name);//为什么在这使用super(name)就能给子类对象赋值?求帮助。
        }
        public void run()
        {
                for(int x=0; x<60; x++)
                {
                        System.out.println((Thread.currentThread()==this)+"..."+this.getName()+" run..."+x);
                }
        }

}
public class ThreadTest {

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


                for(int x=0; x<60; x++)
                {
                        System.out.println("main....."+x);
                }
        }
}



作者: 火麒麟    时间: 2013-4-4 14:59
super调用的是父类中的构造方法,Thread有Thread(String name)   的构造方法
         
作者: 聖手`书生    时间: 2013-4-4 15:11
因为你这个子类已经重写(覆盖)父类中的成员变量name。而子类的Test(String name)构造函数第一行必须有隐性的空参数的父类构造函数super(),也可以指定非空参数的其他父类构造函数,而这个父类构造函数的函数体已经用 成员变量name初始化了,并且返回一个String类型的name。

因为可以用super(name);直接给子类赋值。
作者: 王杰123    时间: 2013-4-4 15:12
火麒麟 发表于 2013-4-4 14:59
super调用的是父类中的构造方法,Thread有Thread(String name)   的构造方法
           ...

Thread(String name)   构造方法里有什么内容啊?
作者: 刘策    时间: 2013-4-4 15:48
Thread(String name)这个构造的是线程的名子。name - 新线程的名称。
作者: 庄生晓梦    时间: 2013-4-4 16:21
super(name); 语句会调用父类中的构造函数,而且子类中构造函数的第一行默认是super();
这里是因为父类中的数据子类可以直接获取,所以子类在建立对象时,需要先查看父类是如何对这些数据进行初始化的。

作者: 张权    时间: 2013-4-4 16:46
本帖最后由 张权 于 2013-4-4 17:15 编辑

看楼主这个问题, 是前面的关于继承那里没学好啊!! 不知道楼主知不知道父类子对象这个概念?  这个意思就是每个子类都有一个父类对象, 这个父类对象帮助子类对象完成父类对象的功能,这样说吧, 当我们new一个子类对象时, 其实是先初始化父类对象,  那么要如何初始化父类对象呢, 其实是通过父类的功能来帮助子类完成初始化父类对象,  而你的super(name)其实就是初始化父类子对象的一个桥梁, ;   不知道这样你明不明白, 我再这样说吧, super(name)是不是在调用父类的有参构造器?这个你应该明白吧, 调用父类有参构造器之后, 那么你这个线程的父类是不是应该就有名字了?  那么父类有名字了, 那么你子类是不是可以继承过来? 如下代码:
class Person {
        private String name;

        public Person(String name) {
                this.name = name;
        }

        public String getName() {
                return name;
        }
}

class Student extends Person {
        public Student(String name) {
                super(name);
        }

}

class Demo {
        public static void main(String[] args) {
                Student s = new Student("zhangsan");
                System.out.println(s.getName());
        }
}
在这里我要说明一点, 平时我们说的私有属性不能够继承, 其实这种说法不完全正确, 其实私有属性是可以隐式继承的, 上述代码就验证了, 当然面试的时候, 你肯定得说私有属性不能够被继承, 要是你说能够被继承, 那你肯定挂了.
我再来详细解释一下这段代码吧, 这个代码父类Person类有一个name属性, 父类的name本来为null , 但是通过super(name) 父类的那么变为 "zhangsan"了, 那么子类通过 getName()方法是不是也获取了父类的名称"zhangsan",  其实这个就和线程的代码一回事, 线程的代码默认第一个是Thread-0, 而我这里的代码时null而已 , 算了我再把代码改一下, 这样更清晰一点:
class Thread {
private String name;

public Thread() {
  name = "Thread-0";
}

public Thread(String name) {
  this.name = name;
}

public String getName(){
  return name;
}
}
class Test extends Thread {
public Test() {
  super();
}
public Test(String name) {
  super(name);
}
}
class Demo {
public static void main(String[] args) {
  //这个就好比创建一个无参的线程;
  Test t1 = new Test();
  System.out.println(t1.getName());
  
  //这个就好比创建一个有参的线程
  Test t2 = new Test("zhangsan");
  System.out.println(t2.getName());
}
}

作者: 王杰123    时间: 2013-4-4 18:55
张权 发表于 2013-4-4 16:46
看楼主这个问题, 是前面的关于继承那里没学好啊!! 不知道楼主知不知道父类子对象这个概念?  这个意思就是每 ...

高手啊,非常感谢。
作者: 火麒麟    时间: 2013-4-5 19:35
王杰123 发表于 2013-4-4 15:12
Thread(String name)   构造方法里有什么内容啊?

这个你不知道吗?查下帮助文档啊。构造方法啊,这里他的作用就是赋值啊




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