标签:UI clip 哲理 资源 anon ack 源码 方法 java源码
礼悟:
好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。
虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚劝且行且珍惜。
os :windows7 x64
jdk:jdk-8u131-windows-x64
ide:Eclipse Oxygen Release (4.7.0)
测试类:
package blog.jizuiku6; /** * 匿名内部类 既 继承了Thread类,重写了其中的run()方法 * 又 实现了Runnable接口,实现了其中的run()方法 * * @author jizuiku * @version V17.09.27 */ public class FixedETIRDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5550; i++) { System.out.println("博客园" + i); } } }) { @Override public void run() { // TODO Auto-generated method stub super.run(); for (int i = 0; i < 5000; i++) { System.out.println("____给最苦" + i); } } }.start(); // 实验的结果是 两个run方法都执行了! // 这个和视频教程中演示的不一样,视频中只执行了子类中run() // 而且好像两个run()方法的执行还是有顺序的 // 视频中是jdk7 , 给最苦 用的是jdk8,和这个有关系吗? // 这个现象不懂,给最苦 求教... } }
结果:
针对这个结果,给最苦产生疑问了,难道结果输出的顺序是巧合,还是必然?其中蕴含着怎样深刻的哲理,这回没有老师带领,只能自己运用所学进行分析!
下面是 给最苦 的探索与分析过程,
先用反编译看看,打开bin文件夹的指定包,给最苦 看到了三个.class文件,有趣!用Xjad反编译后得到如下的三个源代码文件
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; public class FixedETIRDemo { public FixedETIRDemo() { } public static void main(String args[]) { (new Thread(new Runnable() { public void run() { for (int i = 0; i < 5550; i++) System.out.println((new StringBuilder("博客园")).append(i).toString()); } }) { public void run() { super.run(); for (int i = 0; i < 5000; i++) System.out.println((new StringBuilder("____给最苦")).append(i).toString()); } }).start(); } }
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; // Referenced classes of package blog.jizuiku6: // FixedETIRDemo class FixedETIRDemo$2 extends Thread { public void run() { super.run(); for (int i = 0; i < 5000; i++) System.out.println((new StringBuilder("____给最苦")).append(i).toString()); } FixedETIRDemo$2(Runnable $anonymous0) { super($anonymous0); } }
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; // Referenced classes of package blog.jizuiku6: // FixedETIRDemo class FixedETIRDemo$1 implements Runnable { public void run() { for (int i = 0; i < 5550; i++) System.out.println((new StringBuilder("博客园")).append(i).toString()); } FixedETIRDemo$1() { } }
看到这三个源代码,是不是每个匿名内部类都会被编译成一个单独的类呢?可是即使明白了这个特点,也不能解释输出的异常结果。当 给最苦 冥思苦想的时候,突然灵光一闪,用Debug看看!于是,开始Debug。
step_0
step_1
step_2
step_3
step_4
step_5
step_6
step_7
step_8
step_9
原来异常结果的根源就在 super.run()上!那么 我去掉这句话,是不是一切如同视频中讲的那样,只会运行子类中run()方法
代码:
package blog.jizuiku6; /** * 匿名内部类 既 继承了Thread类,重写了其中的run()方法 * 又 实现了Runnable接口,实现了其中的run()方法 * * @author jizuiku * @version V17.09.27 */ public class FixedETIRDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5550; i++) { System.out.println("博客园" + i); } } }) { @Override public void run() { // TODO Auto-generated method stub // super.run(); for (int i = 0; i < 5000; i++) { System.out.println("____给最苦" + i); } } }.start(); // 当 给最苦 去掉super.run()的时候,发现跟视频教程中的效果一样了 // 当 给最苦 再次 超级仔细的观看 视频教程中的代码时发现:视频中没有写super.run() // 经过这一番折腾,学到很多... // 在编写代码中,每一行代码都是有生命的,有意义的,都要珍惜、认真对待 } }
结果:
问题分析完成了,云淡了 风轻了。。。
Java优秀,值得学习。
学习资源:API手册 + Java源码 + Xjad + 清净的心地。
JavaSE8基础 多线程 匿名内部类既重写Thread中run,又实现Runnable中run
标签:UI clip 哲理 资源 anon ack 源码 方法 java源码
原文地址:http://www.cnblogs.com/jizuiku/p/7638606.html