Java导入语句语法

9
这是一个简单的问题,但我真的很困扰。我试图找到重复内容,并在谷歌上搜索它,但当我找不到令人满意的答案时,我更加惊讶了。
import java.util.Scanner; 

在这个语句中,.Scanner 是一个类, .util 是包的名称。
一般情况下,javajavax 或者其他任何东西都会出现在第一个句点之前,是用来表示包所属的命名空间的。
更新:
我也找到了这张图片:

http://www.javatpoint.com/package

这是真的吗?


9
java.util是一个包的名称。 - Oliver Charlesworth
Java或javax也是包名称的一部分。 - user987339
1
整个'java.util.Scanner'是一个完全限定的类名 :) - arghtype
7个回答

8

根据JLS 7.1

包的成员是它的子包以及在包的所有编译单元(§7.3)中声明的所有顶层类类型(§7.6,§8)和顶层接口类型(§9)。

例如,在Java SE平台API中:

  • java包有子包awt、applet、io、lang、net和util,但没有编译单元。

  • java.awt包有一个名为image的子包,以及一些包含类和接口类型声明的编译单元。

如果一个包的完全限定名称(§6.7)是P,Q是P的子包,则P.Q是子包的完全限定名称,并且还表示一个包。

因此,您可以从中了解到:

  • java 是一个没有类,只有子包的包。
  • utiljava 的一个子包,完全限定名称为 java.util
  • util 不表示一个包,java.util 才是一个包。

"我还发现了这张图片:... 它是真的吗?"

是的,utiljava 的一个子包。然而,util 不是一个包,java.util 才是一个包。

你可以将包想象成一个目录结构,如果你愿意的话,其中每个子包都是其外部包内的文件夹。因此,会有一个名为“java”的“文件夹”,在其中,还有另一个名为“util”的“文件夹”。包由其完全限定名称(“完整路径”)表示,因此java是一个包,java/util也是一个包。但/util不是一个包。但是,由目录结构表示的包不是规范。这只是一种常见的实现方式。如何存储包取决于主机系统(JLS 7.2)。

3
注意:Java 实际上并没有包层次结构。看起来像有是因为你将包定义为子目录,所以 utiljava 目录之内,但是 javajava.util 的行为就像是完全独立的包。 - Darkhogg
2
@Darkhogg 是的,这是真的,规范中没有说明“子包”与其“包含”的包有任何关系。例如,如果 P 是一个包,P.Q 是一个包,这并不意味着某个类 P.Q.SomeClass 可以使用另一个类 P.AnotherClass 的简单名称而不需要导入或访问其包私有/受保护成员,反之亦然。尽管根据规范,QP 的成员。 - Radiodef

5

Java中的类通过一个完全限定名来标识,该完全限定名由类的包名和类名(如果有外部类,则还包括其外部类)连接组成。通常,在导入语句中如下:

import foo.bar.baz.MyClass;

除了最后一个点分隔的字段,其余所有内容都是包名(foo.bar.baz),最后一个字段是类名(MyClass)。在您的示例中,java.util是包名,Scanner是类名。
实际上,这个过程还有点复杂,因为可能涉及到内部/嵌套类和接口,但是您已经明白了大意。

那么可以说,在实际类名之前的所有内容都是类所查找的子目录的子集吗?而java或其他内容首先出现只是编译器在搜索必要类时要查看的顶级目录之一? - user3081519
2
@user3081519,它通常被实现为目录结构,但根据JLS的规定,它不必如此。这取决于“主机系统”。 - Radiodef

1

import java.util.Scanner 表示:

  1. 查找 java 包。
  2. 在其中查找 util 包。
  3. 在其中找到 Scanner 类。
  4. 现在,每当我们在此 java 文件中使用类/等的名称(例如 Scanner s = new Scanner()),则将使用导入找到的类。

或者,您可以不进行导入并使用 java.util.Scanner s = new java.util.Scanner(),但您可以看到这会很快变得难以管理,尤其是如果您在文件中的许多地方都使用它。导入只是一个方便的方法,可以减少在引用 Scanner 时反复指定要使用的 Scanner 类的版本。


这是不正确的;包不能嵌套。只有一个名为“java.util”的包;没有“util”或“java”。 - Ernest Friedman-Hill
在您的项目视图中,它们是嵌套的。在文件系统中,它们是嵌套的。在JAR文件中,它们也是嵌套的... - Tim B
你说它们不是嵌套的,我认为虽然它们可能没有被定义为嵌套,但为了易于理解,它们确实是嵌套的。我也不知道有什么官方文件明确表示它们不是嵌套的,但如果有人能给我一个链接,我愿意相信它的存在并且我不知道它 :) - Tim B

1
一些要点:
  • 包名是java.util,而不是util。"java"只是包名的一部分。
  • 包名是由一系列有效的Java标识符用点号隔开的,AbC123.XYZ.foo是一个有效的包名。
  • 包可以省略。如果省略,则类位于项目的根目录中(我曾经在一个生产项目中工作过,该项目没有包!所有内容都在一个目录中...可怕!)
  • 按照惯例,以java开头的包是JDK的一部分(加上扩展)。语言中没有规定或强制执行此规定。

1

javautil是嵌套包的名称。java.util是最终包的路径。

它们是rt.jar文件内的目录。

rt.jar文件是一个zip归档文件,您可以使用7-zip程序查看它。

Scannerrt.jarjava/util目录中的Scanner.class文件。

import java.util.Scanner指令允许您在代码中使用Scanner类名称而不必指定完整路径。

import java.util.*指令允许您使用java.util中的所有类名而无需路径。

import static java.util.Scanner.*指令允许您使用Scanner内的所有静态成员,而无需路径。但是没有静态成员。

以下是JRE中所有包的列表:http://docs.oracle.com/javase/7/docs/api/overview-summary.html

0

1) Java是一个包(也代表文件系统中的一个文件夹)。它直接在类路径中,因此您的程序可以将其作为“java”引用(Java文件夹中的子文件夹)

2) Util是Java包中的一个包(因此被引用为“java.util”)。

3) Scanner是util包中的一个类(因此为“java.util.Scanner”)。


你可以拥有任意多层嵌套的包,例如 'mypackage1.mypackage2.mypackage3. ...' 等等,只要 mypackage1 在类路径中即可。

希望这能帮到你。


-2

导入语句表示一个层次结构

import java.util.Scanner;
  • java 是包名
  • util 是子包名(在 java 包内)
  • Scanner 是类名(在 util 包内)

    import java.util.*;

类名可以用星号代替,
这意味着导入所提到的子包中所有类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接