首页 > 解决方案 > Java 中的包可见性问题

问题描述

细节 :

我正在尝试使用以下目录结构从命令行构建一个 java 项目:

proj/
    Makefile
    Main.java
    lexer
    tokens
    ast
    interpreter
    lib

问题 :

我假设 Main.java 可以访问所有classes, enums, interfaces, 和annotations所有四个文件夹。但是,如果我想使用enumintokens包,有什么办法吗?顺便说一句,我的意思是我应该使用什么访问说明符来完成我的用例?

我在问这个问题之前使用的链接:

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

-https://medium.com/virtuslab/on-the-missing-package-private-or-why-java-is-better-than-kotlin-in-this-regard-4a1c9ecbe40c#:~:text=The% 20default%20access%20modifier%20in,classes%20in%20the%20same%20package.&text=It%20was%20hardly%20used%20and,fields%20when%20inheritance%20was%20needed。

-http://gauss.ececs.uc.edu/Courses/c694/lectures/Visibility/visibility.html

提前致谢。

编辑: Main 可以从包中导入,而 main 在默认包中。

标签: javaterminalpackage

解决方案


假设您使用的是 java8 及之前的版本:

  1. Main默认情况下将无法访问所有类和枚举
  2. Main将有权访问定义的类和枚举Main.java
  3. 一个方法Main可以访问内部类和枚举
  4. Mainpublic将有权访问在其他包中定义的类和枚举
  5. Main将有权访问它在其他包中扩展的类(它们应该至少受到保护)

其他类也将遵循类似的访问策略。(主要没什么特别的)

请参考

  1. 教程
  2. 修饰符

推荐阅读