java - 跨项目的继承和可见性

标签 java eclipse inheritance class-visibility

编辑:我只使用过 Eclipse 来编写 Java 程序,因此以下所有内容(以及我有关 Java 的所有知识)都取决于 Java 在该环境中的编程方式。

我有两个 Eclipse 项目:带有 X 类的项目 A 和带有 Y 类的项目 B。项目B 中的Y 类扩展了项目A 中的X 类。

public class Y extends X // In short B is dependent on Project A

Xpublic它有一个嵌套类O

public class X {

    class O { // default access modifier

    }
}

在我的设置中,类 Y 可以实例化 O,只要 O 不是 private 。这意味着,即使 O 有默认的访问修饰符,Y 仍然可以访问 O 的成员和变量。 这让我感到困惑,因为我认为默认类意味着外部类只有在共享公共(public)包时才能访问它。

所以我从中得到的结论是每个项目中的默认包必须相同或以某种方式连接。我的这个想法正确吗?如果这是正确的,一个项目的包中所做的更改是否会反射(reflect)在另一个项目的包中?

这提出了我正在处理的主要问题。我想控制对类 O 的访问,这样在我的示例中,我希望 Y 能够实例化 O。我现在能做到的唯一方法是将 O 的可见性设置为私有(private),但这也限制了同一项目(项目 A)中的其他类访问 O。我想要项目 B 中的类 Y (我认为该项目与项目 A 具有不同的包)不能访问 O,但与 Y/O 相同的项目中的其他任意类可以毫无问题地访问 O。我怎样才能做到这一点?

最佳答案

这里有几个不同的问题,所以我将列举它们并单独回答。另外,我假设 project 您指的是 Eclipse 中的项目之类的东西。

  1. 我的想法正确吗?

    正确,如果您有多个项目(例如 JAR 文件构建工件 Eclipse 项目),每个项目都有一个默认包(例如两个项目中的 src/main/java/Foo.java )默认范围(即 package-private )类将能够看到彼此以及它们各自的公共(public)、 protected 和包私有(private)方法和字段。

  2. 如果这是正确的,一个项目的包中所做的更改是否会反射(reflect)在另一个项目的包中?

    正确,假设changes of the upstream project are visible to the downstream project .

  3. 我该怎么做?

    严格来说,除非如您所说,您不能将其设为私有(private)。即使这样,你也可以绕过它。但是,您可以做的是选择其他编码人员不太可能使用的有意义的包层次结构。例如,由于这个原因,诸如 com.acme.myproject.subfolder 之类的名称很常见。但有人仍然可以在自己的项目中创建一个并行文件夹并调用您的包私有(private)类。话虽如此,对于私有(private)成员(member)类(class),他们可以 change the accessibility of that member ,从而绕过你。虽然这听起来很可怕,但如果您想要真正安全的代码,您确实应该对远程服务使用安全授权。将某些东西设为包私有(private)的目的是 prevent it from being part of your API ,而不是强制执行一些真正的安全措施。事实上,这种行为通常是可取的。例如,假设我在 src/main/java/com/acme/myproj/Foo.java 中有一个包私有(private)类,我想要对其进行单元测试。 Foo 类是包私有(private)的,因为我不想让它成为我的公共(public) API 的一部分。因此,我可以创建 src/test/java/com/acme/myproj/FooTest.java ,瞧,我现在可以执行 unit tests against my package-private class Foo

我希望这能解释事情。

关于java - 跨项目的继承和可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36512305/

相关文章:

java - 在 Eclipse 中安装新软件时出错

Android 无法将 R 解析为变量

c++ - 从基指针向下转换为模板派生类型

java - j2me导入外部jar : what classpath?

java - 在 Ubuntu 中构建 APK react native 应用程序的问题

java - 什么是 java.util.NoSuchElementException 以及如何修复它?

Java - 设计 validator 、类层次结构

c++ - 具有虚拟多重继承的构造函数定义

java - 显示可滚动的 JTable

java - DOCX 数据的剪贴板格式