在使用多線程的時候,時常會使用兩種方式實現,一種是直接繼承Thread類來實現多線程,另外一種就是實現Runnable接口。
我們都知道,接口是沒有構造方法的,同時匿名內部類也是沒有構造方法的。原因有這幾點:1.接口只是一個聲明,需要有一個實現類實現這個接口。2.匿名內部類是匿名了,也就是說沒有類名,所以就沒有構造方法。
但是我們在new一個接口的時候常常會使用這種方式,就是用匿名內部類的方式去實現。
1 Runnable runnable=newRunnable() {2
3 @Override4 public voidrun() {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=newRunnable() {2
3 @Override4 public voidrun() {5 for(int i=0;i<50;i++){6 System.out.println(i);7 }8 }9
10 @Override11 publicString toString(){12 return "hello";13 }14
15 };
在這里使用了@Override注解證明了使用了Object法,另一個驗證就是運行程序會發現內有重寫方法的時候是類名和哈希值,改寫后輸出的是“Hello”。
那么我們就可以猜想,如果Runnable()調用了,是不是就證明了這時的Runnable向上轉型成了Object類型,那么這里實際上調用了Object類中的構造方法,為了驗證這一點我使用了IDEA的跟蹤代碼功能。發現使用super關鍵字的時候,代碼跟蹤到了Object方法,基本確定了這時調用了Object的構造方法。
=========================================