A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘士林 中级黑马   /  2012-10-31 21:04  /  1883 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test extends Thread
{
private String name;
Test(String name)
{
  this.name=name;
}
public void run()
{
    System.out.println(this.getName());//打印的是Thread-0
}
class Test extends Thread
{

Test(String name)
{
  super(name);
}
public void run()
{
    System.out.println(this.getName());//打印的是自定义的name
}
为什么用this.name=name;时,打印的线程名称就是默认的
而用super(name);时,打印的就是自定义的呢?
毕老师说,Thread类中已定义好了给线程起名字的方法,可以直接调用,但是Test继承Thread之后
它其中也就有了getName()方法,它的返回值肯定是rerurn this.name,而本类中就有name属性,为什么不返回,却返回默认名呢?
就算调用super(name)方法,它其中应该也是this.name=name,为什么就能打印出自定义的线程名称?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
如果 要是在这儿你想说是this.name=name,后 调用 getName 方法 打印出this.name的值,那么您就要重写getName的方法。
您调用的getName的方法只是调用的父类的方法,父类的方法调用的是父类的元素。而super(name)则,把参数传给了父类。所以调用getname可以查看出来。
我想应该是这样的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
        private String name;
        Test(String name) {
                super(name);       // 如果只用super(name),你会发现一点,下面的打印打语句打印出来的name为null
              System.out.println(name)
              // this.name=name;除非赋值以后再打印名字才会出来。这说明了一点,你这个对象调用getName方法实际上根本与你该对象本身无关。
                                           //调用的实际上父类的方法,父类调用的其实就是子类对象赋值给父类的属性,通过super
    如果想子类自己调用的话,需要重写。但是Thread类的getName是final修饰的,所以只能新写个函数了。。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马