Java抽象类中匿名内部类创建对象的代码解析请求
解析抽象类中匿名内部类创建实例的工作原理
原代码
package javaPrac; abstract public class Abstract_class_method { abstract void show(); //抽象方法需要抽象类,且无方法体 void calculate(int x, int y) { int calc = x + y; System.out.println("This is the normal method in abstract class "+calc); } //据我所知,在抽象类中创建main方法没有意义,因为无法创建抽象类的对象,所以需要使用extend关键字继承它或使用接口。 public static void main(String[] args) { Abstract_class_method abobject = new Abstract_class_method() { @Override void show() { // TODO Auto-generated method stub System.out.println("This is the main method"); } }; abobject.show(); abobject.calculate(10, 12); } }
运行输出
This is the main method This is the normal method in abstract class 22
代码工作原理解析
你看到的new Abstract_class_method() {...}并不是直接实例化抽象类本身——抽象类确实不能直接创建对象。这里实际做的是:
- 动态创建了一个继承自
Abstract_class_method的匿名子类,并且在大括号内实现了抽象类中未完成的show()抽象方法,满足了抽象类必须被继承且实现所有抽象方法的要求。 - 这个匿名子类没有显式的类名,只能在创建语句中完成实例化,最终得到的是这个匿名子类的对象,而非抽象类本身的对象。
abobject是抽象类类型的引用,指向这个匿名子类的对象,这是Java的多态特性:调用show()时,会执行匿名子类中重写的实现;调用calculate()时,因为子类没有重写该方法,所以执行父类抽象类中的原有实现。
另外补充:抽象类中的main方法是静态方法,静态方法属于类本身,不需要创建类的对象就能执行,所以这段代码里的main可以正常启动运行。
内容的提问来源于stack exchange,提问作者vishal saxena
相关产品推荐
相关产品推荐

