分析下面代码:
new Thread(new Runnable() { @Override public void run() { System.out.println("Runnable匿名子类的run方法"); } }) { @Override public void run() { System.out.println("Thread匿名子类的run方法"); } }.start();
输出的是:Thread匿名子类的run方法
原因如下:
1. 首先,我们创建了一个Thread的匿名内部类对象
2. 该匿名Thread子类对象接收一个Ruannable接口子类的匿名内部类对象
3. 在Thread子类的匿名内部类定义中,我们覆盖了父类(Thread)的run方法
4. 接着我们在Thread的匿名内部类对象上调用了start()方法,启动该Thread匿名内部类对象所表示的子线程
5. 在该子线程(即Thread的匿名内部类对象)上调用start()方法,start()方法会调用Thread类的run()方法,但这个run方法在Thread的匿名子类定义中被子类覆盖了。所以实际在子线程中执行并非是Thread类的run()方法,而是Thread的匿名子类中定义的run()方法(即多态效果)
解释2:
New Runnable的匿名子类对象传到Thread的构造方法中,赋值给了target引用变量,而targe引用变量最后又构成了Thread类中的Run方法,而Thread的匿名内部类对象,即Thread的子类重写了父类Thread的Run方法,实现了覆盖,所以就不会输出Runnale匿名子类的run方法,