如何在main方法及子类C中访问父类A的变量与方法?
解决三层继承中访问祖父类方法及外部访问父类成员的问题
先看你的代码场景:三层继承A → B → C,现在C里用super.show()只能触发B的方法实现,想直接调用A的show();同时main方法里拿着C的实例,想访问A的成员。下面分两种场景给你解决方案:
一、在子类C中调用祖父类A的show()方法
Java没有super.super这种语法(这是语言设计上的刻意限制,目的是维护继承的封装性——子类不该跳过直接父类去访问祖父类的实现),所以得用以下两种方式:
1. 推荐:在父类B中添加桥接方法
最规范的做法是让B暴露一个专门的方法,用来调用A的show(),这样C就能通过这个桥接方法间接访问A的实现:
class B extends A { @Override void show() { System.out.println("inside B"); } // 桥接方法:专门用来调用A的show() void callAShow() { super.show(); // 这里的super指向A,因为B的直接父类是A } } class C extends B { @Override void show() { callAShow(); // 调用桥接方法,触发A的show() System.out.println("inside C"); } }
这种方式完全符合Java的封装原则,代码可读性也高。
2. 兜底:用反射强行访问(不推荐)
如果没办法修改B的代码,只能用反射绕过访问控制,但这会破坏封装,只建议在特殊场景下使用:
import java.lang.reflect.Method; class C extends B { @Override void show() { try { // 获取A类中声明的show()方法 Method aShowMethod = A.class.getDeclaredMethod("show"); aShowMethod.setAccessible(true); // 允许访问非public方法 aShowMethod.invoke(this); // 在当前C实例上调用A的show() } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } System.out.println("inside C"); } }
二、在main方法中访问类A的成员
你在main里创建了C的实例,要访问A的成员分两种情况:
1. 如果A的成员没有被重写
直接把C的实例强转为A类型即可调用:
public static void main(String[] arg) { C c = new C(); // 强转为A类型,调用A的成员(如果没被重写的话) ((A) c).show(); }
注意:如果show()被子类重写了,这种方式还是会调用C的show()(因为Java是动态绑定),想调用A的原始实现可以借助刚才的桥接方法:
public static void main(String[] arg) { C c = new C(); // 通过B的桥接方法调用A的show() c.callAShow(); }
2. 调用A的原始实现(不管是否被重写)
用反射的方式,和C里的写法类似:
import java.lang.reflect.Method; public static void main(String[] arg) { C c = new C(); try { Method aShowMethod = A.class.getDeclaredMethod("show"); aShowMethod.setAccessible(true); aShowMethod.invoke(c); } catch (Exception e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者Muhammad Rokonuzzaman
相关产品推荐
相关产品推荐

