Setting Classpath and Environment Variables

Just recently, when i need to install ant for my final year project, i kind of reminiscent back to that day when i need to set up the path variables and the classpath. It took me about one whole day to figure out how to compile and interpret .java file to run. Frustated i am, yes, because at that time i didn’t have internet connection (hence, googling is not as meaningful). When i did find how it is done by myself, i felt really ecstatic i treat myself a lavish dinner (I didn’t get to eat lavish dinner very often).

When i first started coding using Java, i didn’t use fancy IDEs like Eclipse or NetBeans, instead, i use Text Editor. This way, i get to know the basic of compiling, interpreting, setting classpath, etc. Compiling the sources itself took me about an hour because i didn’t want to go to java directory first then call the javac.exe. So, i didnt want to call cds command every so often anytime i use the command prompt to compile the .java file. I just want to be able to call javac in any working directory. Instead of always go to this directory:

C:Program FilesJavajdk1.5.0_07bin>javac HelloWorld.java

i want to use the javac in any working directory, i.e:

C:My Java Programs>javac HelloWorld.java

How to do this? First of all, you must set the environment variables. In Vista, this can be done on

Control Panel–>System–>Advanced System Settings

In Advanced tab, click Environment Variables button.

In System Variables group, find PATH variable and edit it by adding your Java directory where the javac.exe resides. So, in my case it would be:

some path;C:Program FilesJavajdk1.5.0_07bin;

Click OK, open command prompt and then try typing any name of executable file in the bin directory. It works doesn’t it?

Now, you probably curious about what the environment variables are:

Microsoft defines them to be:

Environment variables are strings that contain information such as drive, path, or file name. They control the behavior of various programs. For example, the TEMP environment variable specifies the location in which programs place temporary files.

So, the PATH variable that we’ve edited specify the location of executable files. Such as dir, ping, cd, etc. By setting the PATH variable, we don’t need to change the working directory to the one that has ping.exe , for example. That is why by adding our java directory to the PATH variable, we can call the command in any working directory.

Now, about the classpath.

Sun has a very comprehensive tutorial on setting the classpath, so just check it out here.

If you want to keep things simpe, you can set the environment variable so you won’t keep typing classpath directory for each cmd session.

So, add the environment variable : java

give the value to the directory where all your java source code, ex:C:java.

Next, when you try to compile and run your java, you can type:

C:anydirectory>javac %java%HelloWorld.java

C:anydirectory>java -classpath %java% HelloWorld

There you go!

Advertisement

Konsep OOP : Polymorphism

Kegunaan kedua dari inheritance adalah polymorphism (banyak bentuk). Bagaimana penggunaanya?

Kita gunakan contoh dari post sebelumnya tentang Inheritance.

Misal kita punya class Peternakan yang akan memanggil method makan() dari semua object Hewan. Kita tidak tahu class Hewan sudah diturunkan menjadi apa saja: bisa ayam, bebek, dan lain-lain. Tapi, satu hal yang pasti, jika mereka adalah subclass dari Hewan, maka mereka mempunyai method makan().

public class Peternakan {

public static void main(String[] args) {

Hewan hewan = new Hewan();

Bebek bebekKloset = new Bebek();

Ayam ayamKampus = new Ayam();

kegiatanHewan(hewan);

kegiatanHewan(bebekKloset);

}

public void kegiatanHewan(Hewan ternak) {

ternak.makan();

}

}

Jika terlebih dahulu dideklarasikan bahwa Ayam dan Bebek adalah subclass dari Hewan dan method makan ada di Hewan dan memproduksi output berupa string “Makan!”, maka output kode di atas adalah:

Makan!

Makan!

Contoh di atas adalah polymorphism. Class Hewan mempunyai banyak bentuk (polymorphism), bisa berupa Bebek maupun Ayam sehingga jika ada method public void kegiatanHewan(Hewan ternak) yang mengambil class Hewan sebagai parameternya, maka Bebek dan Ayam dapat menjadi argumen yang valid karena Bebek dan Ayam adalah Hewan.

Selanjutnya, misalkan kita punya kode sebagai berikut:

Hewan bebekKloset = new Bebek();

apakah compiler akan mengeluarkan error? Jawabannya tidak. Karena Bebek adalah Hewan. Jika demikian pada heap, object apa yang ada? Bebek atau Hewan? Jika ada code sebagai berikut, apa yang terjadi (misalkan di class Hewan ada method makan() dan class Bebek override method makan tersebut):

Hewan bebekKloset = new Bebek();

bebekKloset.makan();

Method makan() mana yang dipanggil? makan() pada Hewan atau makan() pada Bebek?

Jawabannya adalah makan pada Bebek(). Mengapa? Karena Java melakukan “late binding”, artinya pengasosiasian method dilakukan pada runtime. Jadi pada contoh di atas, tipe bebekKloset adalah Hewan, tapi pada saat aplikasi dijalankan, sebenarnya bebekKloset adalah Bebek dan bukan Hewan.

Konsep OOP : Inheritance

Mengapa mengunakan inheritance? Ada dua alasan yang paling mendasar:

1. Untuk menggunakan kembali kode yang sudah ada

2. Untuk memanfaatkan polymorphism (kita lihat di post selanjutnya)

Mari kita lihat alasan pertama. Cara untuk mewarisi suatu kelas adalah dengan menggunakan keyword extends.

class Hewan {

public void makan() {

//kode yang amat sangat panjang dan rumit

System.out.println(“Makan”);

}

}

class Bebek extends Hewan {

public void barisBerbaris() {

System.out.println(“Siap grak!”);

}

}

public class Peternakan {

public static void main (String[] args) {

Bebek bebekKloset = new Bebek();

bebekKloset.barisBerbaris();

bebekKloset.makan();

}

}

Output dari program di atas adalah:

Siap grak!

Makan

Jadi, dalam pewarisan (inheritance) semua method dari kelas super dapat digunakan oleh kelas yang mewarisi tanpa perlu menulis method-method tersebut lagi.

Secara default, semua kelas di Java mewarisi kelas Object, itu adalah cara Java untuk memasukkan method-method yang sering dipakai agar tidak perlu dibuat lagi oleh programmer, contoh: toString(), equals(), dan lain-lain.

Pada Java, satu kelas tidak dapat mewarisi lebih dari satu kelas dalam satu keturunan (multiple inheritance). Jadi kita tidak bisa mendeklarasikan:

public class Bebek extends Hewan, Makanan

Tapi kita bisa mendeklarasikan sebagai berikut:

class Hewan extends MakhlukHidup

kemudian

class Bebek extends Hewan.

dalam kasus ini, Bebek mempunyai method dari class Bebek, Hewan dan MakhlukHidup.

Sekian tentang inheritance, post selanjutnya akan membahas tentang polymorpism.

Konsep OOP : Encapsulation

Dari pengalaman pribadi dan teman-teman yang baru berangkat dari latar belakang procedural programming menuju object oriented programming (oop) dalam hal ini Java, ketiga konsep di atas adalah yang paling membingungkan.

Ada apa dengan encapsulation, inheritance dan polymorphism?

Pertama, mari kita lihat konsep encapsulation.

Perhatikan contoh berikut: Sebuah aplikasi yang di dalam suatu inputnya tidak boleh negatif. Misalkan aplikasi kasir, kasih tidak boleh memberikan input pembayaran berupa negatif sehingga kembalian = harga barang – (- pembayaran). Toko bisa ngutang T_T”. Kita sebagai programmer tentu sudah tahu tentang ini dan membuat sebuah pengendali, katakan if statement untuk mengatasinya.

public class Kasir {

public int pembayaran, kembalian, harga = 0;

// kode-kode untuk Kasir

void cekTransaksi() {

if (pembayaran < 0) {

System.out.println(“Tidak bisa ngutang”);

}

}

}

Apa yang terjadi jika variable pembayaran pada class Kasir digunakan untuk lima class, kita harus menulis lima statement if yang sama. Apa yang terjadi kalau kita berada dalam satu tim untuk mengembangkan sistem tersebut dan programmer lain perlu mengakses variable pembayaran tapi tidak mengerti tentang tanda negatif tadi. Apa yang terjadi kalau dalam salah satu kelas tersebut kita lupa menaruh statement if? Aplikasi tidak berjalan dengan semestinya.

Untuk mengatasi masalah itu, kita perlu membungkus seluruh member dari class tersebut sehingga nilainya tidak bisa diubah menjadi yang tidak kita inginkan. Inilah fungsi encapsulation.

Encapsulation biasa dilambangkan dengan penggunaan accessor dan mutator, atau method get dan set. Penamaan method menggunakan konvensi JavaBeans. Dinamakan accessor (get) karena ia hanya mengambil tanpa mengubah state dari member tersebut dan dinamakan mutator (set) karena ia mengubah state dari member tersebut. Method-method ini dideklarasi sebagai public sedangkan variable dideklarasi sebagai private.

Contoh class Kasir yang diperbaharui:

public class Kasir {

private int pembayaran = 0;

public int getPembayaran {

return pembayaran;

}

public void setPembayaran (int inputBayar) {

if (inputBayar <0) {

System.out.println(“Tidak bisa ngutang”);

}

else {

pembayaran = inputBayar;

}

}

}

Dengan ini, aplikasi kita akan lebih aman.

Jadi, mengerti tentang encapsulation?