如何使 class 的成员只能在任何包的子 class 中访问?

How to make a member of a class to be accessible only in subclasses in any packages?

如何使 class 的成员只能在任何包的子 class 中访问? Protected 不是解决方案,因为它会将成员开放给其他非 subclasses classes.

我明白你为什么要这样做;但是,Java 根本不提供该功能。

在访问控制期间您试图实现的目标是不可能的:

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

您可能会重新考虑您的软件设计,因为您的问题是由体系结构引起的。 请在您的问题中更具体以获得进一步的答案。

解决你的问题可能会产生副作用,不是OOD方式。

访问私有成员的唯一方法是使用具有相同可见性问题的getter方法。

Java 不提供绝对封装。程序员(原始设计者和使用已发布 API 的任何人)都需要一定程度的纪律,以遵守语言之外的一些规则。关于会员访问,您已经确定了一个这样的案例。你想要的在 Java.

是不可能的

从更广阔的角度来看,我要指出,如果程序员愿意走得更远,即使 private 成员也可以被其他 类 访问足以做到这一点。通过 JNI 进行的调用不必遵守任何访问修饰符。参见,例如,Can a native method call a private method?

其他语言外规范的例子包括 equals/hashCode 的合同,类 必须满足该合同才能在集合方面表现良好,但不是在语言级别强制执行。

你可以用 protected 成员抽象 class,然后在另一个包中实现它。考虑一下您为某些事物创建了一些库和设计可扩展性。您的 lib 的以后用户将实现您的 class 的实现,并且可以访问受保护的成员,同时无法在您的包中创建实现 classes。在示例 FilterReader class 中,它是为可扩展性而设计的,在您在 java.io 包外的代码中实现它之后,受保护的字段和方法将对其他 classes 私有在你的包裹里。