问题描述
/***源代码如下*不解处:TalkingClock.start方法执行(clock.start(1000,true);)后,方法内部生成的Timert对象已经不处于生存期,有点糊涂?*希望能说得透彻些!*/importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;importjavax.swing.Timer;publicclassAnonymousInnerClassTest{publicstaticvoidmain(String[]args){TalkingClockclock=newTalkingClock();clock.start(1000,true);//keepprogramrunninguntiluserselects"Ok"JOptionPane.showMessageDialog(null,"Quitprogram?");System.exit(0);}}/***Aclockthatprintsthetimeinregularintervals.*/classTalkingClock{/***Startstheclock.*@paramintervaltheintervalbetweenmessages(inmilliseconds)*@parambeeptrueiftheclockshouldbeep*/publicvoidstart(intinterval,finalbooleanbeep){ActionListenerlistener=newActionListener(){publicvoidactionPerformed(ActionEventevent){Datenow=newDate();System.out.println("Atthetone,thetimeis"+now);if(beep)Toolkit.getDefaultToolkit().beep();}};Timert=newTimer(interval,listener);t.start();}}
解决方案
解决方案二:
/***源代码如下*不解处:TalkingClock.start方法执行(clock.start(1000,true);)后,方法内部生成的Timert对象已经不处于生存期,有点糊涂?*希望能说得透彻些!*/【code=Java】importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;importjavax.swing.Timer;publicclassAnonymousInnerClassTest{publicstaticvoidmain(String[]args){TalkingClockclock=newTalkingClock();clock.start(1000,true);//keepprogramrunninguntiluserselects"Ok"JOptionPane.showMessageDialog(null,"Quitprogram?");System.exit(0);}}/***Aclockthatprintsthetimeinregularintervals.*/classTalkingClock{/***Startstheclock.*@paramintervaltheintervalbetweenmessages(inmilliseconds)*@parambeeptrueiftheclockshouldbeep*/publicvoidstart(intinterval,finalbooleanbeep){ActionListenerlistener=newActionListener(){publicvoidactionPerformed(ActionEventevent){Datenow=newDate();System.out.println("Atthetone,thetimeis"+now);if(beep)Toolkit.getDefaultToolkit().beep();}};Timert=newTimer(interval,listener);t.start();}}【/code】
解决方案三:
/***源代码如下*不解处:TalkingClock.start方法执行(clock.start(1000,true);)后,方法内部生成的Timert对象已经不处于生存期,有点糊涂?*希望能说得透彻些!*/importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;importjavax.swing.Timer;publicclassAnonymousInnerClassTest{publicstaticvoidmain(String[]args){TalkingClockclock=newTalkingClock();clock.start(1000,true);//keepprogramrunninguntiluserselects"Ok"JOptionPane.showMessageDialog(null,"Quitprogram?");System.exit(0);}}/***Aclockthatprintsthetimeinregularintervals.*/classTalkingClock{/***Startstheclock.*@paramintervaltheintervalbetweenmessages(inmilliseconds)*@parambeeptrueiftheclockshouldbeep*/publicvoidstart(intinterval,finalbooleanbeep){ActionListenerlistener=newActionListener(){publicvoidactionPerformed(ActionEventevent){Datenow=newDate();System.out.println("Atthetone,thetimeis"+now);if(beep)Toolkit.getDefaultToolkit().beep();}};Timert=newTimer(interval,listener);t.start();}}
解决方案四:
我的天,在这里提问有用吗?这是个很常见的问题,只是请教一个方法内定义生成的对象超出方法生存期,程序是如何执行下去的罢了。
解决方案五:
什么是“对象生存期”、“方法生存期”?我干了N年头一回听说。请楼下指教。
解决方案六:
我的意思是,在方法内定义的对象在方法执行完之后objectreference已经作废,对象也变成一个垃圾内存空间,在这种情况下程序怎么能正常运作下去呢?
解决方案七:
1.Thestartmethodiscalled.2.TheobjectvariablelistenerisinitializedbyacalltotheconstructoroftheinnerclassTimePrinter.3.ThelistenerreferenceispassedtotheTimerconstructor,thetimerisstarted,andthestartmethodexits.Atthispoint,thebeepparametervariableofthestartmethodnolongerexists.4.Asecondlater,theactionPerformedmethodexecutes就是说从上面第3步到第4步,是如何良好运转的,我有迷惑。
解决方案八:
Timer对象是在方法当中定义的,但这并不表示方法退出后Timer对象就会要回收。当Timer开始运行后,虽然方法退出了,但Timer对象的引用仍然存在。垃圾回收是一个复杂的过程,但同时也是很严谨的。楼主不需要担心运行中的线程会被回收。这是不可能的。
解决方案九:
帮顶..
解决方案十:
对象引用是作废了,根据java的基本语法规则。但Timer类里有静态成员,这些是不会作废的。
解决方案十一:
这是timer的实现问题,属于类库部分,如果仅仅使用就不要关心了吧。