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

Java如何从父类实例获取子类名称及实现Visitor模式方法匹配

Java问题解答:获取子类名称与Visitor模式方法匹配

我来帮你搞定这两个Java相关的问题:

一、获取对象的实际子类名称

你只需要借助getClass()和getSimpleName()方法就能拿到字符串"B",代码示例如下:

public class N {
    public static void main(String[] args) {
        A a = new B();
        // 获取运行时实际类的简单名称(不含包名)
        String subClassName = a.getClass().getSimpleName();
        System.out.println(subClassName); // 输出结果就是 "B"
    }
}

class A {}
class B extends A {}
  • getClass()方法返回的是对象运行时实际所属类的Class对象,而不是编译时的声明类型A
  • 如果需要包含包名的全限定类名,把getSimpleName()换成getName()就行

二、Visitor模式中确保调用正确的visit重载方法

这里的核心是实现双重分派,你需要在父类A中定义一个accept方法,然后让子类B重写它,这样就能引导Visitor调用对应的重载方法。完整示例代码如下:

第一步:定义Visitor接口

interface Visitor {
    void visit(A a);
    void visit(B b);
}

第二步:修改父类A和子类B,添加accept方法

class A {
    public void accept(Visitor visitor) {
        // 编译时this是A类型,调用visit(A a)
        visitor.visit(this);
    }
}

class B extends A {
    @Override
    public void accept(Visitor visitor) {
        // 这里的this是B类型,编译时会匹配visit(B b)
        visitor.visit(this);
    }
}

第三步:实现具体的Visitor类

class ConcreteVisitor implements Visitor {
    @Override
    public void visit(A a) {
        System.out.println("处理A类型对象");
    }

    @Override
    public void visit(B b) {
        System.out.println("处理B类型对象");
    }
}

第四步:在N类中调用测试

public class N {
    public static void main(String[] args) {
        A a = new B();
        Visitor visitor = new ConcreteVisitor();
        // 调用accept方法,会自动匹配到B的accept,进而调用visit(B b)
        a.accept(visitor); // 输出结果:处理B类型对象
    }
}

为什么要这么做?如果直接调用visitor.visit(a),编译时会因为a的声明类型是A,直接绑定到visit(A a)方法;而通过accept方法的重写,运行时会先调用B的accept,此时this的实际类型是B,就能正确匹配到visit(B b)了。

内容的提问来源于stack exchange,提问作者user185941

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:44