I. Pokok Bahasan :
1. 2. 3. 4. 5. 6. 7. Instalasi JDK 1.6 Pengesetan PATH , JAVA_HOME dan CLASSPATH Program HelloWorld Kompilasi dan menjalankan program Membuat dokumentasi program dengan javadoc Membuat paket program dengan jar Melakukan disassembly kelas java
SET (efeknya sementara sampai window MS-DOS Command prompt ditutup) atau dengan mengesetnya di control panel Windows (efeknya permanen) 1. Set ketiga environment variable tersebut dengan perintah SET sbb : a. Untuk PATH, karena perintah-perintah Java terletak di direktori /bin dari JDK maka kita mengeset PATH sbb: SET path=%path%; C: \Program Files\Java\jdk1.6.0_23\bin b. Untuk JAVA_HOME diset dengan direktori tempat instalasi JDK SET JAVA_HOME=C: \Program Files\Java\jdk1.6.0_23\ c. Untuk CLASSPATH diset dengan direktori tempat kita menaruh source code kita, source kita taruh di direktori D:\src\java : SET CLASSPATH= D:\src\java 2. Set ketiga environment variable tersebut di Control Panel, buka Control Panel->System->Advanced System Setting-> Environment Variables a. Di System Variable pilih path, kemudian edit dan tambahkan di akhir variable value ; C:\Program Files \Java\jdk1.6.0_23\bin b. Di System Variable klik New dan tambahkan Variable Name : JAVA_HOME Variable Value : C:\Program Files\Java\jdk1.6.0_23\ c. Di System Variable klik New dan tambahkan Variable Name : CLASSPATH Variable Value : D:\src\java
package _60200108001; public class HelloWorld { public void sayHello() { System.out.println( "Hello World" ); } public static void main(String args[]) { HelloWorld helloWorld = new HelloWorld(); helloWorld.sayHello(); } }
public class HelloWorld { /** * Method sayHello adalah method yang dipanggil * untuk menuliskan kata Hello World ke layar */ public void sayHello() { System.out.println( "Hello World" ); }
/** * Method main adalah method yang akan dipanggil pertama kali * oleh java launcher */ public static void main(String args[]) { HelloWorld helloWorld = new HelloWorld(); helloWorld.sayHello(); } }
2. Di derektori source code andak , jalankan javadoc dengan perintah : javadoc HelloWorld.java d docs javadoc akan membuat sebuah direktori bernama docs yang berisi dokumentasi source code anda, bukalah direktori docs tersebut dan buka file index.html nya.
Tugas
1. Tambahkan sebuah kelas di HelloWorld.java dengan nama HelloWorldTwo dan tambahkan method sayHelloWorldTwo() di kelas baru tersebut. 2. Tambahkan dokumentasi untuk kelas dan method tersebut. 3. Compile file tersebut. 4. Buat dokumentasi untuk file tersebut dengan javadoc. 5. Paketkan kedua file tersebut kedalam file HelloWorld.jar dan jalankan 6. Disassembly kelas HelloWorldTwo dan simpan hasilnya kedalam sebuah file teks
I. Pokok Bahasan :
1. 2. 3. 4. 5. Perkenalan Eclipse Project dan Perspective dan View Source code, compile, dan run Penamaan identifier dan kata kunci Java Tipe primitif dan Wrapper
Workspace adalah direktori tempat file-file program diletakkan baik itu source code maupun file hasil kompilasi. Masukkan direktori D:\src\java\[nrp] untuk workspace.
Eclipse mendukung banyak jenis project, yang kita lakukan adalah membuat project Java yang standar. Pilih Java Project kemudian klik Next. Isi nama project nya dengan PraktikumDua
Centang Use default location, dan pilih JavaSE-1.6 untuk JRE yang digunakan, klik Next
Di window berikutnya kita dapat menambahkan direktori source baru, mengaitkan dengan project lain atau menambahkan library lain kedalam project. Untuk praktikum ini tidak dibutuhkan pengaturan yang lain, klik Finish.
Perspective eclipse
Eclipse memiliki konsep view dan perspective. View adalah window dalam bentuk tab yang disusun sesuai kebutuhan, masing-masing view menampilkan informasi tertentu, misalnya view console, view package explorer, view task list dsb., kita bisa memunculkan view dengan memilih menu Window->Show View. Kumpulan view ini akan membentuk kesatuan yang disebut perspective. Kita dapat mengganti perspective dari eclipse sesuai dengan kebutuhan kita, eclipse menyediakan beberapa perspective default yang bisa digunakan, u ntuk mengganti perspective pilih Window->Open Perspective.
Isi nama kelas dengan HelloWorld, kemudian klik Finish. Eclipse akan membuka file HelloWorld tersebut, ketikkan program HelloWorld pada praktikum pertama. Setelah selesai, program ini dapat di run dengan memilih menu Run->Run atau dengan menekan tombol Ctrl-F11, dengan melakukan Run, secara otomatis eclipse akan mengkompilasi source code kemudian menjalankannya. Hasil dari kompilasi maupun hasil run dari source code dapat dilihat di view Console yang terletak dibagian bawah eclipse (default).
int $i; int _n; int a; 2. Karakter kedua dan berikutnya dapat berupa angka, huruf, tanda dollar maupun underscore. Menurut konvensi nama variabel sebaiknya berupa kata yang memiliki makna bukan d eretan huruf dan angka yang acak. Contoh : String nama; int angka; 3. Nama variabel tidak boleh sama dengan keyword Java, antara lain :
abstract assert boolean break byte case catch char class const
* ** *** **** * ***
new package private protected public return short static strictfp super
**
switch synchronized this throw throws transient try void volatile while
tidak digunakan ditambahkan sejak 1.2 ditambahkan sejak 1.4 ditambahkan sejak 5.0
4. Jika nama variabel terdiri dari dua kata atau lebih, maka menurut konvensi kata kedua dan kata seterusnya diawali dengan huruf kapital. Contoh : String namaDepan; int angkaPertumbuhanPenduduk ; 5. Jika variabel adalah berupa konstanta, maka menurut konvensi semua karakter adalah huruf kapital dan jika terdiri dari dua kata atau lebih dipisahkan dengan underscore.
Tugas :
Buatlah sebuah kelas bernama Variable di eclipse dan buatlah beberapa jenis variabel seperti yang dijelaskan diatas.
Tabel nilai default tipe data Java Tipe data Default Value (untuk attribut) byte 0
short int long float double char boolean 0 0 0L 0.0f 0.0d '\u0000' false
Literal adalah nilai tetap yang lansung diletakkan di source code tanpa memerlukan komputasi, misalnya literal true dapat dipasangkan di variable bertipe boolean. Contoh :
boolean hasil = true; char kapitalC = 'C'; byte b = 100; short s = 10000; int i = 100000;
Tipe integeral (byte, short, int, dan long) dapat diekspresikan kedalam bentuk desimal, oktal, hexadesimal ataupun biner, dengan menambahkan karakter tertentu dalam bilangan misalnya:
// Angka 26, dalam desimal // Angka 26, dalam oktal tambahkan 0 di depan angka // Angka 26, dalam hexadesimal tambahkan 0 x di // depan angka int binVal = 0b11010; // Angka 26, dalam binary tambahkan 0b di depan angka int decVal = 26; int octVal = 032; int hexVal = 0x1a;
Tipe floating point (float dan double) dapat diekspresikan dengan menambahkan E atau e (untuk notasi sainstifik), f atau F (literal 32-bit floating point), d atau D (literal 64-bit floating point). Contoh :
double d1 = 123.4; double d2 = 1.234e2; // sama dengan d1, tapi dengan notasi sainstifik float f1 = 123.4f;
Tambahkan method main dan buatlah perintah untuk menampilkan nilai-nilai tersebut!
Literal untuk string terdiri dari deretan karakter-karakter Unicode (UTF-16), kita dapat menuliskan lansung karakter-karakter tersebut atau menggunakan Unicode escape. Misalnya '\u0108' untuk huruf C kapital dengan circumflex (tanda payung diatas huruf) . Unicode escape dapat digunakan disemua bagian program java baik literal maupun identifier.
Tipe wrapper adalah tipe pengganti untuk tipe primitif di Java, fungsinya adalah untuk menggantikan tipe primitif dengan tipe yang berupa objek. Masing-masing tipe primitif memiliki tipe wrapper nya misalnya tipe primitif int memiliki wrapper Integer, boolean memiliki wrapper Boolean, dst.
Tugas : Cobalah program ini
public class Main { public static void main(String[] args) throws Exception { Boolean refBoolean = new Boolean(true);
boolean bool = refBoolean.booleanValue(); Byte refByte = new Byte((byte) 123); byte b = refByte.byteValue(); Character refChar = new Character( 'x'); char c = refChar.charValue(); Short refShort = new Short((short) 123); short s = refShort.shortValue(); Integer refInt = new Integer(123); int i = refInt.intValue(); Long refLong = new Long(123L); long l = refLong.longValue(); Float refFloat = new Float(12.3F); float f = refFloat.floatValue(); Double refDouble = new Double(12.3D); double d = refDouble.doubleValue(); } }
I. Pokok Bahasan :
1. Operator assignment, aritmetika, dan unary. 2. Operator perbandingan dan kondisional 3. Operator bitwise dan bitshift
Preseden
Operator assignment atau penugasan adalah operator dengan simbol = yang berfungsi untuk memasukkan nilai operan kanan ke operan kiri. int i =10; double x = 3.4; Operator aritmetika terdiri atas :
+ * / % operator operator operator operator operator penjumlahan operator ( juga untuk concat string ) pengurangan perkalian pembagian modulus
Operator unary adalah operator yang hanya memerlukan satu operan, terdiri dari :
+ ++ -!
Operator unary tambah; menandakan nilai positif (jarang digunakan karena tanpa + secara default angka adalah positif) Operator unary minus; menegasikan ekspresi/angka Operator increment; menambah 1 ke sebuah nilai Operator decrement; mengura ngi 1 ke sebuah nilai Operator komplement lojik; membalik nilai sebuah boolean
Operator increment/decrement dapat diletakkan di awal (prefix) maupun akhir (postfix) dari operan. Operator yang terletak di prefix akan mengevaluasi nilai increment/decrement sedangkan postfix mengevaluasi nilai aslinya.
// // // //
Operator kondisional && dan || berfungsi melakukan operasi AND dan OR terhadap dua ekspresi boolean.
&& || Kondisional AND Kondisional OR
Tugas :
1. Diketahui program :
byte angka = 5; byte angka2 = -5; int hasil = angka++ >> 4 + 5 * 4 | 5 << angka2;
Berdasarkan presedense operator, jelaskanlah program diatas ! 2. Tuliskan pola bit pada masing-masing hasil operasi bitwise pada kelas Bitwise diatas !
I.
Pokok Bahasan :
1. 2. 3. if then else, dan switch while, do while dan for break, continue dan return
Java menyediakan sebuah operator sebagai alternatif dari inf then else yaitu ? : operator ini dikenal juga dengan operator ternary karena memiliki 3 buah operan.
kondisi ? ekspresitrue : ekspresifalse
Switch adalah cara lain untuk mengendalikan alur program, dengan switch kita dapat menentukan lebih dari satu jalur eksekusi. Switch berlaku untuk tipe integral primitif (byte, char, short, int, dan long) dan juga kelas wrapper-nya. Switch juga berlaku untuk tipe enum di Java, enum kita akan bahas di praktikum berikutnya.
Switch mengevaluasi nilai yang diberikan kemudian menentukan case yang akan dieksekusi, case yang sesuai akan dieksekusi dan harus diakhiri dengan break, karena tanpa break case yang berikutnya akan turut dieksekusi sampai semua case dibawahnya habis. Default adalah case yang akan dieksekusi jika tidak ada case yang cocok dengan nilai yang dievaluasi.
While akan mengevaluasi ekspresi (harus mengembalikan nilai boolean), jika ekspresi bernilai true maka statemen di dalam blok while akan dieksekusi dan berulang sampai ekspresi bernilai false.
Java juga memiliki perulangan dengan do while, perbedaannya dengan while adalah, ekspresi diletakkan setelah statemen, dan pengecekan akan dilakukan di akhir iterasi, sehingga statemen pasti dieksekusi minimal satu kali.
do { statemen } while (ekspresi);
Selain do while, Java juga menyediakan perulangan dalam bentuk for, sbb :
for (inisialisasi ; terminasi; penambahan ) { statemen }
Sebelum perulangan for dimulai, ekspresi inisialisasi akan dipanggil satu kali, kemudian perulangan akan dimulai sampai ekspresi terminasi bernilai false. Ekpresi penambahan (increment) akan dipanggil setiap kali perulangan terjadi, kita dapat mengganti penambahan dengan pengurangan (decrement)
for (int i = 10; i > = -3; i--) { System.out.println( "For 2 : " + i); } for (int i = 10,j = 2; i >= -3 & j < 10 ; i --,j++) { System.out.println( "For 3 : " + i + " " + j); } } }
Perulangan for juga berlaku untuk melakukan perulangan dalam koleksi (dibahas di praktikum selanjutnya) dan juga array. Array di Java, sama dengan di bahasa C, dapat di deklarasikan dengan cara sbb:
int[] angka = {1,2,3,4,5,6,7,8,9} ;
Diatas adalah pendeklarasian variabel angka dengan tipe array dari integer dan diinisialisasi lansung dengan angka 1 sampai 9.
if (ketemu) { System.out.println("Ditemukan " + cari + " pada indeks " + i); } else { System.out.println(cari + " tidak terdapat dalam array" ); } } }
Statemen break tanpa label akan menterminasi statemen switch, while, do while, dan for yang terdalam, program akan berlanjut ke statemen yang lebih luar. Misalnya :
Statemen break dengan label dapat digunakan untuk melakukan terminasi kemudian melanjutkan alur program ke statemen lebih luar dengan label tertentu:
if (ketemu) { System.out.println("Ketemu " + cari + " pada indeks " + i + "," + j); } else { System.out.println(cari + " tidak terdapat dalam array" ); } } }
Selain break, Java juga menyediakan statemen continue, yang berfungsi untuk melewati perulangan sekarang pada statemen for, while, dan do while. Statemen continue juga dapat digunakan dengan atau tanpa label, continue tanpa label akan melewati perulangan sekarang dan melanjutkan ke perulangan berikutnya.
Continue juga dapat digunakan dengan label, perulangan akan dilewatkan dan kemudian perulangan dengan label akan dilanjutkan.
while (n-- != 0) { if (kalimat.charAt(j++) != cari.charAt(k++)) { continue test; //lewatkan perulangan while //lanjutkan ke for } } ketemu = true; break test; } System.out.println(ketemu ? "Ketemu" : "Tidak ketemu" ); } }
Statemen return adalah statemen yang berfungsi untuk mengembalikan alur program dari sebuah metode ke bagian program dimana metode tersebut di panggil. Statemen return memiliki dua bentuk yaitu return yang mengembalikan nilai
return 20;
Tugas
Buatlah program untuk menganalisa sebuah string, apakah string tersebut memenihi syarat sebagai sebuah alamat e-mail. Misalnya : afif@uin-alauddin.ac.id dengan ketentuan alamat e-mail sebagai berikut : 1. Harus diawali dengan angka atau huruf. 2. Harus memiliki karakter spesial @ yang memisahkan antara bagian nama dan bagian domain. 3. Bagian nama minimal terdiri dari 5 karakter, dapat berupa huruf, angka, underscore ( _ ) dan titik. 4. Titik dan underscore tidak boleh terletak disamping karakter @ 5. Bagian domain minimal terdiri dari 5 karakter, dapat berupa huruf dan angka, dan memiliki minimal satu buah titik. 6. Harus diakhiri dengan angka atau huruf.
I.
Pokok Bahasan : 1. Kelas dan objek 2. Attribut dan Metode 3. Konstruktor 4. UML
II. Tujuan Praktikum 1. Mengetahui mengenai pendeklarasian kelas dan objek 2. Mengetahui pendeklarasian atrtribut dan metode pada kelas 3. Mengetahui cara kerja konstruktor 4. Mengetahui konsep diagram kelas pada UML.
Objek adalah instan dari sebuah kelas, untuk membuat sebuah objek maka kita perlu mendeklarasikan sebuah variabel dengan tipe kelas tertentu dan menginstansiasinya dengan kelas tersebut.
Orang objekOrang = new Orang();
Diatas kita mendefinisikan varaiabel objekOrang yang bertipe Orang dan menginstansiasinya dengan kelas Orang.
Objek yang diisi dengan null, berarti objek tersebut belum terinstansiasi dan belum memiliki tempat di heap memori. Sehingga objek tersebut belum bisa digunakan. Statemen instanceOf adalah statemen yang berfungsi untuk mengetahui apakah sebuah objek adalah sebuah instan dari kelas tertentu.
Secara sederhana metode dapat di deklarasikan sebagai berikut : <modifier> < return_type> <nama_metode>([argumen]) { [<statemen>] } <modifier> dapat memiliki nilai public, private, protected, static, final, synchronized dan native. <return_type> adalah salah satu dari tipe yang tersedia baik berupa primitif maupun kelas atau bernilai void. <nama_metode> adalah identifier Java dengan penamaan mengikuti konvensi. Sedangkan [argumen] adalah daftar argumen yang dimiliki metode (optional) Isi dari metode berada antara kurung kurawal buka dan tutup. Misalnya :
public static void main(String[] args) { } private int hitung() { } protected String getNama() { } public synchronized void koneksi() { }
Baik attribut maupun metode dari sebuah kelas dapat diakses dengan membuat sebuah variabel dengan tipe kelas tersebut.
public void cetakOrang() { System.out.println( nama + "," + alamat + "," + "," + beratBadan ); } public static void main(String[] args) { Orang objekOrang = new Orang(); objekOrang. nama = "Awaludin" ; objekOrang. alamat = "Makassar" ; objekOrang. tinggiBadan = 170; objekOrang. beratBadan = 60.4f; objekOrang.cetakOrang(); Orang objekOrangDua = new Orang(); objekOrangDua. nama = "Akhirudin " ; objekOrangDua. alamat = "London"; objekOrangDua. tinggiBadan = 150; objekOrangDua. beratBadan = 80.9f; objekOrangDua.cetakOrang(); } }
Attribut dan metode diakses dengan menggunakan titik . setelah masing -masing nama variabel instan. Baik attribut maupun metode dapat diakses menurut aturan modifier nya apakah private, public, maupun protected. Statemen static adalah statemen yang mendeklarasikan sebuah attribut/metode milik kelas bukan milik dari instan dari kelas tersebut. attribut/metode menjadi
Attribut JUMLAH_HEWAN di deklarasikan sebagai static, sehingga attribut ini adalah milik kelas Hewan (bukan milik objek dari Hewan) sehingga untuk mengaksesnya dengan cara nama kelas diikuti . dan nama attribut static. Demikian pula dengan metode tambahHewan yang dideklarasikan static sehingga pemanggilannya dilakukan dengan nama kelas diikuti . dan nama metode static. Nilai attribut static akan sama untuk setiap objek dari sebuah kelas, karena static adalah milik kelas bukan objek. Argumen pada metode dapat berupa primitif maupun objek, baik primitif maupun objek akan di passing by value. Akan tetapi pada argumen bertipe objek, nilai attribut dapat diu bah (jika dapat diakses) dan nilainya akan tetap setelah pemanggilan metode.
public class Argumen { public static void passingPrimitif( int i) { i = 5; } public static void passingObject(Titik t) { t.x = 4; t.y = 5; }
public static void main(String args[]) { int i = 5; passingPrimitif (i); System.out.println(i); Titik t = new Titik(); passingObject (t); System.out.println(t. x + " " + t.y); } } class Titik { public int x; public int y; public Titik() { x = 0; y = 0; } }
Argumen juga dapat berupa array, selain itu Java juga mendukung argumen dengan jumlah sembarang.
Sebuah metode dapat memiliki nama yang sama dengan metode lain, dengan syarat daftar argumen nya tidak boleh sama.
public void tanam(int jumlah) { System.out.println( "Tanam 3"); } public void tanam(long jumlah) { System.out.println( "Tanam 4"); }
public String tanam(String nama, int jumlah) { return "Tanam 5"; } public static void main(String args[]) { Tumbuhan tumbuhan = new Tumbuhan(); tumbuhan.tanam(); tumbuhan.tanam( "Sayur"); tumbuhan.tanam(4); tumbuhan.tanam(5l); System.out.println(tumbuhan.tanam( "Sayur", 5)); } }
Metode akan dipanggil sesuai dengan argumen yang diberikan, sehingga meskipun memiliki nama yang sama, metode yang dipanggil akan berbeda. Ini disebut dengan method overloading.
Kegiatan 3 Konstruktor
Konstruktor adalah metode khusus yang dimiliki oleh setiap objek baik secara eksplisit maupun implisit. Konstruktor sebuah kelas akan dipanggil setiap objek diinstansiasi. Konstruktor biasanya berisi instruksi-instruksi untuk menginisialisasi attribut-attribut dengan nilai tertentu, dan menginisalisasi hal-hal yang lain sebelum objek siap digunakan. Deklarasi konstruktor sama dengan deklarasi metode, tapi tanpa return value dan nama nya harus sama dengan nama kelas. Seperti halnya meotde konstruktor jg dapat dioverloading. Modifier konstruktor hanya boleh public, private dan protected.
public static void main(String args[]) { Tumbuhan tumbuhan = new Tumbuhan(); tumbuhan.cetakTumbuhan(); tumbuhan = new Tumbuhan("Buah",20); tumbuhan.cetakTumbuhan(); } }
Konstruktor akan dipanggil sesuai dengan argumen yang diberikan saat objek diinstansiasi. Konstruktor tanpa argumen disebut juga konstruktor default. Jika tidak ada konstruktor secara implisit di deklarasikan dalam sebuah kelas, maka kompiler akan men -generate konstruktor default untuk kelas tersebut.
Kegiatan 4 UML
UML adalah kakas yang digunakan untuk memodelkan sistem terutama sistem berorientasi-objek. UML memiliki banyak jenis diagram yang digunakan untuk menggambarkan sistem. Salah satu diagram yang paling umum digunakan adalah diagram kelas. Contoh diagram kelas adalah sebagai berikut :
Tanda minus - di depan attribut maupunmetode menandakan bahwa attribut/metode tersebut bersivat private, sedangkan plus + berti public. Garis bawah pada attribut/metode menandakan kalau attribut/metode tersebut adalah static. Dari diagram kelas diatas dapat diimplementasikan menjadi program sebagai berikut :
public class Orang { private String nama; private String alamat; public Orang() { } public String getNama() { return nama; }
public void setNama(String str) { nama = str; } public String getAlamat() { return alamat; } public void setAlamat(String str) { alamat = str; } }
Tugas
Implementasikan diagram kelas diatas beserta attribut dan metode-nya kedalam program Java !
I.
Pokok Bahasan :
1. Package dan import 2. Inheritance 3. Polymorphism
Untuk membuat paket, klik kanan pada direktori source dalam project, kemudian pilih paket.
Masukkan nama paket yang diinginkan, jika paket yang dibuat terdiri dari dua level atau lebih, pisahkan masing-masing level dengan tanda titik . Buatlah kelas pada paket tersebut, secara otomatis eclipse akan menambahkan sintaks package sebagai berikut :
Setiap paket yang dideklarasikan di project aka dibuatkan sebuah folder, periksalah folder workspace anda, kemudian buka project lanjutkan dengan membuka folder source project tersebut, di folder itu akan terdapat folder-folder sesuai dengan paket yang di deklarasikan di eclipse. Dengan menggunakan konsep paket maka, kelas-kelas dapat di organisasikan lebih rapih dan terhirarki. Kita dapat menggunakan kelas-kelas yang telah ada dengan menyebutkan nama paket kelas tersebut diikuti dengan nama kelasnya ini disebut dengan FQN (Fully Qualified Name) atau dengan melakukan import kelas tersebut kedalam kelas yang di buat. Jika kelas yang kita gunakan terletak di paket yang sama dengan kelas yang dibuat maka kelas tersebut tidak perlu di import dan tidak perlu disebutkan FQN nya, cukup nama kelasnya saja. Kelas yang memiliki modifier public dapat diakses oleh kelas lain di luar paketnya, sedangkan kelas yang tidak memiliki modifier hanya bisa diakses di paket yang sama.
package praktikum.enam; public class Rangka { private Ban ban; public Rangka() { ban = new Ban(); //karena Ban dan Rangka terletak dalam satu // paket maka cukup menyebutkan nama kelasnya. System.out.println( "Konstruktor Rangka" ); } } class Ban { //Karena Ban tidak memiliki modifier maka Ban hanya dapat //diakses dari dalam paket praktikum.enam public Ban() { System.out.println( "Konstruktor Ban" ); } } package praktikum.enam.utama; import praktikum.enam.Rangka; //karena Rangka tidak satu paket dengan //Mobil maka harus dilakukan import public class Mobil { private Rangka rangka;
private praktikum.enam.Mesin mesin; //karena Mesin tidak satu paket //dengan Mobil dan tidak dilakukan //import maka FQN -nya harus disebutkan public Mobil() { rangka = new Rangka(); mesin = new praktikum.enam.Mesin(); } public static void main(String args[]) { new Mobil(); } }
Java menyediakan ribuan kelas API yang siap digunakan yang memiliki fungsi masing-masing, misalnya untuk GUI, networking, database dll. Kita tinggal menggunakan kelas-kelas tersebut dengan melakukan import. Misalnya :
import java.util.Date; import java.sql.DriverManager; import java.io.BufferedInputStream;
Kita juga dapat melakukan import semua kelas dalam satu paket menggunakan *
import java.util. *; import java.sql.*; import java.io.*;
Kegiatan 2 Inheritence
package praktikum.enam.utama; import praktikum.enam.Rangka; public class Mobil { public Rangka rangka; public praktikum.enam.Mesin mesin; private int nomer; protected String nama;
public Mobil() { rangka = new Rangka(); mesin = new praktikum.enam.Mesin(); System.out.println( "Konstruktor Mobil" ); } public void stater() { System.out.println( "Stater mobil" ); } }
package praktikum.enam.mobil; import praktikum.enam.Mesin; import praktikum.enam.Rangka; import praktikum.enam.utama.Mobil; public class Truk extends Mobil { public Truk() { } public void tongkang() { //attribut mesin dan metode starter dikenali karena metode //dan attribut ini ada di kelas Mobil yang merupakan kelas //induk dari Truk dan keduanya adalah public mesin = new Mesin(); stater(); //nama dikenali di Truk karena nama ada di kelas Mobil dan //modifier -nya protected nama = "Truk"; //nomer tidak dikenali di Truk karena modifier -nya private System.out.println( "Tongkang" ); }
public static void main(String args[]) { Truk truk = new Truk(); truk.tongkang(); } }
Saat kelas turunan di instansiasi secara otomatis konstruktor dari kelas induk akan ikut dipanggil, perhatikan output dari program diatas, konstruktor Mobil akan dipanggil sebelum konstruktor Truk. Kita dapat secara eksplisit memnaggil konstruktor dari kelas induk dengan menggunakan statemen super, statemen super menandakan kita merujuk ke metode atau attribut milik kelas induk, kita juga bisa menggunakan statemen this untuk merujuk ke metode atau attribut milik kelas itu sendiri.
public Mobil(String nama) { //statemen this menunjuk ke attribut kelas Mobil itu sendiri //yaitu 'nama' this.nama=nama; }
public static void main(String args[]) { Sedan sedan = new Sedan(); sedan.cetak( "Sedan"); } }
Di Java, kelas yang memiliki modifier final tidak dapat lagi di turunkan oleh kelas lain. Coba tambahkan statemen final di kelas Mobil dan lihat hasilnya. Java hanya mengijinkan single inheritance, artinya satu kelas hanya boleh mewarisi satu kelas yang lain, sehingga setelah statemen extends hanya boleh diikuti oleh satu nama kelas.
Kegiatan 3 Polymorphism
Salah satu keunggulan utama dari pemrograman berorientasi objek adalah polymorphism. Dengan polymorphism kita bisa memperlakukan sebuah objek turunan sama dengan objek induknya, sehingga kita bisa membuat sebuah metode yang generik untuk semua kelas turunan dengan menggunakan kelas induknya, ini dimungkinkan oleh teknik yang dimiliki Java yaitu upcasting. Misalnya :
Mobil mobil = new Sedan(); Sedan sedan = mobil; //error Sedan sedan = (Sedan) mobil;
Karena Sedan adalah turunan dari Mobil maka kita dapat menginstansiasi sebuah objek Mobil dengan kelas Sedan, meskipun tipe nya adalah Mobil, kita tidak dapat memanggil metode yang ada di kelas sedan di objek bertipe Mobil. Baris kedua kode diatas akan dianggap error oleh kompiletor karena kompilator memiliki informasi bahwa objek mobil adalah bertipe Sedan (late binding). Karena itu diperlukan casting secara manual seperti pada baris ketiga, casting manual akan menjamin bahwa mobil memiliki tipe Sedan, sehingga kompilator akan menganggapnya benar. Efek polymorphisme lebih bisa dilihat dengan melakukan overloading metode. Overloading metode adalah membuat metode di kelas anak dengan signature (nama, argumen dan return value) yang sama dengan metode di kelas induk, dan mengganti isi dari metode tersebut sesuai dengan kebutuhan spesifik kelas anak.
import praktikum.enam.mobil.Truk; public class MobilTest { //metode dengan argumen bertipe Mobil, semua kelas turunan //dari kelas mobil dapat dilewatkan di argumen metode ini public static void staterMobil(Mobil mobil) { //memanggil metode stater, metode stater yang dipanggil //tergantung tipe objek yang diberikan di argumen mobil.stater(); } public static void main(String[] args) { Mobil sedan = new Sedan(); Truk truk = new Truk(); //memanggil metode staterMobil dengan //metode stater yang dipanggil adalah staterMobil (new Mobil()); //memanggil metode staterMobil dengan //metode stater yang dipanggil adalah staterMobil (sedan); //memanggil metode staterMobil dengan //metode stater yang dipanggil adalah staterMobil (truk); } }
argumen objek Mobil, stater di kelas Mobil argumen objek Sedan stater di kelas Sedan argumen objek Truk stater di kelas Truk
Java menggunakan teknik late binding untuk membanding sebuah metode dengan kelas tertentu, sehingga kompilator belum mengetahui metode stater() dari kelas yang mana yang harus dipanggil apakah kelas induk atau kelas anaknya. Metode akan di binding pada saat run -time oleh JVM. Kita dapat mencegah late binding dengan membuat sebuah metode menjadi final atau private (tambahkan statemen final atau private diawal metode). Metode yang final dan private tidak mungkin di overriding di kelas anak, sehingga metode ini akan di binding pada saat compile time.
Tugas
Buatlah struktur kelas seperti struktur Mobil. Dengan petunjuk sbb: a. Tambahkan metode di kelas induk, dan lakukan overriding metode di kelas anaknya. b. Buatlah minimal 3 kelas anak. c. Buat sebuah metode seperti staterMobil() untuk mencoba efek polymorphisme kela yang s kalian buat.