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

多级继承下,如何在子类中访问与自身同名的祖父类属性?

多级继承中访问祖父类同名属性的解决方案

Java里确实不能直接通过super.super.attrName这种语法访问祖父类的同名成员,这是语言设计上的限制,目的是维护类的封装性——父类应该控制对其自身父类成员的访问权限,而不是让子类直接跳过父类去访问更上层的类。

下面针对你的代码场景,提供几种可行的解决方式:

方法一:通过父类提供访问入口(推荐)

在直接父类(Ab)中添加一个方法,专门用来返回祖父类(A)的同名属性。这样既符合封装原则,又能安全地获取到祖父类的成员:

public class Main {
    public static void main(String[] args) {
        Abc sahil = new Abc();
        System.out.println(sahil.getGrandparentLength()); // 输出1
    }
}

class A {
    int length;

    A() {
        this.length = 1;
    }
}

class Ab extends A {
    int length;
    
    Ab() {
        this.length = 2;
    }

    // 提供方法返回祖父类的length
    protected int getGrandparentLength() {
        return super.length;
    }
}

class Abc extends Ab {
    int length;

    Abc() {
        this.length = 3;
    }
}

方法二:使用反射(不推荐,仅作了解)

通过Java反射API可以直接获取到祖父类的字段,但这种方式会破坏类的封装性,代码可读性和维护性都很差,除非万不得已不建议使用:

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Abc sahil = new Abc();
        // 获取祖父类A的class对象
        Class<?> grandparentClass = sahil.getClass().getSuperclass().getSuperclass();
        // 获取length字段
        Field lengthField = grandparentClass.getDeclaredField("length");
        // 确保可以访问(如果字段是private的话需要这一步,这里是默认权限,也可以加上)
        lengthField.setAccessible(true);
        // 获取值
        System.out.println(lengthField.getInt(sahil)); // 输出1
    }
}

// 下面的类保持你原来的代码不变
class A {
    int length;

    A() {
        this.length = 1;
    }
}

class Ab extends A {
    int length;
    
    Ab() {
        this.length = 2;
    }
}

class Abc extends Ab {
    int length;

    Abc() {
        this.length = 3;
    }
}

方法三:重构类结构(最优解)

最根本的解决方式是避免在继承链中出现同名属性。这种设计本身就容易造成混淆,降低代码的可读性。可以考虑:

  • 给不同层级的属性起更具语义的名字,比如baseLength(A类)、parentLength(Ab类)、childLength(Abc类)
  • 或者重新设计类的职责,让属性的归属更清晰,避免不必要的同名覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:52