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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨长川 中级黑马   /  2013-4-10 16:54  /  1172 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在毕老师视频中,学到多线程时有这么一个问题,其实这个问题早在异常那会就有了,现在还是没有弄懂,问题如下:
  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,这是为啥呢?求解!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
你可以这样理解,this是指当前类,而super是指当前类的父类;这里的this.name等价于 当前类名.name,只是把构造函数Test中的局部变量的值赋给当前类的属性变量name而已,不存在什么调用。希望对你有用!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你可以这样理解,this是指当前类,而super是指当前类的父类;这里的this.name等价于 当前类名.name,只是把构造函数Test中的局部变量的值赋给当前类的属性变量name而已,不存在什么调用。希望对你有用!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
super()与this()区别:
        1.它们只能出现在构造方法中。
          super()执行父类的构造方法。this()执行本类的构造方法。
        2.它们如果要出现,必须是构造方法中的第一句,
        3.super()与this()不能共存。并且只能出现一次。

this和super的区别:
        1.this:用来区分本类中局部与成员属性
        2.super:用来区分子类与父类中重名的成员

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨成 于 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.第二个异常问题,描述清楚,组织好语言,我没有看清楚你说的是啥意思?丢字了?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马