黑马程序员技术交流社区

标题: 越学越糊涂,关于getName的问题 [打印本页]

作者: 孙沛    时间: 2012-9-8 19:51
标题: 越学越糊涂,关于getName的问题
越学越糊涂,请教下
class Test extends Thread{
     Test(String name){
           super(name);//这句话是调用Thread类的构造函数Thread(String name),可是有什么作用呢,为什么要这样呢,下面的this.getName()如何获取到线程的名字呢
     }
                public void run(){
                        System.out.println(this.getName());
                }
}
class ThreadTest{
        public static void main(String[] args){
                Test t1 = new Test("111111");
                t1.start();
        }
}


作者: 霍永刚    时间: 2012-9-8 20:27
本帖最后由 霍永刚 于 2012-9-8 20:50 编辑

class Test extends Thread{
     Test(String name){
           super(name);//这句话是调用Thread类的构造函数Thread(String name),可是有什么作用呢,为什么要这样呢,下面的this.getName()如何获取到线程的名字呢(继承Thread类里的name属性;当你传入name值的时候直接写入到父类的name属性里)
     }
                public void run(){
                        System.out.println(this.getName());//这里应该可以获取到名字了
                }
}
还有一个方法应该这样写
class  Thread(){
private String name;   //封装属性值name;
public String getname() {
  return name;
}
public void setname(String name) {
  this.name= name;
}
public  Thread(String name){  //构造函数
this.name=name;
}
}

class ThreadTest{
        public static void main(String[] args){
                Test t1 = new Test("111111");
                t1.run();
        }
}





作者: 王宝龙    时间: 2012-9-8 20:32
本帖最后由 王宝龙 于 2012-9-8 20:33 编辑

super(name);//调用父类的构造函数,父类里有个这样的构造函数Thread(String name)和一个这样的方法String getName(),
子类Test已继承了父类,所以父类的所有
public方法就是自己的了,子类可以完全无条件使用。
这是简单的继承的规则!
  1. class Test extends Thread
  2. {
  3.       Test(String name)
  4.           {
  5.             super(name);//调用父类的构造方法,子类Test已继承了父类所以父类的所有
  6.                                                                                 //public方法就是自己的了子类完全无条件可以用
  7.       }
  8.                  public void run()
  9.                                  {
  10.                          System.out.println(this.getName());
  11.                  }
  12. }
  13. class ThreadTest
  14. {
  15.          public static void main(String[] args)
  16.                  {
  17.                  Test t1 = new Test("111111");
  18.                  t1.start();
  19.          }
  20. }
复制代码

作者: 创出一片辉煌    时间: 2012-9-8 20:35
在Thread内部定义了个  private char  name[];   "name"这个参数通过构造方法,传递给init()这个方法,次方发接收到name后通过"this.name = name.toCharArray();"赋值给 name数组,而getName方法返回的正是这个name数组:   public final String getName() {
        return String.valueOf(name);
    }
再说this.getName,this调用方法和super调用方法时是这样的,this是现在本类中找getName这个方法,如果本类没有就会调用父类getName方法,所以最终是调用Thread类的getName方法,super不会在本类中找getname方法,直接调用父类的getName方法
作者: 霍明波    时间: 2012-9-8 21:49
本帖最后由 霍明波 于 2012-9-8 21:56 编辑

class Test extends Thread{
     Test(String name){
           super(name);//这句话是调用Thread类的构造函数Thread(String name),可是有什么作用呢,为什么要这样呢,下面的this.getName()如何获取到线程的名字呢
     }
                public void run(){
                        System.out.println(this.getName());
                }
}
class ThreadTest{
        public static void main(String[] args){
                Test t1 = new Test("111111");
                t1.start();
        }
}
这里要先明确一点,用到的getName()方法获取名字是父类Thread的方法,而且此方法是final的即不能被复写,所以用Test ti = new Test("11111")构造函数时,需要将参数传到父类(super(name)就是这功能),如果没有传到父类的话,那么父类还是用默认的名字,即你输入的名字不会打出来,因为getName()方法是父类Thread的,只能提取父类中的变量name。就相当于父类有一个变量private String name;如果你不给他输入数据的话,他就是默认的,getName()也只会打印出默认的。
     如果你想要在子类自定义一个名字和获取名字的方法也可以,但是没有必要。

作者: 陈振兴    时间: 2012-9-8 22:21
首先讲的就是java 4大机制中的封装:(定理)
(1)任何子类的构造方法都会去调用父类的构造方法
(2)任何类都有构造方法,如果程序员自己不定义,则系统会加上一个默认的构造方法。如果定义了,则系统不会加
(3)任何子类的构造方法的第一行一定式super()或者this();
如果程序员不这样写,则系统会默认的加上super();
this();调用本类其它的构造方法,它出现在构造方法的第一行;
这样就知道你所抛出的第一个疑惑!
然后就是this.getName(),继承父类的构造方法,而java已经将Thread类封装好了,提供的构造方法里就有Thread(String name),
一般情况下我们书写方式是:在这里Thread.currenteThread.getName()==this.getName();会自动调用类中的SetName()、GetName(),这就是我们经常在自定义类里写的这个方法。
首先从封装入手,后面学到的内容大多数就是基于4大机制展开与应用的。
作者: Tesla时光    时间: 2012-9-9 02:37
class Test extends Thread{
     Test(String name){
           super(name);
//这句话是调用Thread类的构造函数Thread(String name),没错,也就是将你的命名传递给Thread(String name){this.name=name;}
这也就是说,你把Thread对象里的name成员属性改了,改成了"111111".而同时你也继承了父类的成员变量name.这个name也是"111111".
那么你调用继承父类的方法getName(),所得到name的值是一样的.

     }
                public void run(){
                        System.out.println(this.getName());//正是因为有上面的原因,这里写成Thread.currentThread().getName()也是可以的
                }
}
class ThreadTest{
        public static void main(String[] args){
                Test t1 = new Test("111111");
                t1.start();
        }
}

作者: 陈俊来    时间: 2012-9-9 15:14
lz,我说简单一点,
class Test extends Thread{
     Test(String name){
           super(name);//这句话是调用Thread类的构造函数Thread(String name),可是有什么作用呢,为什么要这样呢,下面的this.getName()如何获取到线程的名字呢
     }。。。。。。
1、你的Test继承了Thread,目的就是要使用它的的东西 ,super(name) ,可以调用父类的构造函数,直接将name这个值,传入父类的name中,
2、至于this.getName获取到 名字,因Test构造函数永乐super,所以,可以获取到名字,其实这两个问题是同一个问题,希望对你有所帮助            




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