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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-7-29 15:05  /  1574 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜佳瑞 于 2012-7-29 15:36 编辑

在毕老师视频中,学到多线程时有这么一个问题,其实这个问题早在异常那会就有了,现在还是没有弄懂,问题如下
class Test extends Thread
{
        private String name;
        Test(String name)
        {
                 super(name);
                //this.name=name;
        }         一个是用子类构造函数赋值,一个是调用父类构造函数赋值,我认为应该效果一样的,可是后面调用getName()函数时,产生的结果就是不一样了。用super父类构造函数能调用getName,为什么用子类this.name=name就不能呢,不是子类也继承了这个方法吗?还有前面学习异常的时候有一个负数异常那会我就没有弄懂,super就会调用getMessage,而在子类构造函数里面直接赋值后,后期就不会调用getMessage,这是为啥呢?求解!        
        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);
                }
               
        }
}

2 个回复

倒序浏览
首先,父类的方法是无法调用子类的属性的。你在子类里设了一个和父类同名的字段,name,但是对象存到内存中时,
还是会保留Thread原先的name属性,只是因为它是private的,所以子类无法访问,但父类的getName()方法还是访问的Thread里的name.
而且,你不要凭直觉就猜测Thread类里面的name是字符串,getName只是简单的返回这个name的字符串,实际上,Thread里的name是一个字符数组

回复 使用道具 举报
因为private String name;,name是私有的,子类继承父类的时候没有继承私有的变量name,只能通过getName来访问
毕向东第8天的继承里有说到你这种情况,我记得好像是图解那个视频,你可以看看。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马