黑马程序员技术交流社区
标题:
关于线程中getName()返回值问题
[打印本页]
作者:
何明辉
时间:
2012-7-23 23:47
标题:
关于线程中getName()返回值问题
本帖最后由 何明辉 于 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有什么关系,它是怎么返回起默认值的啊,貌似毕老师也没有讲,求大家给我说一下,谢谢
作者:
乐峰
时间:
2012-7-24 00:03
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。
作者:
李菁
时间:
2012-7-24 00:17
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 00:22
继承的作用中有一条,就是当你继承了某个类,你就拥有了父类所有的非私有的属性。也就是说,当你要创建自己的对象的实例的时候,
你就应该要知道父类中所含有的属性。比如,公有的方法等。这是怎么得到的了?就是通过对父类的初始化得到的。要初始化父类,
就必须通过父类的构造方法来实现,所以,子类的构造方法中都默认有个super(),你不写他也存在,但是你写了,比如你这里的1处。
你把注释去掉,就表示用了父类的带参的构造方法Thread(String name) ,传进去的是线程的名字。如果没有传值,就会默认用到空参
的构造方法,他会自动给线程生成一个名字。所以不会指向空。你这里的重点就是要明白子类的所有构造方法中如果你不写super(),
或者super(name),或者通过其他的他有的带参构造方法,他都会自动生成一个super(),如果你写了就是用你写的父类的构造方法。
作者:
郭凯敏
时间:
2012-7-24 00:37
本帖最后由 郭凯敏 于 2012-7-24 01:00 编辑
在API中有这么一句话:
1.jpg
(13.49 KB, 下载次数: 39)
下载附件
2012-7-24 00:31 上传
你使用的getName方法是从父类中继承来的,你没重写父类的构造(由于你把子类构造方法中Super(name)注释了),所以getName无法获得你线程子类中自定义的线程名称,这时候系统认为你没有给他起新的名字来标识,
他就为其自动产生一个名字
Thread-n。
作者:
肖琦
时间:
2012-7-24 00:55
线程都有的默认名称:
通过线程的getName()方法获得;规律是:Thread-编号,编号是从0开始的
其实视频上有讲到这一点,你看看11天-06课吧,好像是原话,以上是我做的笔记.....
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2