Mengapa menemukan kembali roda? Klise itu berlaku untuk pengembangan perangkat lunak di mana beberapa pengembang sering menulis ulang kode yang sama untuk program yang berbeda. Dua kelemahan dengan pendekatan itu adalah:
- Ini membuang-buang waktu
- Ini memperkenalkan potensi bug dalam kode debug
Sebagai alternatif untuk menulis ulang kode yang sama, banyak lingkungan pengembangan perangkat lunak menyediakan alat pustaka yang mengatur kode yang sering digunakan. Setelah pengembang selesai men-debug beberapa kode yang dapat digunakan kembali, mereka menggunakan alat tersebut untuk menyimpan kode tersebut di perpustakaan — satu atau lebih file yang berisi kode yang sering digunakan untuk digunakan dalam berbagai program. Selama pembuatan program, alat kompilator atau pustaka mengakses pustaka untuk menghubungkan kode referensi pustaka program ke program.
Perpustakaan sangat penting untuk Java. Mereka memungkinkan, sebagian, classloader JVM untuk menemukan file kelas. (Saya akan menjelajahi classloader di artikel mendatang.) Untuk alasan itu, perpustakaan Java umumnya dikenal sebagai perpustakaan kelas. Namun, Java merujuk ke pustaka kelas sebagai paket.
Artikel ini membahas paket; Saya menunjukkan kepada Anda cara membuat paket kelas dan antarmuka, cara mengimpor (yaitu, memasukkan ke dalam program) kelas dan antarmuka yang dikemas, cara memindahkan paket pada hard drive, dan cara menggunakan file jar untuk merangkum paket.
Catatan |
---|
Percobaan paket tunggal artikel ini khusus untuk Microsoft Windows. Anda harus dapat dengan mudah mengekstrapolasi eksperimen ini ke platform non-Windows. |
Apa itu paket?
Sebuah paket adalah kumpulan kelas dan interface. Setiap paket memiliki namanya sendiri dan mengatur kelas dan antarmuka tingkat atas (yaitu, tidak bersarang) ke dalam namespace terpisah , atau kumpulan nama. Meskipun kelas dan antarmuka dengan nama yang sama tidak dapat muncul dalam paket yang sama, mereka dapat muncul dalam paket yang berbeda karena ruang nama terpisah ditetapkan ke setiap paket.
Dari perspektif implementasi, menyamakan paket dengan direktori terbukti bermanfaat, seperti halnya menyamakan kelas paket dan antarmuka dengan file kelas direktori. Ingatlah pendekatan lain — seperti penggunaan database — untuk mengimplementasikan paket, jadi jangan biasakan untuk selalu menyamakan paket dengan direktori. Tetapi karena banyak JVM menggunakan direktori untuk mengimplementasikan paket, artikel ini menyamakan paket dengan direktori. Java 2 SDK mengatur koleksi kelas dan antarmuka yang luas ke dalam hierarki paket seperti pohon di dalam paket, yang setara dengan direktori di dalam direktori. Hierarki tersebut memungkinkan Sun Microsystems untuk dengan mudah mendistribusikan (dan Anda untuk dengan mudah bekerja dengan) kelas dan antarmuka tersebut. Contoh paket Java meliputi:
java.lang:
Sebuah koleksi kelas terkait bahasa, sepertiObject
danString
, yang diselenggarakan dijava
paket inilang
sub-paketjava.lang.ref:
Sebuah koleksi kelas bahasa terkait referensi-, sepertiSoftReference
danReferenceQueue
, yang diselenggarakan diref
sub-sub-paket darijava
paket inilang
sub-paketjavax.swing:
Sebuah koleksi kelas terkait swing komponen, sepertiJButton
, dan interface, sepertiButtonModel
, yang diselenggarakan dijavax
paket iniswing
sub-paket
Karakter titik memisahkan nama paket. Misalnya, dalam javax.swing
, karakter titik memisahkan nama paket javax
dari nama subpaket swing
. Karakter titik adalah padanan platform-independen yang setara dengan karakter garis miring ( /
), karakter garis miring terbalik ( \
), atau karakter lain untuk memisahkan nama direktori dalam implementasi paket berbasis direktori, cabang database dalam implementasi paket berbasis database hierarki, dan seterusnya. .
Tip |
---|
Seperti halnya Anda tidak dapat menyimpan file dan direktori dengan nama yang sama di direktori yang sama, Anda tidak dapat menyimpan kelas atau antarmuka dan paket dengan nama yang sama dalam paket yang sama. Misalnya, dengan sebuah paket bernama accounts , Anda tidak dapat menyimpan paket dan kelas yang dinamai payable dalam accounts . Untuk menghindari nama yang bentrok, huruf besar huruf pertama nama kelas dan antarmuka, dan huruf kecil huruf pertama nama paket. Menggunakan contoh sebelumnya, simpan kelas Payable dalam paket accounts sebagai accounts.Payable dan paket payable dalam paket accounts sebagai accounts.payable . Pelajari lebih lanjut tentang ini dan konvensi penamaan lainnya dari Sun's Code Conventions untuk Bahasa Pemrograman Java . |
Buat paket kelas dan antarmuka
Setiap kelas dan antarmuka file sumber diatur ke dalam sebuah paket. Jika package
direktif tidak ada, kelas dan antarmuka tersebut termasuk dalam paket tanpa nama (direktori yang dianggap JVM sebagai direktori saat ini — direktori tempat program Java memulai eksekusinya melalui program Windows java.exe
, atau yang setara dengan OS — dan tidak berisi subpaket) . Tetapi jika package
direktif muncul di file sumber, direktif tersebut menamai paket untuk kelas dan antarmuka tersebut. Gunakan sintaks berikut untuk menentukan package
arahan dalam kode sumber:
'package' packageName ['.' subpackageName ...] ';'
Sebuah package
arahan dimulai dengan package
kata kunci. Pengenal yang menamai paket packageName
,, segera mengikuti. Jika kelas dan antarmuka akan muncul dalam sub-paket (pada tingkat tertentu) di dalam packageName
, satu atau lebih subpackageName
pengenal yang dipisahkan titik muncul setelahnya packageName
. Fragmen kode berikut menampilkan sepasang package
arahan:
permainan paket; paket game.devices;
package
Direktif pertama mengidentifikasi paket bernama game
. Semua kelas dan antarmuka yang muncul di file sumber direktif itu diatur dalam game
paket. package
Direktif kedua mengidentifikasi sub-paket bernama devices
, yang berada dalam sebuah paket bernama game
. Semua kelas dan interface yang muncul dalam file sumber yang direktif ini mengatur dalam game
paket ini devices
sub-paket. Jika implementasi JVM memetakan nama paket ke nama direktori, game.devices
memetakan ke game\devices
hierarki direktori di bawah Windows dan game/devices
hierarki direktori di bawah Linux atau Solaris.
Peringatan |
---|
Hanya satu package direktif yang dapat muncul di file sumber. Selanjutnya, package direktif harus menjadi kode pertama (selain komentar) di file itu. Melanggar salah satu aturan menyebabkan compiler Java melaporkan kesalahan. |
Untuk membantu Anda merasa nyaman dengan paket, saya telah menyiapkan contoh yang mencakup semua topik dalam artikel ini. Di bagian ini, Anda akan mempelajari cara membuat paket contoh. Di bagian selanjutnya, Anda akan belajar cara mengimpor kelas dan antarmuka dari paket ini, cara memindahkan paket ini ke lokasi lain di hard drive Anda dan masih mengakses paket dari program, dan cara menyimpan paket dalam file jar. . Kode 1 menyajikan kode sumber paket:
Daftar 1. A.java
// A.java package testpkg; kelas publik A {int x = 1; publik int y = 2; dilindungi int z = 3; int returnx () {return x; } public int returny () {return y; } dilindungi int returnz () {return z; } antarmuka publik StartStop {void start (); batal stop (); }} kelas B {public static void hello () {System.out.println ("hello"); }}
Kode 1 memperkenalkan kode sumber ke paket bernama pertama Anda. The package testpkg;
nama direktif bahwa paket testpkg
. Di dalam testpkg
ada kelas A
dan B
. Di A
dalamnya ada tiga deklarasi bidang, tiga deklarasi metode, dan deklarasi antarmuka dalam. Di dalam B
adalah deklarasi metode tunggal. Seluruh kode sumber disimpan A.java
karena A
adalah kelas publik. Tugas kita: Ubah kode sumber ini menjadi paket yang terdiri dari dua kelas dan antarmuka bagian dalam (atau direktori yang berisi tiga file kelas). Langkah-langkah khusus Windows berikut menyelesaikan tugas itu:
- Buka jendela perintah Windows dan pastikan Anda berada di
c:
direktori root drive (direktori utama — diwakili oleh karakter awal garis miring terbalik (\
)). Untuk melakukan itu, ketikkanc:
perintah diikuti dengancd \
perintah. (Jika Anda menggunakan drive yang berbeda, gantic:
dengan drive yang Anda pilih. Selain itu, jangan lupa untuk menekan tombol Enter setelah mengetik perintah.) - Buat
testpkg
direktori dengan mengetikmd testpkg
. Catatan: Saat mengikuti langkah-langkah artikel ini, jangan ketik titik setelah perintah. - Buat
testpkg
direktori saat ini dengan mengetikcd testpkg
. - Gunakan editor untuk memasukkan kode sumber Listing 1 dan simpan kode itu ke sebuah
A.java
file ditestpkg
. - Compile
A.java
by typingjavac A.java
. You should see classfilesA$StartStop.class
,A.class
, andB.class
appear in thetestpkg
directory.
Figure 1 illustrates Steps 3 through 5.

Congratulations! You have just created your first package. Think of this package as containing two classes (A
and B
) and A
's single inner interface (StartStop
). You can also think of this package as a directory containing three classfiles: A$StartStop.class
, A.class
, and B.class
.
Note |
---|
To minimize package name conflicts (especially among commercial packages), Sun has established a convention in which a company's Internet domain name reverses and prefixes a package name. For example, a company with x.com as its Internet domain name and a.b as a package name (a ) followed by a subpackage name (b ) prefixes com.x to a.b , resulting in com.x.a.b . My article does not follow this convention because the testpkg package is a throw-away designed for teaching purposes only. |
Import a package's classes and interfaces
Once you have a package, you will want to import classes and/or interfaces—actually, class and/or interface names—from that package to your program, so it can use those classes and/or interfaces. One way to accomplish that task is to supply the fully qualified package name (the package name and all subpackage names) in each place where the reference type name (the class or interface name) appears, as Listing 2 demonstrates:
Listing 2. Usetestpkg1.java
// Usetestpkg1.java class Usetestpkg1 implements testpkg.A.StartStop { public static void main (String [] args) { testpkg.A a = new testpkg.A (); System.out.println (a.y); System.out.println (a.returny ()); Usetestpkg1 utp = new Usetestpkg1 (); utp.start (); utp.stop (); } public void start () { System.out.println ("Start"); } public void stop () { System.out.println ("Stop"); } }
By prefixing testpkg.
to A
, Usetestpkg1
accesses testpkg
's class A
in two places and A
's inner interface StartStop
in one place. Complete the following steps to compile and run Usetestpkg1
:
- Open a Windows command window and make sure you are in the
c:
drive's root directory. - Ensure the
classpath
environment variable does not exist by executingset classpath=
. (I discussclasspath
later in this article.) - Use an editor to enter Listing 2's source code and save that code to a
Usetestpkg1.java
file in the root directory. - Compile
Usetestpkg1.java
by typingjavac Usetestpkg1.java
. You should see classfileUsetestpkg1.class
appear in the root directory. - Type
java Usetestpkg1
to run this program.
Figure 2 illustrates Steps 3 through 5 and shows the program's output.

According to Usetestpkg1
's output, the main()
method's thread successfully accesses testpkg.A
's y
field and calls the returny()
method. Furthermore, the output shows a successful implementation of the testpkg.A.StartStop
inner interface.
For Usetestpkg1
, prefixing testpkg.
to A
in three places doesn't seem a big deal. But who wants to specify a fully qualified package name prefix in a hundred places? Fortunately, Java supplies the import
directive to import a package's public reference type name(s), so you do not have to enter fully qualified package name prefixes. Express an import
directive in source code via the following syntax:
'import' packageName [ '.' subpackageName ... ] '.' ( referencetypeName | '*' ) ';'
An import
directive consists of the import
keyword immediately followed by an identifier that names a package, packageName
. An optional list of subpackageName
identifiers follows to identify the appropriate subpackage (if necessary). The directive concludes with either a referencetypeName
identifier that identifies a specific class or interface from the package, or an asterisk (*
) character. If referencetypeName
appears, the directive is a single-type import
directive. If an asterisk character appears, the directive is a type-on-demand import
directive.
Caution |
---|
As with the package directive, import directives must appear before any other code, with three exceptions: a package directive, other import directives, or comments. |
The single-type import
directive imports the name of a single public reference type from a package, as the following code fragment demonstrates:
import java.util.Date;
The previous single-type import
directive imports class name Date
into source code. As a result, you specify Date
instead of java.util.Date
in each place that class name appears in source code. For example, when creating a Date
object, specify Date d = new Date ();
instead of java.util.Date d = new java.util.Date ();
.
Berhati-hatilah dengan import
arahan tipe tunggal . Jika compiler mendeteksi import
perintah tipe tunggal yang menetapkan nama tipe referensi yang juga dideklarasikan dalam file sumber, compiler akan melaporkan kesalahan, seperti yang ditunjukkan oleh fragmen kode berikut:
import java.util.Date; Kelas Tanggal {}
Kompilator menganggap fragmen kode sebagai upaya untuk memperkenalkan dua tipe referensi dengan Date
nama yang sama :