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
相关产品推荐
相关产品推荐

