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 的操作来说是如此不可或缺,以至于它们被假定 - 或者默认 - 是您正在编码(或 import
ed)的 "in the class"。 Liskov (2000) 给出了一个很好的例子:java.lang
- class 包含 String
这样的对象。
您经常会在 Java 中看到不合格的名称。这通常与 class 或方法相对于您尝试访问它的 class 的位置有关(同一个包)。以上,其他发帖者在Java中提到了packages
的概念。
包允许您解决 - 或者,也许更好地防止 - 命名冲突。程序中的每个包都可以复制另一个包的 class 名称等。在这种情况下,完全限定名称用于访问正确的 class (如其他答案所示)。您还可以导入一个包以避免使用其完全限定名称;但是,如果两个导入的 classes 包含命名冲突,您就会遇到一些问题。
我们编程课上的老师在谈论 "unqualified names",但我想知道它们到底是什么。
我怀疑方法名之类的东西是不合格的,但我不确定。
有谁能给我解释一下吗?我需要知道这一点,因为我需要解释 Java 以何种方式查找不合格的名称。
限定名称是指具有完整路径的名称,例如:
java.util.ArrayList list;
不合格的名称只有最后一部分:
import java.util.*;
ArrayList list;
该术语也适用于字段和方法。
那么,如果您可以导入 classes,为什么还需要使用限定名称?
当您使用两个 classes 时需要它,虽然它们来自不同的包,但共享相同的名称。一个 classic 的例子是 JDK:
中可笑的 classjava.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 的操作来说是如此不可或缺,以至于它们被假定 - 或者默认 - 是您正在编码(或 import
ed)的 "in the class"。 Liskov (2000) 给出了一个很好的例子:java.lang
- class 包含 String
这样的对象。
您经常会在 Java 中看到不合格的名称。这通常与 class 或方法相对于您尝试访问它的 class 的位置有关(同一个包)。以上,其他发帖者在Java中提到了packages
的概念。
包允许您解决 - 或者,也许更好地防止 - 命名冲突。程序中的每个包都可以复制另一个包的 class 名称等。在这种情况下,完全限定名称用于访问正确的 class (如其他答案所示)。您还可以导入一个包以避免使用其完全限定名称;但是,如果两个导入的 classes 包含命名冲突,您就会遇到一些问题。