线程的小问题

看一个问题,匿名内部类和重写的问题:
public class Test01 {
public static void main(String[] args) {

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("传入的实现Runnable接口的类");
}
}){
public void run(){
System.out.println("重写Thread类的run方法的匿名类");
}
}.start();
}
}

结果应该是什么呢?先不看上面的代码,下面的代码结果是什么?

public class Test01 {
public static void main(String[] args) {
// 重写Thread类的run方法的匿名类
new Thread(){
public void run(){
System.out.println("Test");
}
}.start();

不难看出,和结果应该是输出继承了Thread类的匿名对象锁重写的run方法的结果:Test

。那么我们再回过头来看最上面的代码。
拆分来看:这段代码是由:

片段3

new Thread(){
public void run(){
System.out.println("重写Thread类的run方法的匿名类");
}
}.start();
继承了Thread类的匿名类
以及:

片段4

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("传入的实现Runnable接口的类");
}
}).start();

通过传入一个实现了Runnable接口的Thread创建的的匿名实现类 两部分构成。

因此,通过抽丝剥茧,我们会发现,其实片段4中重写的方法根本调用不到,为什么?可以回顾一下多态的知识。因为它相对于片段3中的匿名类,实际上是父类的方法,不同
的是他重写的是Runnable接口中的run方法。而我们的片段3又重写了它的方法,因此最后调用的还是实际的 匿名子类对象。也就是重写了

System.out.println("重写Thread类的run方法的匿名类");


这个对象。
仔细思考一下。
线程的小问题