【问题标题】:Shouldn't "import foo.*" also include subpackage "foo.bar.*"?“import foo.*”不应该也包含子包“foo.bar.*”吗?
【发布时间】:2012-08-21 07:18:22
【问题描述】:

在学习 Java 的过程中,我想到了许多教程的一个对我来说相当混乱的属性。考虑示例教程中的以下两个导入:

import java.awt.*;
import java.awt.event.*;

第一行显然是导入java.awt 包,第二行是awt 的子包。 但是 asterix 不应该包含所有子包吗? 因此,第一行应该可以解决问题 - 不需要第二行?如果不是:那么 asterix 的真正目的/用途是什么?

例如,在 MySQL 中使用SELECT * FROM foo 从表中选择所有字段,也许我很愚蠢地认为这自然是这种情况。

【问题讨论】:

  • 它用于导入给定包中的所有类(即java.awt中的所有类),而不是子包及其类。

标签: java oop import package


【解决方案1】:

不,包裹被视为一个整体。尽管将它们分层考虑通常很有用,但在 Java 语言或编译中没有任何概念表明 java.awt.event 属于 java.awt

您与 SQL 表的比较并不完全正确,因为 SQL 数据库中不存在子表之类的东西。相反,假设您有一个代表所有类的表,其中包含以下条目:

ID | Package   | Name
--------------------------
1  | awt       | SomeClassName1
2  | awt.event | SomeClassName2

现在,如果你想获得 awt 类,你会说:

SELECT * FROM MyTable WHERE Package = 'awt'

你不会指望这会给你两个条目,只是因为包名awt开头,对吗?

【讨论】:

    【解决方案2】:

    查看我的回答 here(和我的评论)。通配符只能深入 1 级,不会进入子包

    【讨论】:

      【解决方案3】:

      每个包名(“a.b.c”)都是一个独立的包。具有相似命名前缀的两个包(例如“a.b.c”和“a.b.d”)是该语言的独立包,用于命名空间和访问控制。

      当然,对于人类来说,这代表了包之间可能存在的关系。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2011-08-18
        相关资源
        最近更新 更多