ホームページ  >  記事  >  Java  >  Java のパッケージの概要

Java のパッケージの概要

little bottle
little bottle転載
2019-04-08 16:24:533268ブラウズ

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. パッケージの定義

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 パッケージ名を使用してクラスをコンパイルします。 .クラス名

2. パッケージの使用

同じパッケージ内のクラス間のアクセスは比較的簡単で、コード内でクラス名を直接使用できますが、異なるパッケージ間のアクセスは条件を満たす必要があります。条件: 他のパッケージ内のクラスからクラスにアクセスしたい場合は、そのクラスを 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

关于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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。