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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何明辉 中级黑马   /  2012-7-23 23:47  /  2795 人查看  /  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");
                 }
  
            }
}
回复 使用道具 举报
继承的作用中有一条,就是当你继承了某个类,你就拥有了父类所有的非私有的属性。也就是说,当你要创建自己的对象的实例的时候,
你就应该要知道父类中所含有的属性。比如,公有的方法等。这是怎么得到的了?就是通过对父类的初始化得到的。要初始化父类,
就必须通过父类的构造方法来实现,所以,子类的构造方法中都默认有个super(),你不写他也存在,但是你写了,比如你这里的1处。
你把注释去掉,就表示用了父类的带参的构造方法Thread(String name) ,传进去的是线程的名字。如果没有传值,就会默认用到空参
的构造方法,他会自动给线程生成一个名字。所以不会指向空。你这里的重点就是要明白子类的所有构造方法中如果你不写super(),
或者super(name),或者通过其他的他有的带参构造方法,他都会自动生成一个super(),如果你写了就是用你写的父类的构造方法。
回复 使用道具 举报
本帖最后由 郭凯敏 于 2012-7-24 01:00 编辑

在API中有这么一句话:

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