Java 中的不合格名称

Unqualified name in Java

我们编程课上的老师在谈论 "unqualified names",但我想知道它们到底是什么。

我怀疑方法名之类的东西是不合格的,但我不确定。

有谁能给我解释一下吗?我需要知道这一点,因为我需要解释 Java 以何种方式查找不合格的名称。

限定名称是指具有完整路径的名称,例如:

java.util.ArrayList list;

不合格的名称只有最后一部分:

import java.util.*;

ArrayList list;

该术语也适用于字段和方法。


那么,如果您可以导入 classes,为什么还需要使用限定名称?

当您使用两个 classes 时需要它,虽然它们来自不同的包,但共享相同的名称。一个 classic 的例子是 JDK:

中可笑的 class
java.sql.Date

顺便延伸

java.util.Date

需要引用两者的实例是很常见的 class,因此您需要如下代码:

public void process(java.util.Date fromDate) {
    RowSet rows = <run query with fromDate as parameter>
    while (rows.nsxt()) {
        java.sql.Date date = rows.getDate(1);
        // code that needs date
    }
}

如果您使用两个同名的 classes,则不可避免地至少要限定一个 - 您可以导入一个,但同时导入两个会产生歧义。

Java 中的限定名称包括 class、接口、枚举或字段源自的特定包。

示例:java.util.ArrayList 是一个完全限定的名称。

不合格的名称只是 class、接口、枚举或没有包信息的字段。

示例:ArrayList

例如 com.yourcompany.domain.Person 是完全限定的 class 名称,Person 是 class 名称或非限定的 class 名称。

限定名称: org.springframework.jdbc.core.JdbcTemplate
它有包名称 org.springframework.jdbc.core 然后 class 名称 JdbcTemplate

不合格的名称: JdbcTemplate 只有 class 名称没有包名称。

例如:合格的名字是你家的完整地址,不合格的名字只是你家的名字。

在对话中添加一个尚未提及的内容(虽然没有直接询问,但我认为对对话有帮助):

Java中的所有名称都需要限定;然而,有些对于 Java 的操作来说是如此不可或缺,以至于它们被假定 - 或者默认 - 是您正在编码(或 imported)的 "in the class"。 Liskov (2000) 给出了一个很好的例子:java.lang - class 包含 String 这样的对象。

您经常会在 Java 中看到不合格的名称。这通常与 class 或方法相对于您尝试访问它的 class 的位置有关(同一个包)。以上,其他发帖者在Java中提到了packages的概念。

包允许您解决 - 或者,也许更好地防止 - 命名冲突。程序中的每个包都可以复制另一个包的 class 名称等。在这种情况下,完全限定名称用于访问正确的 class (如其他答案所示)。您还可以导入一个包以避免使用其完全限定名称;但是,如果两个导​​入的 classes 包含命名冲突,您就会遇到一些问题。