黑马程序员技术交流社区

标题: 困惑很长时间的问题(super) [打印本页]

作者: 杨长川    时间: 2013-4-10 16:54
标题: 困惑很长时间的问题(super)
在毕老师视频中,学到多线程时有这么一个问题,其实这个问题早在异常那会就有了,现在还是没有弄懂,问题如下:
  1. class Test extends Thread
  2. {
  3. private String name;
  4.         Test(String name)
  5.         {
  6.                  super(name);
  7.                 //this.name=name;        }  
  8.        public void run()
  9.         {
  10.                 for(int x=0;x<60;x++)
  11.                 {
  12.                         System.out.println(this.getName()+" run..."+x);
  13.                 }
  14.         }
  15. }
复制代码
  1. class  ThreadTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Test t1=new Test("one---");
  6.                 Test t2=new Test("two+++");
  7.                 t1.start();
  8.                 t2.start();
  9.                 for(int x=0;x<60;x++)
  10.                 {
  11.                         System.out.println("main......"+x);
  12.                 }
  13.                
  14.         }
  15. }


复制代码
一个是用子类构造函数赋值,一个是调用父类构造函数赋值,我认为应该效果一样的,可是后面调用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