黑马程序员技术交流社区

标题: 关于线程中重写run方法的问题。 [打印本页]

作者: 张淼    时间: 2012-9-21 23:15
标题: 关于线程中重写run方法的问题。
编译并运行以下代码的输出结果是?(  )
public class MyThread extends Thread
{
        public int run(int time){        //该run方法不是已经覆盖了Thread类中的run方法,不是应该执行下面的输出语句么?
                                                   //运行的时候没有任何的输出结果,为什么呢?
                System.out.println("run() called");
                return 5;
        }

        public static void main(String args[]) {
                new MyThread().start();
        }
}
A、编译错误
B、运行时出错
C、输出 run() called
D、无输出



作者: 程振    时间: 2012-9-21 23:31
D
最好用@Overrider注解来表示覆盖父类的方法实现,可以避免不必要的错误
作者: 严海荣    时间: 2012-9-21 23:42
启动start()方法后,线程就去执行它的run()方法,你重载了它的方法,而没有重写run()方法,run()方法就没内容了,无输出
所以你得在run()方法中打印,才能被new Thread().start()调用,
而要调用你重载的run(int time)方法,就必须new Thread().run(xxx);     xxx为传进一个int型的数据。

重写:子类继承父类时,子类重新写父类的方法,此时方法的返回类型和参数列表必须和父类的一致。
重载:就是同名不同参, 好比一个人可以用不同种餐具.
作者: 王宝龙    时间: 2012-9-21 23:56
你 根本就没有复写run()方法,Thread类的run方法是这样的void run()。
你要复写 也必须返回值类型为void,而你的返回值类型是int的。
作者: 汪小照    时间: 2012-9-22 00:18
编译并运行以下代码的输出结果是?( D )
public class MyThread extends Thread
{
        public int run(int time){        //该run方法不是已经覆盖了Thread类中的run方法,不是应该执行下面的输出语句么?
                                           答:没有,标准的覆盖应该是public int run(){}即不带参数
              建议你以后写覆盖最好去copy这个方法,也可以使用Eclipse工具自动生成override代码.
              因为你在主函数没有调用这个方法,所以不会有输出语句。
              而主函数你调用的是从Thread类继承过来的run方法。到jdk去查Thread类的源码,
              你会发现调用Thread类本身的run方法是不会发生什么改变,所以在继承Thread类时一般都
              重写run方法。
                                                   //运行的时候没有任何的输出结果,为什么呢?
                                                       答:第一个答案我已经回答了这条答案。
                System.out.println("run() called");
                return 5;
        }
        public static void main(String args[]) {
                new MyThread().start();
        }
}
A、编译错误
B、运行时出错
C、输出 :run() called
D、无输出


作者: 陈振兴    时间: 2012-9-22 00:29
D,原因

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
Thread 的子类应该重写该方法。而你写的方法为返回int型的方法并不是覆盖Thread的方法。
有一点是,继承中可以覆盖父类方法,也可以不写,但当你不写的时候就会调用其父类的方法,这也是第一句的解释。
所以它不会出现任何运行结果。

作者: 梁志冰    时间: 2012-9-22 00:36
public class MyThread extends Thread
{
        public int run(int time){        //该run方法不是已经覆盖了Thread类中的run方法,不是应该执行下面的输出语句么?
                                                   //运行的时候没有任何的输出结果,为什么呢?
                System.out.println("run() called");
                return 5;
        }
        public static void main(String args[]) {
                new MyThread().start();
        }
}

运行结果是:D 无输出

分析这题,首先要了解以下两个知识点:
1、创建线程的一种方式是:
     1)、继承Thread
     2)、覆写run方法,将线程要运行的任务代码存储到run方法中
     3)、创建Thread类的子类对象。
     4)、调用start方法开启线程并调用run方法。

2、覆写父类中的方法,必须保证子类的方法与父类的方法一模一样。返回值类型,方法名,参数类型和个数都要跟父类的方法一致,才能进行覆盖

本题中,MyThread继承了Thread,但是没有覆写Thread中的run()方法,而使用start(),开启线程后,会执行run()方法中的内容,因为没有覆盖run(),所以线程开启后没有进行任何的操作就结束了。

作者: 张忠豹    时间: 2012-9-22 01:12
确实,值得一说,首先,值得一说的是楼主需要清楚的明白重载和重写的概念:
所谓重写,是面向对象的第二大特性继承中的一大特性,重写就是说在子父类中出现了一模一样的函数时,子类对象在调用该函数时,运行的是子类中的函数,父类中的函数就好像被隐藏了一样,就是说,要满足重写,就必须子类中的方法名、方法返回类型及方法的参数类型及参数个数和父类中的一致,才能实现重写的效果。
所谓重载,就是说在一个类中,出现名称相同,参数不同的函数,参数不同就是说参数的类型和个数不同,值得一提的是,重载和函数的返回值类型没有关系。

楼主要想实现想要的效果,应该修改以上程序:
public class MyThread extends Thread
{
         public void run(){        
           System.out.println("run() called");
         }

        public static void main(String args[]) {
                 new MyThread().start();
         }
}
如此的话,程序运行,调用线程的start方法启动线程后会打印:run() called
作者: 赵永康    时间: 2012-9-22 10:03
public class MyThread extends Thread
{
        public int run(int time){        //该方法并不是在复写线程的run方法,标准的应该是

                System.out.println("run() called");
                return 5;
        }

        public static void main(String args[]) {
                new MyThread().start();
        }
}

作者: 赵永康    时间: 2012-9-22 10:05
标准的是Public void run(){}
然后你调用Thread的start方法就会底层去自动调用run 方法,所以就是你的复写run方法错了
建议吧继承这块看看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2