在使用多线程的时候,时常会使用两种方式实现,一种是直接继承Thread类来实现多线程,另外一种就是实现Runnable接口。
我们都知道,接口是没有构造方法的,同时匿名内部类也是没有构造方法的。原因有这几点:1.接口只是一个声明,需要有一个实现类实现这个接口。2.匿名内部类是匿名了,也就是说没有类名,所以就没有构造方法。
但是我们在new一个接口的时候常常会使用这种方式,就是用匿名内部类的方式去实现。
1 Runnable runnable=new Runnable() { 2 3 @Override 4 public void run() { 5 for(int i=0;i<50;i++){ 6 System.out.println(i); 7 } 8 } 9 10 };
在这里有一个new Runable(){},就是这里的Runnable(),这不就是构造方法吗?怎么会出现一个构造方法?
这时候突然想到一点就是Java所有的类都会默认继承一个Object类,而接口也是一个类,匿名内部类也是一个类,所以我就想是不是这里继承了Object,之后我在代码中加入了toString方法来确定是否含有Object类的内容。
1 Runnable runnable=new Runnable() { 2 3 @Override 4 public void run() { 5 for(int i=0;i<50;i++){ 6 System.out.println(i); 7 } 8 } 9 10 @Override 11 public String toString(){ 12 return "hello"; 13 } 14 15 };
在这里使用了@Override注解证明了使用了Object法,另一个验证就是运行程序会发现内有重写方法的时候是类名和哈希值,改写后输出的是“Hello”。
那么我们就可以猜想,如果Runnable()调用了,是不是就证明了这时的Runnable向上转型成了Object类型,那么这里实际上调用了Object类中的构造方法,为了验证这一点我使用了IDEA的跟踪代码功能。发现使用super关键字的时候,代码跟踪到了Object方法,基本确定了这时调用了Object的构造方法。
=========================================