黑马程序员技术交流社区
标题:
困惑很长时间的问题(super)
[打印本页]
作者:
杨长川
时间:
2013-4-10 16:54
标题:
困惑很长时间的问题(super)
在毕老师视频中,学到多线程时有这么一个问题,其实这个问题早在异常那会就有了,现在还是没有弄懂,问题如下:
class Test extends Thread
{
private String name;
Test(String name)
{
super(name);
//this.name=name; }
public void run()
{
for(int x=0;x<60;x++)
{
System.out.println(this.getName()+" run..."+x);
}
}
}
复制代码
class ThreadTest
{
public static void main(String[] args)
{
Test t1=new Test("one---");
Test t2=new Test("two+++");
t1.start();
t2.start();
for(int x=0;x<60;x++)
{
System.out.println("main......"+x);
}
}
}
复制代码
一个是用子类构造函数赋值,一个是调用父类构造函数赋值,我认为应该效果一样的,可是后面调用getName()函数时,产生的结果就是不一样了。用super父类构造函数能调用getName,为什么用子类this.name=name就不能呢,不是子类也继承了这个方法吗?还有前面学习异常的时候有一个负数异常那会我就没有弄懂,super就会调用getMessage,而在子类构造函数里面直接赋值后,后期就不会调用getMessage,这是为啥呢?求解!
作者:
通行天下
时间:
2013-4-10 17:10
你可以这样理解,this是指当前类,而super是指当前类的父类;这里的this.name等价于 当前类名.name,只是把构造函数Test中的局部变量的值赋给当前类的属性变量name而已,不存在什么调用。希望对你有用!
作者:
通行天下
时间:
2013-4-10 17:12
你可以这样理解,this是指当前类,而super是指当前类的父类;这里的this.name等价于 当前类名.name,只是把构造函数Test中的局部变量的值赋给当前类的属性变量name而已,不存在什么调用。希望对你有用!
作者:
范鹏飞
时间:
2013-4-10 18:21
super()与this()区别:
1.它们只能出现在构造方法中。
super()执行父类的构造方法。this()执行本类的构造方法。
2.它们如果要出现,必须是构造方法中的第一句,
3.super()与this()不能共存。并且只能出现一次。
this和super的区别:
1.this:用来区分本类中局部与成员属性
2.super:用来区分子类与父类中重名的成员
作者:
杨成
时间:
2013-4-10 19:17
本帖最后由 杨成 于 2013-4-10 19:20 编辑
1.你要明白super(name)指的是父类构造函数Thread(name),线程名为你传入的name的值,也就是one---和two---。而不写super(name)的话,子类构造函数默认在第一行隐式的语句是spuer(),而不是super(name),请看清楚。你不写super(name),写了this.name=name。这明显是给子类的name赋值,并没有把值传递到Thread(name)中。所以结果肯定不同,一个是你自己传进去的名字,另一个是默认的类名 +编号。
2.第二个异常问题,描述清楚,组织好语言,我没有看清楚你说的是啥意思?丢字了?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2