【问题标题】:Java import statement syntaxJava 导入语句语法
【发布时间】:2013-12-25 22:26:54
【问题描述】:

这是一个简单的问题,但我真的被它困扰了。我试图找到一个重复的,并用谷歌搜索它,但当我找不到令人满意的答案时,我更加惊讶。

import java.util.Scanner; 

在这个语句中.Scanner是类,

.util是包名

什么是javajavax 或一般第一个时期之前的任何东西?

更新:

我也找到了这张图片:

http://www.javatpoint.com/package

这是真的吗?

【问题讨论】:

  • java.util 是包的名称。
  • Java 或 javax 也是包名的一部分。
  • 和整个 'java.util.Scanner' 是一个完全限定的类名 :)

标签: java import


【解决方案1】:

根据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,其中还有另一个“文件夹”实用程序。包由其完全限定名称(“完整路径”)表示,因此java 是一个包,java/util 是一个包。 /util 不是一个包。但是由目录结构表示的包不是规范。这只是一个常见的实现。由主机系统决定如何存储包 (JLS 7.2)。

【讨论】:

  • 这完全回答了我的问题。谢谢。
  • 注意:Java 实际上没有包层次结构。看起来是这样的,因为您将包定义为子目录,所以 util 在“内部”java,但 javajava.util 表现得像完全独立的包。
  • @Darkhogg 是的,这是真的,规范中没有任何内容说“子包”与其“包含”包完全相关。例如,如果P 是一个包并且P.Q 是一个包,这并不意味着某个类P.Q.SomeClass 可以通过其简单名称使用另一个类P.AnotherClass 而无需导入或访问其包私有/受保护的成员反之亦然。虽然根据规范QP 的成员。
【解决方案2】:

Java 中的类由完全限定名标识,该名称由类的包和类名(以及任何外部类,如果有的话)的串联组成。通常,在如下导入语句中:

import foo.bar.baz.MyClass;

除了最后一个以点分隔的字段之外的所有内容都是包名(foo.bar.baz),最后一个字段是类名(MyClass)。在您的示例中,java.util 是包名,Scanner 是类名。

这个过程实际上有点复杂,因为可能涉及内部/嵌套类和接口,但你明白了。

【讨论】:

  • 那么说实际类名之前的所有内容都是查找该类的目录的子集,这是真的吗?而 java 或任何最先出现的东西只是编译器在搜索必要类时要查看的顶级目录之一?
  • @user3081519 它通常作为目录结构实现,但根据 JLS,它不必如此。它“取决于主机系统”。
【解决方案3】:

import java.util.Scanner 说。

  1. 查看包java。
  2. 在 util 包中查看。
  3. 在其中找到类 Scanner。
  4. 现在,只要我们在此 java 文件中使用类/etc 的名称(例如 Scanner s = new Scanner()),就会使用通过导入找到的类。

或者,您不能执行导入并执行java.util.Scanner s = new java.util.Scanner(),但您可以看到这会很快变得笨拙,特别是如果您在文件中的很多地方使用它。导入只是一种方便的方法,可以减少在引用 Scanner 时重复指定 Scanner 类的哪个版本。

【讨论】:

  • 这是不正确的;包不嵌套。只有一个包“java.util”;没有“util”或“java”。
  • 在您的项目视图中,它们是嵌套的。在文件系统中,它们是嵌套的。在 JAR 文件中,它们是嵌套的...
  • 你说它们没有嵌套,我说虽然它们可能没有被定义为嵌套到所有意图和目的,并且为了便于理解它们确实嵌套。我也不知道有什么官方说他们不知道,尽管我愿意相信它存在,我不知道是否有人可以给我一个链接:)
【解决方案4】:

几点:

  • 包名是java.util,而不是util。 “java”只是包名的一部分。
  • 包名是任何一系列以点分隔的有效java标识符,AbC123.XYZ.foo是一个有效的包名
  • 包可以省略。如果不存在,则该类位于项目的根目录中(我曾经在一个没有包的生产项目中工作过!一切都在一个目录中……哎呀!)
  • 按照惯例,以java 开头的包是JDK 的一部分(加上扩展)。语言中没有任何内容指定或强制执行它

【讨论】:

    【解决方案5】:

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

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

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

    Scannerjava/util 目录内rt.jar 内的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

    【讨论】:

      【解决方案6】:

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

      2) util 是 java 包中的一个包(因此被称为“java.util”)。

      3) Scanner 是 util 包中的一个类(因此是 'java.util.Scanner')


      您可以拥有任意数量的嵌套包,例如 'mypackage1.mypackage2.mypackage3. ...' 等等,只要 mypackage1 在类路径中。

      希望对你有帮助

      【讨论】:

        【解决方案7】:

        import 语句代表一个层次结构

        import java.util.Scanner;
        
        • java是包
        • util是子包(在java里面)
        • Scanner 是类(在 util 中)

          导入 java.util.*;

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

        【讨论】:

          猜你喜欢
          • 2017-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          • 2023-03-17
          相关资源
          最近更新 更多