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

不使用extends关键字,能否在类B中访问类A的变量与方法?

当然可以啦!不用extends关键字实现继承,咱们照样能让类B访问到类A的变量和方法,我给你分享几个常用的思路:

方法一:组合(Composition)

这可是替代继承的黄金方案,完全符合“组合优于继承”的设计原则,还能避免继承带来的强耦合问题。核心思路就是把类A的实例当成类B的一个成员变量,然后通过这个实例去调用A的方法、访问A的变量——不过要注意哦,A的变量得是public/protected权限,或者你能通过A提供的getter方法拿到私有变量~

举个实际代码例子:

public class A {
    public String publicVar = "我是A的公共变量";
    private String privateVar = "我是A的私有变量";

    public void publicMethod() {
        System.out.println("调用了A的公共方法");
    }

    public String getPrivateVar() {
        return privateVar;
    }
}

public class B {
    // 把A的实例作为B的成员变量
    private A aInstance = new A();

    public void accessA() {
        // 直接访问A的公共变量
        System.out.println(aInstance.publicVar);
        // 调用A的公共方法
        aInstance.publicMethod();
        // 通过getter方法访问A的私有变量
        System.out.println(aInstance.getPrivateVar());
    }
}
方法二:借助接口(Interface)

如果你只想复用类A的部分方法,可以先把这些方法抽象到一个接口里,让类A去实现这个接口,然后在类B中持有该接口的实例(实际指向A的对象)。这种方式能进一步降低类之间的耦合度。

代码示例:

public interface MyInterface {
    void doSomething();
}

public class A implements MyInterface {
    public String varFromA = "来自A的变量";

    @Override
    public void doSomething() {
        System.out.println("A实现的接口方法");
    }
}

public class B {
    private MyInterface interfaceInstance = new A();

    public void useA() {
        // 调用接口定义的方法(实际执行A的实现逻辑)
        interfaceInstance.doSomething();
        // 如果要访问A特有的变量,需要先做类型判断再强制转型
        if (interfaceInstance instanceof A) {
            System.out.println(((A) interfaceInstance).varFromA);
        }
    }
}
方法三:反射(Reflection)

要是你非得访问A的私有成员(非常不推荐,会破坏封装性),可以用Java的反射机制绕过访问权限检查。不过这个方法一般只在框架开发这类特殊场景下用,日常业务代码尽量别碰,不仅破坏封装还可能影响性能。

示例代码:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class A {
    private String secretVar = "A的秘密变量";
    private void secretMethod() {
        System.out.println("调用了A的私有方法");
    }
}

public class B {
    public void accessAPrivateMembers() throws Exception {
        A a = new A();
        // 访问A的私有变量
        Field secretVarField = A.class.getDeclaredField("secretVar");
        secretVarField.setAccessible(true);
        System.out.println(secretVarField.get(a));

        // 调用A的私有方法
        Method secretMethod = A.class.getDeclaredMethod("secretMethod");
        secretMethod.setAccessible(true);
        secretMethod.invoke(a);
    }
}
方法四:内部类(仅限紧密关联场景)

如果类B是类A的内部类,那B可以直接访问A的所有成员,包括私有成员,完全不需要继承。不过这种方式会让A和B的耦合度极高,只适合两者关系极其紧密的情况。

示例:

public class A {
    private String privateVar = "A的私有变量";

    public class B {
        public void accessA() {
            // 直接访问A的私有变量
            System.out.println(privateVar);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:09:12