You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:50:06