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

如何重写Java私有嵌套内部类中的getNameString()方法?

私有内部类方法重写方案

问题代码

public class Testing {

  public String name = null;

  public String getName() {
    TestingInner test = new TestingInner("Testing inner override");
    return test.getNameString();
  }

  public String testName() {
    return this.name;
  }

  private class TestingInner {

    String nameString = null;

    public TestingInner(String name) {
      this.nameString = name;
    }

    public String getNameString() {
      return "Inner Class " + this.nameString;
    }
  }
}

public class Testing2 extends Testing.TestingInner {

  @Override
  public String getNameString() {
    System.out.println("Override Inner class method");
    return "This is";
  }
}

编译错误信息

The method getNameString() of type Testing2 must override or implement a supertype method
The type Testing.TestingInner is not visible

错误翻译:

  1. 类型Testing2的getNameString()方法必须重写或实现一个超类型方法
  2. 类型Testing.TestingInner不可见

用户问题

是否存在无需将私有内部类改为public,就能重写其内部的getNameString()方法的实现方式?

解决方案

可以通过让私有内部类实现公共接口的方式实现需求,无需修改内部类的私有访问权限,核心是利用接口的多态性隔离外部对私有内部类的依赖。

具体实现步骤

  1. 定义公共接口,声明需要重写的方法
public interface NameProvider {
    String getNameString();
}
  1. 修改Testing类,让私有内部类实现该接口,并提供获取接口实例的方法
public class Testing {

  public String name = null;

  public String getName() {
    TestingInner test = new TestingInner("Testing inner override");
    return test.getNameString();
  }

  public String testName() {
    return this.name;
  }

  // 私有内部类实现公共接口
  private class TestingInner implements NameProvider {

    String nameString = null;

    public TestingInner(String name) {
      this.nameString = name;
    }

    @Override
    public String getNameString() {
      return "Inner Class " + this.nameString;
    }
  }

  // 对外提供创建接口实例的方法
  public NameProvider createTestingInner(String name) {
    return new TestingInner(name);
  }
}
  1. 编写Testing2类实现公共接口,完成自定义逻辑
public class Testing2 implements NameProvider {

  @Override
  public String getNameString() {
    System.out.println("Override Inner class method");
    return "This is";
  }
}

进阶用法:复用原内部类逻辑

如果需要依赖原私有内部类的逻辑,可以通过组合方式注入接口实例:

public class Testing2 implements NameProvider {
    private NameProvider originalProvider;

    public Testing2(NameProvider originalProvider) {
        this.originalProvider = originalProvider;
    }

    @Override
    public String getNameString() {
        System.out.println("Override Inner class method");
        // 调用原内部类的逻辑
        String originalResult = originalProvider.getNameString();
        return "Wrapped Result: " + originalResult;
    }
}

调用示例:

Testing test = new Testing();
// 获取原内部类的接口实例
NameProvider original = test.createTestingInner("Original");
// 传入自定义实现
Testing2 custom = new Testing2(original);
System.out.println(custom.getNameString());

另一种思路:提供回调入口

如果允许修改Testing类,可以添加支持自定义逻辑的方法,直接传入接口实例替换原有逻辑:

public class Testing {

  // 新增支持自定义逻辑的方法
  public String getName(NameProvider customProvider) {
    return customProvider.getNameString();
  }

  // 保留原方法
  public String getName() {
    TestingInner test = new TestingInner("Testing inner override");
    return test.getNameString();
  }

  // 其他代码不变...
}

调用时直接传入Testing2实例:

Testing test = new Testing();
String customResult = test.getName(new Testing2());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:42:41