如何重写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
错误翻译:
- 类型Testing2的getNameString()方法必须重写或实现一个超类型方法
- 类型Testing.TestingInner不可见
用户问题
是否存在无需将私有内部类改为public,就能重写其内部的getNameString()方法的实现方式?
解决方案
可以通过让私有内部类实现公共接口的方式实现需求,无需修改内部类的私有访问权限,核心是利用接口的多态性隔离外部对私有内部类的依赖。
具体实现步骤
- 定义公共接口,声明需要重写的方法
public interface NameProvider { String getNameString(); }
- 修改
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); } }
- 编写
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
相关产品推荐
相关产品推荐

