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

© 何明辉 中级黑马   /  2012-7-23 23:47  /  3003 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何明辉 于 2012-7-24 09:57 编辑

class XianCheng extends Thread
{
        private String name;
        XianCheng(String name)
           {
               //super(name);————————1
                this.name=name;
            }
         public void run()
           {
               for(int i=60;i>0;i--)
                {
                    System.out.println(this.getName()+"----hello");
                 }
  
            }
}
class XianChengDemo
{
         public static void main(String[] args)
           {
               XianCheng p1=new XianCheng("one");
               XianCheng p2=new XianCheng("two");
                  p1.start();
                 p2.start();
                 for(int i=60;i>0;i--)
                    {
                         System.out.println("main");
                      }
            }
}
程序中若也编译1处的话则线程p1和p2返回的名称分别是one和two;那至少说明一点getName()方法中肯定去访问name(父类)的值,然后返回该值,但是如果父类Thread中相应的name(不一定是name,一定和此类似)没有赋值的话,则会指向空,应该说返回的是null,但为什么还能返回线程的默认值啊,它和name有什么关系,它是怎么返回起默认值的啊,貌似毕老师也没有讲,求大家给我说一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
class XianCheng extends Thread
{
        private String name;
        XianCheng(String name)
           {
               //super(name);————————1
                this.name=name;
            }
         public void run()
           {
               for(int i=60;i>0;i--)
                {
                    System.out.println(this.getName()+"----hello");
                 }
  
            }
}
class XianChengDemo
{
         public static void main(String[] args)
           {
               XianCheng p1=new XianCheng("one");
               XianCheng p2=new XianCheng("two");
                  p1.start();
                 p2.start();
                 for(int i=60;i>0;i--)
                    {
                         System.out.println("main");
                      }
            }
说明一点getName()方法中肯定去访问name(父类)的值,然后返回该值,父类中name的值是通过调用getName()实现的,该方法返回的值是从Thread-0开始给线程名字赋值,为什么是这个值,而不是null,是因为该值就是父类内部定义好的,在你不复写改变父类setName()方法的值,那么this.getName调用的值就是父类的name值,即Thread-x,而不是null。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class XianCheng extends Thread    XianCheng类继承Thread类。Thread 类中有一个name属性,XianCheng类中可以使用或为该变量赋值
{
        private String name;
        XianCheng(String name)
           {
               //super(name);————————1  使用super(name) 其实调用的是Thread 类中的public final String getName()方法为name 赋值。如果不显示调用,程序也会隐式调用父类的默认值
                this.name=name;
            }
         public void run()
           {
               for(int i=60;i>0;i--)
                {
                    System.out.println(this.getName()+"----hello");
                 }
  
            }
}
回复 使用道具 举报
本帖最后由 郭凯敏 于 2012-7-24 01:00 编辑

在API中有这么一句话:

你使用的getName方法是从父类中继承来的,你没重写父类的构造(由于你把子类构造方法中Super(name)注释了),所以getName无法获得你线程子类中自定义的线程名称,这时候系统认为你没有给他起新的名字来标识,
他就为其自动产生一个名字Thread-n。
回复 使用道具 举报
线程都有的默认名称:
     通过线程的getName()方法获得;规律是:Thread-编号,编号是从0开始的
其实视频上有讲到这一点,你看看11天-06课吧,好像是原话,以上是我做的笔记.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马