当前位置: 首页 > 面试题库 >

Java类名称与嵌套包名称相同

司马钱明
2023-03-14
问题内容

在我的Java应用程序中,我使用第三方库。

但是,我发现有些奇怪,有一些嵌套的程序包,有些类的名称可能与程序包的名称相同。

恐怕我不清楚。这是一个例子:

  com.xx.a
  com.xx.a.a

在“ com.xx.a”内部有一个名为“ a”的类。

因此,如果我想将此类称为“ a” …

我写:

a ma = new com.xx.a.a();

然后,IDE将认为我的意思是软件包“ com.xx.a.a”。

那我就不能打电话了。

我想知道为什么?

顺便说一句,图书馆提供者似乎不希望我们使用这些类。

他们如何做到这一点?


问题答案:

Java语言允许包标识符 遮盖 类别标识符。在您的情况下, 该类 com.xx.a 遮盖了com.xx.a

根据Java语言规范:

6.3.2模糊的声明

简单名称可能出现在可能被解释为变量,类型或
名称的上下文中。在这些情况下,第6.5节的规则指定将优先于类型选择变量,并优先于包选择类型。因此,有时可能 无法 通过其简单名称
引用可见类型 或程序包声明。 我们说这样的声明是模糊的。

我必须说,第6.5节中对标识符含义进行分类的规则还很不清楚。

您仍然碰巧拥有违反该规则的库副本的原因是,因为该规则不适用于类文件/ JAR文件和JVM。

这意味着您 可能 在JAR文件中遇到这种命名冲突,但是您永远不会将其视为的输出javac。产生了这些类/程序包名称的工具很可能是 代码混淆器
,它产生这种混乱的代码来压缩文件的大小并混淆代码以防止反向工程。

PS。仔细看,它实际上可能是Eclipse方面的一个错误(假设您正在谈论的是IDE)。通过让一个空的包名与一个类名冲突,Eclipse使javac接受的东西窒息了。规范很难遵循,但是从我的观察中可以看出,在这种情况下,javac遵循了规范。



 类似资料:
  • 我想问一下java编程语言,具体到构造函数。假设我们有一个类测试,在那里我们测试整个程序,和类点,在那里定义构造函数(集和获取方法btw)。类行: 类点: 现在,如果我在构造函数中输入类点的名称,那将是一个错误:

  • 我必须用Java实现一个日志机制。所以我使用JEE,使用RequestFilter和拦截器。我把所有这些都放在一个叫做日志记录的包中。 我的类是:请求过滤器,响应过滤器和常量 所以我的问题是。因为类名已经存在于包中,所以不记录类名可以吗? 包日志记录和重复日志记录:请求过滤日志记录,响应过滤日志记录,ConstantsLogging

  • 问题内容: 经常看到com。*软件包名称空间。“ com”是什么意思?谢谢。 问题答案: 包的命名约定在JLS中指定。这是相关的代码段(本节中还有很多内容): [JLS 7.7唯一程序包名称](http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.7) 您首先要拥有(或属于拥有)互联网域名的组织,从而形成唯一的软

  • 问题内容: 在Java中,这些之间有什么区别: 我已经多次检查过Javadoc,但这从来不能很好地解释它。我也进行了测试,但没有反映出调用这些方法背后的任何实际含义。 问题答案: 如果不确定某件事,请尝试先编写测试。 我这样做: 印刷品: 最后一个块中有一个空条目,其中返回一个空字符串。 结果是: 该 名称 是您愿意使用动态加载与类,例如,调用的名称与默认。在一定范围内,所有类都有唯一的名称。 该

  • 问题内容: 是否可以让您的用户下载其他名称的文件? 例如,有一个名为“ 4324ffsd34.jpg”的文件。我希望人们通过download.php以不同的名称(例如“ filetodownload.jpg”)下载它,而不重命名原始文件。 问题答案: 当然,请使用Content-disposition 标头 如果您希望提供默认文件名,而不是自动下载,那么这似乎可行。