Java におけるパッケージは、ツリー構造のパスなので、, というフォルダーとして理解できます。特定のパッケージの下でパッケージを宣言する場合、パッケージにちなんで名付けられたディレクトリにその .class も配置する必要があります。そうしないと、クラスが見つかりません。
クラスをパッケージに入れるには、package ステートメントを使用する必要があります。実際、package ステートメントを使用しない場合、クラスはデフォルトのデフォルト パッケージに配置されます。これは、Java プログラムを実行するときに、実行ディレクトリに同じ名前の .class ファイルが存在できない理由でもあります。
また、完全なクラス名はパッケージ名クラス名です。インポートがない場合、クラスを使用するには、java.util.Date などの完全なクラス名を指定する必要があります。便宜上、Java は 2 つのパッケージ java.lang と現在のファイルのデフォルト パッケージを自動的にインポートします。 (1) Java は、Java 内のクラスを使用するときに他のパッケージに完全なクラス名を与える必要がないことを規定しています。 lang package; (2) ) デフォルト パッケージ内のクラスは、完全なクラス名を指定しなくても、相互に (または同じパッケージ内で) 使用できます。
パッケージ化されたクラスとパッケージ化されていないクラス間の相互アクセスには、次のルールがあります: (1) パッケージ化されていないクラスは、直接インポートできるパッケージ化されたクラスにアクセスできます。 はい; ( 2) パッケージを持つクラスはパッケージのないクラスにアクセスできない. 同じパッケージから直接アクセスする. 別のパッケージをインポートする必要があるため, パッケージのないクラスはインポートできない; (3) クラスを定義するとき、他の人が使用できるようにするためにしたがって、パッケージを定義する必要があります。
Java パッケージは (パスの観点からは) 階層的に見えますが、実際にはそうではありません。たとえば、java.awt と java.awt.color は、同じステータスを持つ 2 つのパッケージです。 java.awt.color は java.awt に属しません。
クラス名にクラスを使用する場合は、まず現在のパッケージでこのクラスを検索し、導入されていないパッケージでそのクラスを見つけます。
いくつかの関連クラス、インターフェイス、列挙型、注釈タイプ、パッケージ内のクラスで使用されるリソース ファイル (ピクチャなど)。
(1) 関連するインターフェイスとクラスをまとめます
たとえば、グラフィックスをパッケージ化します。グラフィックス処理関連のモジュールをまとめます
(2) 回避タイプ間の名前の競合を排除します。 : カプセル化の一種として、パッケージはクラスに多層の名前空間を提供します。
(3) パッケージへの外部アクセス制御を実現
パッケージの利用は大きく3つのステップにまとめられます: クラスとインターフェイスをパッケージにバンドルする方法、パッケージ内のクラスを使用する方法、コンパイラがソース ファイルを見つけられるようにファイル システムを調整する方法。
1. パッケージ クラスの宣言
ソース コードの最初の行で package キーワードを使用してパッケージを定義します。パッケージ名は次のとおりです。通常はすべて小文字で、「.」が区切られます。
バッグの命名仕様については、リンクを参照してください: https://segmentfault.com/a/1190000008711718
## https://docs.oracle.com/javase/tutorial/package/namingpkgs。 html
パッケージの宣言には次の原則があります: (1) パッケージ ステートメントはソース ファイルの先頭に配置する必要があります、(2) ソース ファイルにはパッケージ ステートメントを 1 つだけ含めることができます、(3) パッケージクラス名、インターフェイス名の競合との混同を避けるため、名前はすべて小文字にする必要があります。
2. パッケージ
javac -d ディレクトリ ソース ファイル名.java
3. パッケージ
java パッケージ名を使用してクラスをコンパイルします。 .クラス名
同じパッケージ内のクラス間のアクセスは比較的簡単で、コード内でクラス名を直接使用できますが、異なるパッケージ間のアクセスは条件を満たす必要があります。条件: 他のパッケージ内のクラスからクラスにアクセスしたい場合は、そのクラスを public で変更する必要があります (注: public で変更されたクラスは、ファイル名と同じ名前を持つ必要があります)。通常、異なるパッケージ間で使用する方法は 3 つあります: (1) 完全名を使用してクラスにアクセスする; (2) クラスをインポートする; (3) クラスを含むパッケージ全体をインポートする
1。フルネーム
Circle クラス (公開変更) を含むグラフィックス パッケージがあると仮定し、そのパッケージへのアクセスをアウトソーシングする手順は次のとおりです:
graphics.Circle cir = new graphics.Circle();
2. クラスをインポートします
上記 フルネームを使用する方法は少し面倒です。このクラスを省略したり頻繁に使用したい場合は、次のようにすることができます:
import graphics.Circle; public class PackageTest { public static void main(String[] args) { Circle cir = new Circle(); } }
3. パッケージ全体をインポートします
このパッケージのさらに多くのクラスを使用したい場合は、たとえば、Line クラスの場合、パッケージ内のすべてのクラスをインポートできます:
import graphics.*; public class PackageTest { public static void main(String[] args) { Circle cir = new Circle(); Line line = new Line(); } }
许多Java平台的实现依赖于文件系统的等级制度 来管理源文件和class文件。我们一般把类、接口、枚举、注释类型放在可以反映包名的目录中,比如,Rectangle.java属于graphics类,我们就放在.....\graphics\Rectangle.java的路径上。同样,我们对其进行编译产生的class文件也要放在类似的目录上(这个目录最好不要和源文件放在一起),这样的好处是当我们要复用某个类时,就知道到哪去找了,JVM在运行程序时也知道去哪里找类。
比如,源文件放在:86a15073ee07a5288ef78984c38cc44e\sources\com\example\graphics\Rectangle.java
class文件放在:1c88c48f018631bbf99e30d7795bbcba\classes\com\example\graphics\Rectangle.class,其中,1c88c48f018631bbf99e30d7795bbcba\classes是类路径(class path),由CLASSPATH系统变量进行设置,而包名是com.example.graphics。编译器、JVM通过将包名称添加到类路径来构造.class文件的路径。
所以编译器、JVM在路径1c88c48f018631bbf99e30d7795bbcba\classes\com\example\graphics中查找类文件。class path可以有好几条,由分号(Windows)或冒号(UNIX)分隔。 默认情况下,编译器、JVM搜索当前目录和包含Java平台类的JAR文件,所以这些目录自动位于类路径中。
CLASSPATH是JVM或Java编译器中的一个参数,它指定用户定义的类和包的位置。 可以在命令行上或通过环境变量设置。默认情况下,我们访问JDK标准API和扩展包时,无需设置查找位置。 而用户自定义的包和库,则必须设置。由于JVM会在当前目录下搜索,所以当我们的文件都在运行目录下时,也可以不设置CLASSPATH。
有关CLASSPATH可以参考:
https://en.wikipedia.org/wiki/Classpath_%28Java%29
https://en.wikipedia.org/wiki/Java_Classloader
关于import,有三个注意的地方。
1、
首先是,Java的包表面上的等级问题。从路径上看,包似乎是分层的,但它们不是。 例如,Java API包括java.awt包,java.awt.color包,java.awt.font包等等。但是,java.awt.color包、java.awt.font包和其他java.awt.xxxx包并不属于java.awt。 前缀java.awt(The Java abstract window toolkit)的作用只是告诉开发者——和窗口有关的包都在这里面。但是包和包之间并不是包含关系。
当你导入java.awt.*时,会导入java.awt包中的所有类型,但它不会导入java.awt.color,java.awt.font或任何其他java.awt.xxxx包的所有类型。 如果你要使用java.awt.color中的类以及java.awt中的类,则必须同时导入导入这两个包:
import java.awt.*; import java.awt.color.*;
2、
其次是名字含糊不清的问题。当你导入的两个包中有一个类名字相同时,如果你继续采用缩写,就会出现一些问题。这时,你就要使用这个类的全名。比如,java.util、java.sql包中都有Date类,程序又同时导入了这两个包中的Date类。
import java.sql.*; import java.date.*;
3、static import
当我们需要频繁访问某个类的常量和静态方法,反复写它们的前缀(全名)可能不利于代码阅读。 静态import语句就提供了一种导入要使用的常量和静态方法的方法,这样您就不需要为其名称添加前缀。比如java.lang.Math类定义PI常量和许多静态方法,包括计算正弦,余弦,切线,平方根,最大值,最小值,指数等。
import static java.lang.Math.PI; import static java.lang.Math.cos; public class ImportTest { public static void main(String[] args) { double r = Math.cos(Math.PI * 2); double r1 = Math.cos(PI * 2); double r2 = cos(PI * 2); System.out.println(r+" "+r1+" "+r2); } }
当然,你也可以直接全部导入:
import static java.lang.Math.*;
应该注意的是,使用静态导入时要非常谨慎。 过度使用静态导入会导致代码难以阅读和维护,因为阅读者不知道某个特定的静态对象是哪个类的。 不过,当我们恰当地使用静态导入时,代码可以因为不用繁琐地写全名而更具可读性。
【推荐课程:Java视频教程】
以上がJava のパッケージの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。