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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:01