JAVA问题部分解决方案_第1页
JAVA问题部分解决方案_第2页
JAVA问题部分解决方案_第3页
JAVA问题部分解决方案_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.关窗口问题因为windowlistener是个接口一个类要是实现一个借口,就必须履行接口要求他的所有职责,就是实现借口的所有方法所以要实现所有的方法,即使是空实现也要必须去做。不过就这个问题还有另一种相对好的解决方法,避免进行大量无用的空实现:myjframe window= new myjframe();window.addwindowlistener(new windowadapter() public void windowclosing(windowevent e) system.exit(0); );这是一个适配器模式windowadapter是个抽象类他实现接口windowli

2、stener,已经进行了所有windowlistener的方法的空实现,当你这样做:window.addwindowlistener(new windowadapter() override public void windowclosing(windowevent e) system.exit(0); );这看上去像是创建了一个抽象类的对象传入方法addwindowlistener而实际上是创建了一个windowadapter的继承类对象,这个继承类是匿名的就相当于:class a extends windowadapter override public void windowclosin

3、g(windowevent e) system.exit(0); 然后a a=new a();window.addwindowlistener(a);这就是java的匿名类机制经过这样做就把实现借口转变为继承抽象类而我们知道,继承一个类,并不需要重写他所有的方法,所以就可以只针对你想处理的windowclosing的这个方法进行重写。这个问题的解决其中涉及到了类的继承与接口的实现、适配器模式、匿名类机制等问题。2. 匿名类的用法3. 窗口重画时自动调用paint方法4. 枚举类型5. java 惰性初始化热度:105 发布时间:2013-10-04 20:08:36publicclass la

4、zy privatestaticbooleaninitial = false; static thread t = new thread(new runnable() publicvoid run() system.out.println(befor.);/此句会输出 /* * 由于使用lazy.initial静态成员,又因为lazy还未初 * 始化完成,所以该线程会在这里等待主线程初始化完成 */ initial = true; system.out.println(after.);/此句不会输出 ); t.start(); try t.join();/ 主线程等待t线程结束 catch (

5、interruptedexception e) e.printstacktrace(); publicstaticvoid main(string args) system.out.println(initial); 看看上面变态的程序,一个静态变量的初始化由静态块里的线程来初始化,最后的结果怎样?当一个线程访问一个类的某个成员的时候,它会去检查这个类是否已经被初始化,在这一过程中会有以下四种情况:1、 这个类尚未被初始化2、 这个类正在被当前线程初始化:这是对初始化的递归请求,会直接忽略掉(另,请参考构造器中静态常量的引用问题一节)3、 这个类正在被其他线程而不是当前线程初始化:需等待其他线

6、程初始化完成再使用类的class对象,而不会两个线程都会去初始化一遍(如果这样,那不类会初始化两遍,这显示不合理)4、 这个类已经被初始化当主线程调用lazy.main,它会检查lazy类是否已经被初始化。此时它并没有被初始化(情况1),所以主线程会记录下当前正在进行的初始化,并开始对这个类进行初始化。这个过程是:主线程会将initial的值设为false,然后在静态块中创建并启动一个初始化initial的线程t,该线程的run方法会将initial设为true,然后主线程会等待t线程执行完毕,此时,问题就来了。由于t线程将lazy.initial设为true之前,它也会去检查lazy类是否已

7、经被初始化。这时,这个类正在被另外一个线程(mian线程)进行初始化(情况3)。在这种情况下,当前线程,也就是t线程,会等待class对象直到初始化完成,可惜的是,那个正在进行初始化工作的main线程,也正在等待t线程的运行结束。因为这两个线程现在正相互等待,形成了死锁。修正这个程序的方法就是让主线程在等待线程前就完成初始化操作:publicclass lazy privatestaticbooleaninitial = false; static thread t = new thread(new runnable() publicvoid run() initial = true; ); static t.start(); publicstaticvoid main(string args) / 让lazy类初始化完成后再调用join方法 try t.join();/ 主线程等待t线程结束 catch (interruptedexception e) e.printstacktrace(); system.out.println(in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论