黑马程序员技术交流社区

标题: 初学者的瓶颈 求高手解释 [打印本页]

作者: 李龙涛    时间: 2011-7-23 23:43
标题: 初学者的瓶颈 求高手解释
在看张老师的视频教程中经常遇到这种问题
import java.util.*;
import javax.management.*;
public class TestTimerTask {
        public static void main(String[] args) {
                class MyTimerTask extends TimerTask
                {
                        private Timer tm=null;
                        public MyTimerTask(Timer tm)
                        {
                                this.tm=tm;
                        }
                        public void run()
                        {
                                try{
                                Runtime.getRuntime().exec("calc.exe");
                                }catch(Exception e)
                                {
                                        e.printStackTrace();
                                }
                                //结束任务线程的代码
                                tm.cancel();
                        }
                }
                Timer tm=new Timer();
                tm.schedule(new MyTimerTask(tm),5000);
        }
}

schedule(TimerTask task,long delay)
我知道在schedule方法中要传递进去一个TimerTask对象
问题1:为什么要定义一个TimerTask的子类呢?为什么这个子类要定义为内部类呢?
问题2:这个TimerTask对象为什么还要传递进去一个Timer对象呢?
问题3:为什么还要在TimerTask子类中定义一个Timer的构造函数呢?而且还要传递进去一个Timer类型的引用变量呢?
问题4:Timer tm=null;这句也理解不了
也许对于高手来说这些问题都很容易 但是相信对于我或者跟我一样的初学者来说 经常遇到这种问题 例如多线程同步中也有遇到类似的问题,请高手们赐教
[ 本帖最后由 李龙涛 于 2011-07-23  23:47 编辑 ]
作者: 匿名    时间: 2011-7-23 23:49
管理员多给点分呀 这个问题相信是很多初学者都一时难以理解的
作者: 那日苏    时间: 2011-7-24 00:42
问题1. TimerTask定义为子类的原因是为了复写父类的方法(本例中为fun()方法)。
1.2  (a)如果一个类只在另一个类中用到了,那就可以把它声明为这另一个类的内部类(本例中为MyTimerTask )。
    (b)不想被除了外部类的类访问,这也是内部类的好处,
    (c)也为了程序的高内聚,低耦合。
问题2.是为了实例化MyTimerTask 对象。
问题3.构造函数中传递进去一个Timer对象的原因是为了实例化Timer对象。
问题4.private Timer tm=null; 是初始化成员变量tm。

PS:文笔不好,别笑。
[ 本帖最后由 那日苏 于 2011-07-24  00:46 编辑 ]
作者: 孙斌    时间: 2011-7-24 00:46
尽我所能,解释一些,大家多多补充!
一、
1.内部类是程序更具模块化,更紧凑;
2.TimerTask是一个abstract类,要用它必须定义它的一个子类;
二、
Timer对象表示schedule delay in milliseconds的时间,因为Timer有schedule(TimerTask task, long delay)这样一个方法,需要传递进去一个参数,详见JDK中Timer类的schedule方法,不知道能不能缺省?
三、
定义public MyTimerTask(Timer tm)方法是为了把Timer获得的值传递给自己的变量;
四、
赋予一个空值,应该是出于安全方面的考虑。
[ 本帖最后由 孙斌 于 2011-07-24  00:51 编辑 ]




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