如何在Java基类构造方法中传入子类类名作为参数?
问题分析
你遇到的错误是Java语法规则导致的:在显式调用构造方法(this(...)或super(...))的语句中,不能引用this或super。因为此时对象的初始化流程还未完成,this指向的实例还未完全创建,所以无法调用this.getClass()这类依赖实例的方法。
可行解决方案
不需要通过调用带参构造来实现需求,直接在基类的无参构造中完成类名的获取和赋值即可,修改后的Fruit类如下:
public class Fruit { String name; public Fruit() { // 直接获取当前运行时类的简单名称并赋值 this.name = this.getClass().getSimpleName(); } public Fruit(String name) { this.name = name; } }
对应的子类Apple可以完全移除无参构造,直接继承父类的无参构造:
public class Apple extends Fruit { public Apple(String name) { super(name); } }
这样调用new Apple()时,会自动触发父类的无参构造,通过this.getClass().getSimpleName()获取到子类Apple的类名,将name设置为"Apple";调用new Apple("Red Apple")时,会调用子类的带参构造,传入自定义名称。
补充说明
- 如果子类没有显式定义任何构造方法,Java会自动生成一个无参构造,默认调用父类的无参构造,同样能实现自动赋值类名的效果。
- 这种方式依赖Java的运行时多态特性:
this.getClass()在子类实例化时,返回的是子类的Class对象,所以能正确获取子类的类名。
内容的提问来源于stack exchange,提问作者Ryan Dunphy
相关产品推荐
相关产品推荐

