标签: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