UNIVLkSI1AS ISLAM MAkASSAk kCGkAM S1UDI 1LkNIk INICkMA1IkA IAkUL1AS 1LkNIk
INSTALASI J2SDK & SETTING PATH
Download distribusi J2SDK terbaru dari http://java.sun.com/j2se/1.4.2/install-windows.html. Di gambar ini J2SDK versi 1.4.2.19 telah berada pada folder D:\Software\Misc. Lakukan double-click & akan muncul Window seperti gambar di bawah Klik tombol Next dan biarkan hingga instalasi selesai Seluruh command file java secara otomatis akan berada pada folder C:\j2sdk1.4.2_19\bin Untuk Setting Path, klik kanan icon My Computer Properties Kemudian klik Menu Advanced system setting Pada Window System Properties, pilih tombol Environment Variables Tempatkan kursor pada variable PATH dan klik tombol Edit Kembali ke Windows Explorer, klik kanan address bar pada posisi folder C:\j2sdk1.4.2_19\bin dan lakukan proses copy Kemudian kembali ke Window Environment Variables, pada Window Edit User Variable salin/paste path C:\j2sdk1.4.2_19\bin, kemudian klik OK Untuk mencoba apakah Setting Path sudah berhasil, buka Command Prompt dari Run Cmd, masuk ke dalam salah satu folder di drive manapun & ketikkan perintah Javac, jika Setting Path berhasil, akan ada tampilan seperti gambar di samping Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 1 Pengenalan Bahasa Pemrograman Java Java adalah bahasa pemrograman berorientasi objek murni yang dibuat berdasarkan kemampuan-kemampuan terbaik bahasa pemrograman objek sebelumnya (C++, Ada, Simula). Java diciptakan oleh James Gosling, developer dari Sun Microsystems pada tahun 1991. Karakteristik Java antara lain : - Sederhana (Simple) - Berorientasi Objek (Object Oriented) - Terdistribusi (Distributed) - Interpreted - Robust - Aman (Secure) - Architecture Neutral - Portable - Performance - Multithreaded - Dinamis Macam-macam Java 2 Software Developer Kit (J2SDK) antara lain : - J2SE (Java 2 Standard Edition) - J2EE (Java 2 Enterprise Edition) - J2ME (Java 2 Micro Edition) Cara kerja Java dapat digambarkan sebagai berikut : Java mempunyai platform yaitu : - Java Virtual Machine (Java VM) - Java Application Programming Interface (Java API) Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 2 Aplikasi-aplikasi java antara lain : - Stand alone - Applets - Aplikasi berbasis Windows (GUI) - Java Servlet - Java Server Pages (JSP) - Java Beans dan Enterprise Java Beans - Java Micro Edition - Penulisan program: o Menulis program Struktur program java yaitu : Komentar program Deklarasi package dan import class NamaKelas { <pernyataan> } // Kelas pertama class NamaKelasLain { <pernyataan> } // Kelas lainnya Program Java (.java) Dapat ditulis dalam satu file .java: Berisi satu kelas Berisi beberapa kelas Ditulis dalam beberapa file .java: Satu file satu kelas Satu file banyak kelas Hanya boleh ada satu fungsi utama pada setiap program objek. o Kompilasi javac <namafile.java> Contoh: javac HelloWorld.java o Eksekusi java <namafile hasil kompilasi> [<argumen baris perintah>] Contoh: java HelloWorld Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 3 Contoh Program 1 (HelloWorld.java) yaitu : /** * Program Java untuk menuliskan kata Hello, world! * HelloWorld.java */ // Deklarasi kelas class HelloWorld { // Deklarasi fungsi yang mewakili program utama public static void main(String args[]) { System.out.println("Hello, world!"); } } Output Program Kata Kunci Simpanan (Keywords) Kata kunci simpanan adalah identifier khusus yang disimpan oleh bahasa Java untuk mengendalikan bagaimana program didefinisikan. Kata kunci ini digunakan untuk mengenali tipe-tipe, pengubah, dan mekanisme pengaturan aliran program. Kata kunci ini hanya dapat digunakan untuk fungsi tertentu dan tidak dapat digunakan sebagai identifier nama suatu variabel, class dan method. Sampai denga Versi 1.0 terdapat 59 kata kunci seperti terlihat dalam tabel : abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if impleme nts import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while Identifier digunakan untuk nama class, method, dan variabel. Suatu variabel dapat berupa urutan tertentu huruf (besar atau kecil), angka, garis bawah, dan tanda dolar. Tidak boleh diawali oleh angka dan bersifat case sensitive. Kelompok Java mengikuti aturan penamaan identifier untuk semua method public dan variabel instans dengan huruf awal kecil dan menandai bagian kata selanjutnya dengan huruf besar, misalnya nextItem, currentValue, getTimeOfDay. Untuk variabel provate dan lokal identifier akan berupa huruf kecil semua dikombinasikan dengan garis bawah, misalnya next_val, temp_val. Untuk variabel final yang mewakili suatu konstanta, digunakan huruf besar semua, misalnya TOK_BRACE, DAY_FRIDAY. Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 4 Literal Besaran konstanta pada Java dihasilkan dengan menggunakan literal yang mewakilinya. Setiap literal merepresentasikan nilai suatu tipe, dimana tipe itu sendiri menjelaskan bagaimana sifat nilai tersebut dan bagaimana penyimpanannya. Tipe Data Java merupakan contoh bahasa yang strongly typed language. Hal ini berarti bahwa setiap variabel harus memiliki tipe yang sudah dideklarasikan. Terdapat 8 tipe primitif, 6 diantaranya adalah tipe bilangan ( 4 tipe integer, 2 tipe floating point), 1 tipe karakter char, digunakan mengawa-sandi (encode) Unicode, dan 1 tipe boolean. Integer Tipe Tempat yang Diperlukan Jangkauan (inclusive) int 4 byte - 2.147.483.648 sampai 2.147.483.647 (hanya lebih dari 2 miliar) short 2 byte - 32.768 sampai 32.767 long 8 byte - 9.223.372.036.854.775.808L sampai 9.223.372.036.854.775.807L byte 1 byte - 128 sampai 127 Floating Point Tipe Tempat Yang Dibutuhkan Jangkauan float 4 byte secara kasar 3,40282347E+38F ( 7 digit desimal signifikan) double 8 byte secara kasar 1,79769313486231570E+308 (15 digit desimal siignifikan) Char Tipe char menggunakan tanda kutip tunggal untuk menyatakan suatu char. Tipe char juga menyatakan karakter dalam upaya mengawal-sandi unicode, yang merupakan kode 2-byte. Karakter unicode paling sering dinyatakan dalam istilah skema pengkodean hexadesimal yang dimulai dari \u0000 sampai \uFFFF. Selain karakter bebas (escape \u yang menyatakan karakter unicode di Java terdapat juga \b backspace \u0008 \t tab \u0009 \n linefeed \u000a \r carriage return \u000d \ double quote \u0022 \ single quote \u0027 \\ a backslash \u005c Boolean Tipe boolean memiliki nilai true dan false. Tipe ini digunakan untul logical testing dengan menggunakan operator relasional. Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 5 Java Applet Applet berjalan pada Browser atau pada halaman WEB menggunakan HTML Java Applet adalah sebuah class yang dapat diaktifkan pada Web Browser seperti Internet explorer. Java Applet dienkapsulasi sebagai bagian dari HTML Langkah-langkah membuat applet. 1.Membuat sebuah class Applet. 2.Membuat dokumen html yang berasosiasi dengan class Applet yang telah dibuat pada langkah pertama. Template untuk applet import java.applet.Applet; import jawa.awt.*; public class AppletTemplate extends Applet { // deklarasi variabel. public void init() { // inisialisasi variabel, image loading, dll. } public void paint(Graphics g) { // drawing operations. } } Template untuk html <HTML> <HEAD> <TITLE> Template untuk loading applet</TITLE> </HEAD> <BODY> <H1> Sebuah template untuk loading applet </H1> <P> <APPLET CODE= AppletTemplate.class WIDTH=120 HEIGHT=60> <B> Error! Anda harus mengkatifkan Java-enabled browser.</B> </APPLET> </BODY> </HTML> Pemrog. Berorientasi Objek **, Pertemuan Ke-1 Noviyanto, ST Halaman 6 Contoh Program Applet import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } } Kompilasi di Command Line Prompt M:\gundar\PBO\OOP\Applet>javac HelloWorld.java Contoh HTML Applet dari program diatas: <html> <head> <title>HelloWorld Applet </title> </head> <body> <applet code="HelloWorld.class" height="50" width="345"> </applet> </body> </html> Output: Pada contoh HTML Applet dari program diatas Kode program: <applet code="HelloWorld.class" height="50" width="345"> </applet> Applet dibuat dengan lebar 345 pixels dan tinggi 50 pixels Pada contoh Program Applet diatas Method drawString menggambar string Hello world pada posisi pixel(50,25) g.drawString("Hello world!", 50, 25); Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 1 Struktur Kontrol Struktur Kontrol Keputusan Struktur kontrol keputusan adalah statement dari Java yang mengijinkan user untuk memilih dan mengeksekusi blok kode dan mengabaikan blok kode yang lain. 1. Statement if Statement-if menentukan sebuah statement (atau blok kode) yang akan dieksekusi jika dan hanya jika persyaratan boolean (boolean statement) bernilai true. Bentuk dari statement if, if( boolean_expression ) statement; atau if( boolean_expression ){ statement1; statement2; . . . } Gambar 1: Flowchart Statement If dimana, boolean_expression adalah sebuah persyaratan boolean (boolean statement) atau boolean variabel. Berikut ini adalah contoh code statement if, int grade = 68; if( grade > 60 ) System.out.println("Congratulations!"); atau int grade = 68; if( grade > 60 ){ System.out.println("Congratulations!"); System.out.println("You passed!"); } Statement if-else Statement if-else digunakan apabila kita ingin mengeksekusi sebuah statement dengan kondisi true dan statement yang lain dengan kondisi false. Bentuk statement if-else, if( boolean_expression ) statement; else statement; Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 2 dapat juga ditulis seperti, if( boolean_expression ){ statement1; statement2; . . . } else{ statement1; statement2; . . . } Berikut ini contoh code statement if-else, int grade = 68; if( grade > 60 ) System.out.println("Congratulations!"); else System.out.println("Sorry you failed"); atau int grade = 68; if( grade > 60 ){ System.out.println("Congratulations!"); System.out.println("You passed!"); } else{ System.out.println("Sorry you failed"); } Gambar 2: Flowchart Statement If-Else 2. Statement switch Cara lain untuk membuat percabangan adalah dengan menggunakan kata kunci switch. Dengan menggunakan switch kita bisa melakukan percabangan dengan persyaratan yang beragam. Bentuk statement switch, switch( switch_expression ){ case case_selector1: statement1; // statement2; //block 1 . . . // break; case case_selector2: statement1; // statement2; //block 2 . . . // Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 3 break; . . . default: statement1; // statement2; //block n . . . // break; } dimana, switch_expression adalah persyaratan integer atau character dan case_selector1, case_selector2 dan seterusnya adalah konstanta nilai integer yang unique (unik). Ketika statement switch ditemukan, pertama kali Java memeriksa switch_expression, dan meloncat ke case dan mencocokkan nilai yang sama dengan persyaratannya. Program mengeksekusi statement dari awal sampai menemui statement break, dan melewati statement yang lain sampai akhir struktur switch. Jika tidak ditemui case yang cocok, maka program akan mengeksekusi blok default. Bisa anda catat bahwa blok default adalah optional. Sebuah statement switch bisa tidak memiliki blok default. CATATAN: Tidak seperti statement if, pada struktur switch statement dieksekusi tanpa memerlukan tanda kurung kurawal ({}). Ketika sebuah case pada statement switch menemui kecocokan, semua statement pada case tersebut akan dieksekusi. Tidak hanya demikian, statement lain yang berada pada case yang cocok juga dieksekusi. Untuk menghindari program mengeksekusi statement pada case berikutnya, kita menggunakan statement break sebagai statement akhir. Gambar 4: Flowchart Statement Switch Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 4 Contoh statement switch public class Grade { public static void main( String[] args ) { int grade = 92; switch(grade){ case 100: System.out.println( "Excellent!" ); break; case 90: System.out.println("Good job!" ); break; case 80: System.out.println("Study harder!" ); break; default: System.out.println("Sorry, you failed."); } } } Struktur Kontrol Perulangan Struktur kontrol pengulangan adalah statement dari Java dimana kita bisa mengeksekusi blok code berulang-ulang dalam kurun nilai tertentu. Ada tiga macam jenis struktur kontrol pengulangan yaitu while, do-while, dan for-loops. 1. while loop Statement while loop adalah statement atau blok statement yang diulang-ulang sampai mencapai kondisi yang cocok. Bentuk statement while, while( boolean_expression ){ statement1; statement2; . . . } Statement di dalam while loop akan dieksekusi berulang-ulang selama boolean_expression bernilai true. Contoh, pada code dibawah ini, int i = 4; while ( i > 0 ){ System.out.print(i); i--; } Contoh diatas akan mencetak angka 4321 pada layar. Perlu dicatat jika bagian i--; dihilangkan, akan menghasilkan looping yang tidak berhenti (infinite loop). Sehingga, ketika menggunakan while loop atau bentuk pengulangan yang lain, pastikan Anda memberikan statement yang membuat pengulangan berhenti pada suatu titik. Berikut ini adalah beberapa contoh while loop, Contoh 1: int x = 0; while (x<10) { System.out.println(x); x++; } Contoh 2: //infinite loop while(true) System.out.println( hello ); Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 5 Contoh 3: //no loops // statement is not even executed while (false) System.out.println( hello ); 2. do-while loop Do-while loop mirip dengan while-loop. Statement di dalam do-while loop akan dieksekusi beberapa kali selama kondisi bernilai true. Perbedaan antara while dan do-while loop adalah dimana statement di dalam do-while loop dieksekusi sedikitnya satu kali. Bentuk statement do-while, do{ statement1; statement2; . . . }while( boolean_expression ); Statement di dalam do-while loop akan dieksekusi pertama kali, dan dilakukan pengecekan kondisi dari boolean_expression. Jika nilai tersebut belum mencapai nilai yang diinginkan, statement akan dieksekusi lagi. Berikut ini beberapa contoh do-while loop: Contoh 1: int x = 0; do { System.out.println(x); x++; }while (x<10); Contoh ini akan memberikan output 0123456789 pada layar. Contoh 2: //infinite loop do{ System.out.println( hello ); } while (true); Contoh di atas akan melakukan pengulangan yang tidak berhenti untuk menulis hello pada layar. Contoh 3: //one loop // statement is executed once do System.out.println( hello ); while (false); Contoh di atas akan memberikan output hello pada layar. 3. for loop Seperti pada struktur pengulangan sebelumnya yaitu melakukan pengulangan eksekusi code beberapa kali. Bentuk dari for loop, for (InitializationExpression; LoopCondition; StepExpression){ statement1; statement2; . . . } Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 6 dimana, InitializationExpression inisialisasi dari variabel loop. LoopCondition - membandingkan variabel loop pada nilai batas. StepExpression - melakukan update pada variabel loop. Berikut ini adalah contoh dari for loop, int i; for( i = 0; i < 10; i++ ){ System.out.print(i); } Pada contoh ini, statement i=0 merupakan inisialisasi dari variabel. Selanjutnya, kondisi i<10 diperiksa. Jika kondisi bernilai true, statement di dalam for loop dieksekusi. Kemudian, statement i++ dieksekusi, dan dilakukan pengecekan kondisi. Kondisi ini akan dilakukan berulang-ulang sampai mencapai nilai yang salah (false). Contoh tadi, adalah contoh yang sama dari while loop, int i = 0; while( i < 10 ){ System.out.print(i); i++; } break statement Statement break memiliki dua bentuk: unlabeled dan labeled. o Unlabeled break statement Unlabeled menghentikan jalannya statement switch. Anda bisa juga menggunakan bentuk unlabeled untuk menghentikan for, while atau do-while loop. Contohnya, String names[] = {"Beah", "Bianca", "Lance", "Belle", "Nico", "Yza", "Gem", "Ethan"}; String searchName = "Yza"; boolean foundName = false; for( int i=0; i< names.length; i++ ){ if( names[i].equals( searchName )){ foundName = true; break; } } if( foundName ){ System.out.println( searchName + " found!" ); } else{ System.out.println( searchName + " not found." ); } Pada contoh ini, jika string Yza ditemukan, pengulangan pada for loop akan dihentikan dan akan melanjutkan ke proses berikutnya. Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 7 o Labeled break statement Bentuk labeled form dari statement break akan menghentikan statement luar, dimana diidentifikasikan berupa label pada statement break. Program berikut ini akan mencari nilai dalam array dua dimensi. Terdapat dua pengulangan bersarang (nested loop). Ketika sebuah nilai ditemukan, labeled break akan menghentikan statement yang diberi label searchLabel, dimana label ini berada di luar. int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int searchNum = 5; boolean foundNum = false; searchLabel: for( int i=0; i<numbers.length; i++ ){ for( int j=0; j<numbers[i].length; j++ ){ if( searchNum == numbers[i][j] ){ foundNum = true; break searchLabel; } } } if( foundNum ){ System.out.println( searchNum + " found!" ); } else{ System.out.println( searchNum + " not found!" ); } Statement break menghentikan sementera labeled statement; ia tidak lagi menjalankan flow control pada label. Flow control pada label akan di-transfer secara otomatis mengikuti labeled statement. Continue statement Statement continue memiliki dua bentuk: unlabeled dan labeled. Anda dapat menggunakan statement continue untuk melewati pengulangan dari for, while, atau do-while loop yang sedang berjalan. o Unlabeled continue statement Bentuk unlabeled akan melewati akhir statement pada bagian yang dalam dan memeriksa boolean expression yang mengkontrol loop, pada dasarnya akan melewati bagian pengulangan pada loop. Berikut ini adalah contoh dari penghitungan angka dari Beah dalam suatu array. String names[] = {"Beah", "Bianca", "Lance", "Beah"}; int count = 0; for( int i=0; i<names.length; i++ ){ if( !names[i].equals("Beah") ){ continue; //skip next statement } count++; } System.out.println("There are " + count + " Beahs in the list"); Pemrog. Berorientasi Objek **, Pertemuan Ke-2 Noviyanto, ST Halaman 8 o Labeled continue statement Bentuk labeled akan melanjutkan sebuah statement dengan melewati pengulangan yang sedang berjalan dari loop terluar yang diberi label (tanda). outerLoop: for( int i=0; i<5; i++ ){ for( int j=0; j<5; j++ ){ System.out.println("Inside for(j) loop"); //message1 if( j == 2 ) continue outerLoop; } System.out.println("Inside for(i) loop"); //message2 } Pada contoh ini, pesan ke-2 tidak dicetak, karena statement continue akan melewati pengulangan yang sedang berjalan. Return statement Statement return digunakan untuk keluar dari sebuah fungsi (method). Statement return memiliki dua bentuk: menggunakan sebuah nilai, dan tidak memberikan nilai. Untuk memberikan sebuah nilai, cukup berikan nilai (atau ekspresi yang menghasilkan sebuah nilai) sesudah return. Contohnya, return ++count; atau return "Hello"; Tipe data dari nilai yang diberikan harus sama dengan tipe dari fungsi yang dideklarasikan. Ketika sebuah method void dideklariskan, gunakan bentuk return yang tidak memberikan nilai. Contohnya, return; Pemrog. Berorientasi Objek **, Pertemuan Ke-3 Noviyanto, ST Halaman 1 Pengertian dari Class, Object, dan Method Class merupakan suatu blueprint atau cetakan untuk menciptakan suatu instant dari object. class juga merupakan grup suatu object dengan kemiripan attributes/properties, behaviour dan relasi ke object lain. Contoh : Class Person, Vehicle, Tree, Fruit dan lain-lain. Object adalah instance dari class. Jika class secara umum merepresentasikan (template) sebuah object, sebuah instance adalah representasi nyata dari class itu sendiri. Contoh : Dari class Fruit kita dapat membuat object Mangga, Pisang, Apel dan lain- lain. Membuat object Untuk membuat object, kita menggunakan perintah new dengan sebuah nama class yang akan dibuat sebagai instance dari class tersebut. String str = new String(); Random r = new Random(); Pegawai p2 = new PEgawai(); Date hari = new Date(); hari adalah object reference dari class Date yang akan digunakan untuk mengakses class Date. Sedangkan operator new adalah operator yang akan menghasilkan hari sebagai reference ke instance dari class Date(). Attributes merupakan nilai data yang terdapat pada suatu object yang berasal dari class. Attributes merepresentasikan karakteristik dari suatu object. Contoh : pada Class Fruit terdapat attribute : warna, berat pada object mangga : warna berisi kuning dan berat misalkan 0.25 kg pada object apel : warna berisi merah dan berat misalkan 0.30 kg Method merupakan suatu operasi berupa fungsi-fungsi yang dapat dikerjakan oleh suatu object. Method didefinisikan pada class akan tetapi dipanggil melalui object. Contoh : pada object mangga : terdapat method ambilRasa , kupasKulit dan lain-lain. Pemrog. Berorientasi Objek **, Pertemuan Ke-3 Noviyanto, ST Halaman 2 METHOD Metode menentukan perilaku objek, yakni apa yang terjadi ketika objek itu dibuat serta berbagai operasi yang dapat dilakukan objek sepanjang hidupnya. Metode memiliki 4 (empat) bagian dasar : 1. Nama metode 2. Tipe Objek atau tipe primitive yang dikembalikan metode. 3. Daftar parameter. 4. Badan atau isi metode. Tiga bagian pertama mengindikasikan informasi penting tentang metode itu sendiri. Dengan kata lain, nama metode tersebut=metode lain dalam program. Dalam java kita dapat memiliki metode-metode berbeda yang memiliki nama sama tetapi berbeda tipe kembalian atau daftar argumennya, sehingga bagian-bagian definisi metode ini menjadi penting. Ini disebut overloading metode. Untuk menjalankan program yang memiliki sifat polymorphism tersebut, diperlukan suatu kemampuan overloading, yaitu suatu kemampuan untuk menentukan fungsi yang mana yang harus digunakan atau dijalankan jika terdapat nama fungsi yang sama. Polimorfisme bisa diartikan seperti kemampuan suatu variable untuk mengubah perangai sesuai dengan objek hasil instansiasi yang digunakan. Polimorfisme membiarkan lebih dari 1 objek dari sub class sub class dan diperlakukan sebagai objek dari super class tunggal Contoh: Mahasiswa cowok = new anakSI(); cowok.methodKU( Bernaz ); Mahasiswa cewek = new anakTI(); cewek.mothodKU( Amelia ); Outputnya: Methodku dengan parameter dengan nilai Bernaz di class anakSI telah dipanggil Methodku dengan parameter dengan nilai Amelia di class anakTI telah dipanggil Pemrog. Berorientasi Objek **, Pertemuan Ke-3 Noviyanto, ST Halaman 3 Contoh Program: class buku { String pengarang; String judul; void isi (String isi1,String isi2) { judul = isi1; pengarang = isi2; } void cetak() { if (judul==null&&pengarang==null)return; System.out.println("judul=" +judul +"pengarang=" +pengarang); } } class karangan { public static void main(String[]args) { buku a,b,c,d; a=b=c=d=new buku(); a.isi ("pengarang pascal", "yogiyanto"); a.cetak(); b.isi ("pengarang java", "asep hermanto"); b.cetak(); c.isi ("pengarang web", "johan prasutyo"); c.cetak(); d.isi ("pengarang c++", "adbul kadil"); } } Output Pemrog. Berorientasi Objek **, Pertemuan Ke-4 Noviyanto, ST Halaman 1 Array Pengantar Program yang cukup kompleks membutuhkan variabel dalam jumlah besar. Kita mungkin saja mendeklarasikan variabel-variabel tersebut satu per satu. Andaikan sebuah program membutuhkan 5 (lima) variabel bertipe int, kita bisa saja mendeklarasikan kelima variabel tersebut dengan cara biasa: int a, b, c, d, e; Persoalan akan timbul jika kita membutuhkan variabel dalam jumlah cukup besar, 100 misalnya. Bagaimana kita mendeklarasikan seluruh variabel tersebut: apakah dengan cara mengetik satu persatu atau melakukan trik copy-and-paste Manapun cara yang anda tempuh, cara tersebut akan menghabiskan waktu cukup banyak. Selain masalah waktu, kita juga akan menemui masalah sulitnya mencari nama yang benar-benar unik. Ingat bahwa tidak boleh ada dua variabel atau lebih dengan nama sama. Atau anda ingin menggunakan cara seperti ini : int x1, x2, x3, dst. Java menawarkan konsep array untuk solusi mendeklarasikan sejumlah besar variabel secara cepat. Pemakaian variabel array akan menghemat waktu penyebutan nama variabel. Sebuah variabel array sesungguhnya adalah sejumlah variabel berbeda dengan nama sama, namun memiliki nomor indeks yang unik untuk membedakan setiap variabel tersebut. 0 1 2 3 Indeks adalah sebuah angka yang menyatakan urutan sebuah elemen pada suatu variabel array. Karena seluruh kotak memiliki nama yang sama, maka untuk membedakannya diperlukan suatu cara yaitu dengan memberi nomor urut. Ibarat deretan rumah pada sebuah jalan, untuk membedakan antara rumah yang satu dengan rumah yang lain maka setiap rumah diberi nomor unik yang berbeda antara rumah satu dengan rumah lainnya. Nomor indeks variabel array selalu dimulai dari 0 (nol), sehingga nomor indeks bagi elemen terakhir adalah sebesar (N-1), dimana N adalah jumlah total elemen. Kita bisa mengakses setiap elemen dalam variabel array dengan mengacu pada nomor indeksnya. Awalan nol untuk nomor indeks array sering menimbulkan kerancuan bagi kita yang terbiasa dengan awalan angka 1. Pemrog. Berorientasi Objek **, Pertemuan Ke-4 Noviyanto, ST Halaman 2 Deklarasi Variabel Array Bentuk umum pendeklarasian variabel array di Java adalah: tipeData[] namaVariabel [= new tipeData[jumlahElemen] ]; TipeData bisa berupa salah satu dari berbagai tipe data seperti int, long, double maupun nama class; baik class standar Java atau class buatan kita sendiri 1. Mendeklarasikan variabel array tanpa menyebutkan berapa jumlah elemen yang diperlukan. int[] angka; Variabel angka kita deklarasikan sebagai variabel array dimana setiap elemennya akan menyimpan data bertipe int. Kita tidak menyebutkan berapa jumlah elemen dari variabel angka. Kita harus menuliskan di salah satu baris program instruksi untuk memesan jumlah elemen ini. Sebelum terjadi pemesanan jumlah elemen, kita tidak bisa menggunakan variabel array ini untuk menyimpan data. 2. Mendeklarasikan variabel array dengan menyebutkan jumlah elemen yang diperlukan. int[] angka = new int[5]; Variabel angka kita deklarasikan sebagai variabel array dimana setiap elemennya akan menyimpan data bertipe int. Pada saat mendeklarasikan ini kita langsung memesan 5 elemen array yang kita perlukan 3. Mendeklarasikan variabel array secara otomatis. Kita tidak menyebutkan jumlah elemen secara tegas, namun kita mendefinisikan sejumlah data secara terurut. int[] angka = {5, 3, 23, 99, 2}; Variabel angka kita deklarasikan sebagai variabel array dimana setiap elemennya akan menyimpan data bertipe int. Kita tidak menyebutkan berapa elemen yang kita pesan, tetapi kita langsung menentukan nilai setiap elemen. Karena jumlah data yang kita berikan ada 5, maka komputer akan mengetahui bahwa jumlah elemen yang kita butuhkan adalah 5. Pemrog. Berorientasi Objek **, Pertemuan Ke-4 Noviyanto, ST Halaman 3 Menghitung Jumlah Elemen Variabel Array Kita bisa menggunakan instruksi length untuk mengetahui jumlah elemen dari sebuah variabel array. Pernyataan angka.length akan menghasilkan berapa jumlah elemen dari variabel array yang bernama angka. Entah dengan cara bagaimana kita mendeklarasikan sebuah variabel array, Java tetap dapat melaporkan jumlah elemen variabel tersebut melalui instruksi length. Contoh Program Menghitung Elemen Array class JumlahElemenArray { public static void main (String[] args) { int[] angka; angka = new int[5]; System.out.println ("Jumlah elemen = " + angka.length); } } Output Program Pemrog. Berorientasi Objek **, Pertemuan Ke-4 Noviyanto, ST Halaman 4 Array Dua Dimensi Materi diatas adalah tentang pembahasan array satu dimensi. Istilah satu dimensi mengacu kepada jumlah bilangan yang digunakan sebagai indeks. Penulisan seperti ini System.out.println(angka[3]); merupakan penulisan untuk array satu dimensi. Perhatikan bahwa bilangan yang kita gunakan sebagai nomor indeks array hanya satu, tidak perduli berapa jumlah digitnya. Angka 100 merupakan sebuah bilangan, walaupun jumlah digitnya ada 3. Pada beberapa kondisi diperlukan penulisan variabel array yang menggunakan nomor indeks dua bilangan, misalnya pada aplikasi matrik. Data pada suatu matrik diketahui berdasarkan nilai baris dan kolomnya. Baris adalah sebuah bilangan dan kolom adalah sebuah bilangan juga. Tanpa adanya salah satu dari keduanya kita tidak bisa mengetahui data mana yang dimaksud, jika kita ingin mengambil sebuah data individu. Bentuk umum pendeklarasian variabel array dua dimensi di Java adalah: tipeData[][] nama_variabel[=new tipeData[jumlah_baris] [jumlah_kolom]]; Untuk memudahkan pemahaman, bentuk array dua dimensi bisa dihambarkan dalam bentuk petak-petak sebagai berikut: N adalah nilai yang menyatakan jumlah baris dari array, sedangkan M menyatakan jumlah kolom dari array. Sama seperti array satu dimensi, penomoran indeks untuk array dua dimensi juga dimulai dari 0 untuk baris maupun kolomnya. Tidak ada aturan yang mengatakan bahwa urutan untuk nomor indeks adalah baris dulu baru kolom N M Pemrog. Berorientasi Objek **, Pertemuan Ke-4 Noviyanto, ST Halaman 5 Contoh Program Array 2 Dimensi class ArrayDuaDimensi { public static void main (String[] args) { int[][] angka = new int[5][3]; for (int i=0; i<angka.length; i++) for (int j=0; j<angka[i].length; j++) angka[i][j] = (int)(Math.random()*100); System.out.println("Data array dua dimensi:\n"); for (int i=0; i<angka.length; i++) { for (int j=0; j<angka[i].length; j++) System.out.print(angka[i][j] + " "); System.out.println(); } } } Output Pemrog. Berorientasi Objek **, Pertemuan Ke-5 Noviyanto, ST Halaman 1 Pewarisan / Inheritance & Polimorfisme Pewarisan / Inheritance Pengertian Inheritance (pewarisan) proses pewarisan data dan method dari suatu kelas kepada kelas lain. Pewarisan bersifat menyeluruh Semua data dan method milik kelas asalnya diturunkan ke kelas baru. Kelas yang mewariskan Super Class atau Kelas Induk Kelas yang diwariskan Sub Class atau Kelas Anak Misal : kelas B adalah kelas anak dari kelas A, maka sifat sifat dari kelas A otomatis akan dimiliki juga oleh kelas B. Jika kelas induk merupakan turunan dari kelas lain, maka data dan method yang berasal dari kelas tersebut akan ikut diwariskan pula kepada kelas anaknya. Contoh : o Kelas C adalah kelas anak dari kelas B o Kelas B merupakan kelas anak dari kelas A. o Maka sifat sifat yang diwariskan kelas A ke kelas B juga akan diwariskan ke kelas C. Keyword untuk pewarisan : extends Pemrog. Berorientasi Objek **, Pertemuan Ke-5 Noviyanto, ST Halaman 2 Contoh Program class Induk { private String var1; //hak akses private berarti tidak dapat diakses oleh kls anak public int var2; //hak akses public berarti dapat diakses oleh kls anak //konstruktor Induk (){ } //method public void cetakData() { } } class Anak extends Induk{ private String dataAnak; //variabel //konstruktor Anak () { } public void cetak() { cetakData();//method milik Induk // ada jg yang memanggil dgn super.cetakData() } } class DemoPewarisan { public static void main(String args[]) { Anak anak = new Anak(); anak.cetak(); anak.cetakData(); System.out.println("Demo Pewarisan"); System.out.println("isi var 2="+anak.var2); } } Output Program: C:\Documents and Settings\suherman\My Documents>javac DemoPewarisan.java C:\Documents and Settings\suherman\My Documents>java DemoPewarisan Demo Pewarisan isi var 2=0 Pemrog. Berorientasi Objek **, Pertemuan Ke-5 Noviyanto, ST Halaman 3 Keuntungan Pewarisan Bersifat reusable Tidak harus menyalin semua data dan method dari suatu kelas jika akan menggunakannya lagi Kemudahan dalam me-manage kelas yang memiliki data dan method yang sama Untuk memodifikasi suatu data atau method untuk semua subkelas / kelas anak, maka tidak perlu melakukan perubahan di masing-masing kelas anak melainkan hanya pada kelas induk saja. Polimorfisme Polimorfisme sesuatu yang memiliki banyak bentuk. Dalam pemrograman, polimorfisme dapat diartikan sebagai modul yang memiliki nama sama, namun memiliki behaviour (tingkah laku) yang berbeda sehingga listing code implementasinya juga berbeda Contoh Program class Hewan { private String jenis; private int kaki; Hewan (){ } Hewan (String jenis, int kaki){ this.jenis = jenis; this.kaki = kaki; } public void bersuara() { System.out.print("suara hewan "+jenis+" berkaki"+kaki); } } class Anjing extends Hewan { Anjing() { super(); } public void bersuara() { //overriding method System.out.println("guk guk guk...."); } } Pemrog. Berorientasi Objek **, Pertemuan Ke-5 Noviyanto, ST Halaman 4 class Kucing extends Hewan { Kucing(String jenis, int kaki) { super(jenis, kaki); } public void bersuara() { //overriding method super.bersuara(); System.out.println( miaowwww...."); } } class DemoPoli { public static void main(String args[]) { Anjing doggy = new Anjing(); Kucing tom = new Kucing("Kucing", 4); doggy.bersuara(); tom.bersuara(); } } Output Program C:\Documents and Settings\suherman\My Documents>javac DemoPoli.java C:\Documents and Settings\suherman\My Documents>java DemoPoli guk guk guk.... suara hewan Kucing berkaki 4 miaowwww.... Pemrog. Berorientasi Objek **, Pertemuan Ke-6 Noviyanto, ST Halaman 1 String Dalam bahasa lain seperti C/C++ dan Pascal (Delphi), string merupakan array karakter. Dalam Java, string adalah object dan bukan array karakter. Dapat dibuat array karakter, tetapi ia bukan string. String terdiri dari sederetan karakter yang dibatasi oleh tanda petik ganda (double- quote). Berikut perbedaan antara deklarasi char dan deklarasi String: char inputKey; char ampersand = '&'; String perancangJava = "James Gosling"; String strAmpersand = "&"; Perhatikan tanda kutip tunggal dan kutip ganda yang membedakan karakter dan string. Meskipun kedua variabel berisi data satu karakter ampersand, tetapi Variable ampersand mempunyai tipe primitif char. Variable strAmpersand mempunyai tipe object String. Operasi String concat(str) digunakan untuk mengabungkan 2 buah string string. isEmpty() digunakan untuk mengecek apakah string kosong atau tidak. trim() digunakan untuk membuang spasi di sebelah kiri dan kanan string. length() digunakan untuk menghitung banyak karakter dalam string. equals(str) digunakan untuk membandingkan 2 buah string. substring(<awal>, <akhir>) digunakan untuk mengambil substring dari string. charAt(<index>) digunakan untuk mengambil karakter yang ada pada index. lastIndexOf(kar) digunakan untuk mencari index terakhir dari string yang mengandung karakter kar. equalsIgnoreCase(str) digunakan untuk membandingkan string dengan str, tidak membedakan huruf besar dan kecil. copyValueOf(arr_char) digunakan untuk membentuk string dari array karakter. replace(<old>, <new>) digunakan untuk mengganti <old> menjadi <new>. Menampilkan String Untuk menampilkan string dalam program Java non-GUI (teks), kita dapat memakai perintah System.out.println() ataupun System.out.print(). println() akan menambahkan karakter ganti baris (CR+LF) di akhir string, sedang print() tidak. Pemrog. Berorientasi Objek **, Pertemuan Ke-6 Noviyanto, ST Halaman 2 class TampilString { public static void main(String args[]) { System.out.print("Perancang C: "); System.out.print("Brian Kernighan dan Dennis Ritchie."); System.out.println(); // berganti baris System.out.println("Perancang Java: "); System.out.println(" James Gosling."); } } Perhatikan perbedaan antara print() dan println(). Output program (ditampilkan string sebagai berikut): Perancang C++: Brian Kernighan dan Dennis Ritchie. Perancang Java: James Gosling. Object String akan mengenali operator penggabungan string (concat) berupa tanda (+). Contoh: String s1 = "Java Micro - "; String s2 = s1 + "Java Enterprise"; System.out.println(s2); Akan menampilkan string: Java Micro - Java Enterprise Selain untuk menjumlahkan tipe variable String dengan String, operator + juga dapat dipakai untuk menjumlahkan tipe variable String dengan tipe lainnya: String dengan boolean, String dengan integer (byte, short, int, long, char), String dengan floating-point (float, double), String dengan object. Contoh Program class Concat { public static void main(String args[ ]) { boolean bool = true; long intg = 4567890; double flot = 45678.9123e-11; Concat objt1 = null; Concat objt2 = new Concat( ); Pemrog. Berorientasi Objek **, Pertemuan Ke-6 Noviyanto, ST Halaman 3 System.out.println("Concatenation:" + "\nString + boolean: " + false + " - " + bool + "\nString + integer: " + 123 + " ~ " + intg + "\nString + float : " + 3.14 + " ~ " + flot + "\nString + object : " + objt1 + " ~ " + objt2); } } String dengan operator new Sebuah object String dapat dibuat dengan memakai operator new. hasilnya akan sama saja dengan cara deklarasi yang telah dijelaskan di atas. Contoh: String s1 = "JBuilder 9."; String s2 = new String("JBuilder 9."); Kedua variable s1 dan s2 akan sama-sama merupakan object String yang berisikan teks: JBuilder 9. Dengan operator new, dapat juga membuat object String dari array karakter. Contoh: char chArray[] = {'J', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '9'}; String s1 = new String(chArray); // s1 = "JBuilder 9." Dapat juga memilih sub-array dari array karakter untuk dikonversi menjadi object String. Bentuk umumnya adalah sebagai berikut: String [nama var] = new String( char[ ] chArray, int offset, int count ) Di mana, chArray merupakan array karakter, offset merupakan index awal dari sub-array, count merupakan jumlah karakter yang akan diambil. Contoh: char chAr[] = {'J', 'B', 'u', 'i', 'l', 'd', 'e', 'r', ' ', '9'}; String s1 = new String(chAr, 1, 5); //s1 = "Build Index array maupun String dimulai dari angka 0 (zero-based index). Dengan offset = 1, maka karakter awalnya adalah 'B' (index 1). Dengan count = 5, akan diambil sebanyak 5 karakter mulai dari 'B'. Sub-array yang diambil adalah: 'Build'. Pemrog. Berorientasi Objek **, Pertemuan Ke-6 Noviyanto, ST Halaman 4 String sebagai class Dalam Java, variable dengan tipe String merupakan sebuah object dari class String. Ketika dideklarasikan sebuah string, maka secara otomatis, compiler Java akan membuatkan sebuah object String. Dalam JDK, class String disimpan dalam package java.lang. Jadi full-name bagi class ini adalah: java.lang.String. Sebagai sebuah class, String mempunyai beberapa member berupa method. Berikut beberapa method penting PANJANG STRING: LENGTH( ) MENGAMBIL SUB-STRING: SUBSTRING( ) MENGAMBIL KARAKTER: CHARAT( ) MENGAMBIL INDEX: INDEXOF( ) CASING: TOUPPERCASE( ), TOLOWERCASE( ) LENGTH() Method length() dipakai untuk mengambil panjang dari variable String. Contoh: String s1 = "JBuilder 9."; int lenStr = s1.length(); // lenStr = 11 System.out.println(lenStr); // 11 SUBSTRING() Method substring() dipakai untuk mengambil sub-string dari sebuah object String. Ada dua bentuk dari method ini Bentuk pertama (overload method): String substring(int beginIndex, int endIndex); String substring(int beginIndex); Bentuk tersebut mengambil sub-string dimulai dari posisi beginIndex sampai posisi endIndex-1. Bentuk kedua. // posisi: "01234567890" String s1 = "JBuilder 9."; String cutStr = s1.substring(5); // cutStr = "der 9." String subStr = s1.substring(1, 6); // subStr = "Build Bentuk tersebut mengambil sub-string dimulai dari posisi beginIndex sampai akhir string Pemrog. Berorientasi Objek **, Pertemuan Ke-6 Noviyanto, ST Halaman 5 CHARAT() Method charAt() dipakai untuk mengambil karakter dari object String pada posisi index tertentu. Contoh: // posisi: "01234567890" String s1 = "JBuilder 9."; char c1 = s1.charAt(1); // c1 = 'B' char c2 = s1.charAt(9); // c2 = '9' char c3 = s1.charAt(6); // c3 = 'e' INDEXOF() Method indexOf() dipakai untuk mengambil nilai index berupa posisi karakter tertentu di dalam object String. Posisi karakter yang dicari adalah posisi dari karakter pertama yang ditemui. Contoh: // posisi: "0123456789012345678" String s1 = "JBuilder untuk Java"; int pos1 = s1.indexOf('u'); // pos1 = 2 int pos2 = s1.indexOf('t'); // pos2 = 11 int pos3 = s1.indexOf('J'); // pos3 = 0 Nilai index yang dikembalikan adalah index dari karakter pertama yang ditemui. Misalnya ada 3 buah karakter 'u' dalam s1, tetapi yang dikembalikan adalah posisi dari karakter 'u' yang pertama (yaitu 2). TOUPPERCASE(), TOLOWERCASE() Method toUpperCase() atau toLowerCase() dipakai untuk konversi semua karakter di dalam object String menjadi huruf besar atau huruf kecil. String toUpperCase(); String toLowerCase(); Contoh: String s1 = "JBuilder untuk Java\u2122"; String sUp = s1.toUpperCase(); // = JBUILDER UNTUK JAVA String sDown = s1.toLowerCase(); // = jbuilder untuk java Pemrog. Berorientasi Objek **, Pertemuan Ke-7 Noviyanto, ST Halaman 1 Packages, Import dan Interfaces 1. Packages Packages dalam JAVA berarti pengelompokan beberapa class dan interface dalam satu unit. Fitur ini menyediakan mekanisme untuk mengatur class dan interface dalam jumlah banyak dan menghindari konflik pada penamaan. Mengimport Packages Supaya dapat meggunakan class yang berada diluar package yang sedang dikerjakan, Anda harus mengimport package dimana class tersebut berada. Pada dasarnya, seluruh program JAVA mengimport package java.lang.*, sehingga Anda dapat menggunakan class seperti String dan Integer dalam program meskipun belum mengimport package sama sekali. Penulisan import package dapat dilakukan seperti dibawah ini : import <namaPaket>; Sebagai contoh, bila Anda ingin menggunakan class Color dalam package awt, Anda harus menuliskan import package sebagai berikut : import java.awt.Color; import java.awt.*; Baris pertama menyatakan untuk mengimport class Color secara spesifik pada package, sedangkan baris kedua menyatakan mengimport seluruh class yang terkandung dalam package java.awt. Cara lain dalam mengimport package adalah dengan menuliskan referensi package secara eksplisit. Hal ini dilakukan dengan menggunakan nama package untuk mendeklarasikan object sebuah class : java.awt.Color color; Pemrog. Berorientasi Objek **, Pertemuan Ke-7 Noviyanto, ST Halaman 2 2. Import Pada sebuah file .java, dibutuhkan referensi file-file mana saja yang menjadi referensi dari class-class, method-method, ataupun segala sesuatu yang digunakan dalam sebuah program java yang ditulis dalam sebuah file .java tersebut. aturan penulisan pada umumnya ditulis di bawah penulisan package, contohnya adalah sebagai berikut : import java.io.RandomAccessFile; import java.net.*; 3. Interface Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai penggantinya menggunakan kata kunci class, kata kunci interface digunakan. Berikut syntaxnya. <interfaceDeclaration> ::= <modifier> interface <name> { <attributeDeclaration>* [<modifier> <returnType> <name>(<parameter>*);]* } Anggotanya adalah public ketika interface dideklarasikan public. Petunjuk Penulisan Program: Secara mutlak atribut adalah static dan final dan harus diinisialisasi dengan nilai konstanta. Seperti mendeklarasikan class teratas, acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class). Class mengimplementasikan sebuah interface yang telah ada dengan menggunakan kata kunci implements. Class ini dibuat untuk mengimplementasikan semua method interface. Sebuah class boleh mengimplementasikan lebih dari satu interface. Pemrog. Berorientasi Objek **, Pertemuan Ke-7 Noviyanto, ST Halaman 3 Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface. interface MyInterface { void iMethod(); } class MyClass1 implements MyInterface { public void iMethod() { System.out.println("Interface method."); } void myMethod() { System.out.println("Another method."); } } class MyClass2 implements MyInterface { public void iMethod() { System.out.println("Another implementation."); } } class InterfaceDemo { public static void main(String args[]) { MyClass1 mc1 = new MyClass1(); MyClass2 mc2 = new MyClass2(); mc1.iMethod(); mc1.myMethod(); mc2.iMethod(); } } Output Program: C:\Documents and Settings\Administrator\My Documents>javac InterfaceDemo.java C:\Documents and Settings\Administrator\My Documents>java InterfaceDemo Interface method. Another method. Another implementation. Pemrog. Berorientasi Objek **, Pertemuan Ke-8 Noviyanto, ST Halaman 1 PENANGANAN EKSEPSI Eksepsi adalah keadaan tidak normal yang muncul pada suatu bagian program pada saat dijalankan. Penanganan eksepsi pada java membawa pengelolaan kesalahan program saat dijalankan kedalam orientasi-objek. Eksepsi java adalah objek yang menjelaskan suatu keadaan eksepsi yang muncul pada suatu bagian program. Saat suatu keadaan eksepsi muncul, suatu objek exception dibuat dan dimasukkan ke dalam method yang menyebabkan eksepsi. Method tersebut dapat dipilih untuk menangani eksepsi berdasarkan tipe tertentu. Method ini juga menjaga agar tidak keluar terlalu dini melalui suatu eksepsi, dan memiliki suatu blok program yang dijalankan tepat sebelum suatu eksepsi menyebabkan metodenya kembali ke pemanggil. Eksepsi dapat muncul tidak beraturan dalam suatu method, atau dapat juga dibuat secara manual dan nantinya melaporkan sejumlah keadaan kesalahan ke method yang memanggil. Dasar-dasar penanganan Eksepsi Penanganan eksepsi pada java diatur dengan lima kata kunci : try, catch, throw, throws dan finally. Pada dasarnya try digunakan untuk mengeksekusi suatu bagian program, dan jika muncul kesalahan, sistem akan melakukan throw suatu eksepsi yang dapat anda catch berdasarkan tipe eksepsinya, atau yang anda berikan finally dengan penangan default. Berikut ini bentuk dasar bagian penanganan eksepsi : try { // Block of Code } catch (ExceptionType1 e) { // Exception Handler for ExceptionType1 } catch (ExceptionType2 e) { // Exception Handler for ExceptionType2 throw (e); // re-throw the Exception } finally { } Tipe Eksepsi Dipuncak hirarki class eksepsi terdapat satu class yang disebut throwable. Class ini digunakan untuk merepresentasikan semua keadaan eksepsi. Setiap ExceptionType pada bentuk umum diatas adalah subclass dari throwable. Dua subclass langsung throwable didefinisikan untuk membagi class throwable menjadi dua cabang yang berbeda. Satu, class Exception, digunakan untuk keadaan eksepsi yang harus ditangkap oleh program yang kita buat. Sedangkan yang lain diharapkan dapat menangkap class yang kita subclasskan untuk menghasilkan keadaan eksepsi. Cabang kedua throwable adalah class error, yang mendefinisikan keadaan yang tidak diharapkan untuk ditangkap dalam lingkungan normal. Throwable Exception Error Pemrog. Berorientasi Objek **, Pertemuan Ke-8 Noviyanto, ST Halaman 2 Eksepsi Yang Tidak Dapat Ditangkap Obyek eksepsi secara otomatis dihasilkan oleh runtime java untuk menanggapi suatu keadaan eksepsi. Perhatikan contoh berikut : class Exc0 { public static void main (String args[]) { int d = 0; int a = 42 / d; } } Saat runtime java mencoba meng-eksekusi pembagian, akan terlihat bahwa pembaginya adalah nol, dan akan membentuk objek eksepsi baru yang menyebabkan program terhenti dan harus berurusan dengan keadaan kesalahan tersebut. Kita belum mengkodekan suatu penangan eksepsi, sehingga penanganan eksepsi default akan segera dijalankan. Keluaran dari program diatas : java.lang.ArithmeticExpression : /by zero at Exc0.main (Exc0.java:4) Berikut adalah contoh lainnya dari eksepsi : class Exc1 { static void subroutine() { int d = 0; int a = 42 / d; } public static void main (String args[]) { Exc1.subroutine(); } } Output-nya : Exception in thread main java.lang.ArithmeticException : / by zero at Exc1.subroutine(Exc1.java :4) at Exc1.main(Exc1.java : 7) Try dan Catch Kata kunci try digunakan untuk menentukan suatu blok program yang harus dijaga terhadap semua eksepsi, setelah blok try masukkan bagian catch, yang menentukan tipe eksepsi yang akan ditangkap. Perhatikan contoh berikut: class Exc2 { public static void main (String args[]) { try { int d = 0; int a = 42 / d; } catch (ArithmeticException e) { System.out.println( Division By Zero ); } } } Outputnya: C:\Documents and Settings\noviyanto\My Documents>java Exc2 Division By Zero Pemrog. Berorientasi Objek **, Pertemuan Ke-8 Noviyanto, ST Halaman 3 Throw Pernyataan throw digunakan untuk secara eksplisit melemparkan suatu eksepsi. Pertama kita harus mendapatkan penanganan dalam suatu instance throwable, melalui suatu parameter kedalam bagian catch, atau dengan membuatnya menggunakan operator new. Bentuk umum pernyataan throw : throw ThrowableInstance; Aliran eksekusi akan segera terhenti setelah pernyataan throw, dan pernyataan selanjutnya tidak akan dicapai. Blok try terdekat akan diperiksa untuk melihat jika telah memiliki bagian catch yang cocok dengan tipe instance Throwable. Jika tidak ditemukan yang cocok, maka pengaturan dipindahkan ke pernyataan tersebut. Jika tidak, maka blok pernyataan try selanjutnya diperiksa, begitu seterusnya sampai penanganan eksepsi terluar menghentikan program dan mencetak penelusuran semua tumpukan sampai pernyataan throw. Contoh : class throwDemo { static void demoProc() { try { throw new NullPointerException( demo ); } catch (NullPointerException e) { System.out.println( caught inside demoproc ); throw e; } } public static void main (String args[]) { try { demoProc(); } catch (NullPointerException e) { System.out.println( recaugt : + e); } } } Output : caught inside demoproc recaught : java.lang.NullPointerException : demo Throws Kata kunci throws digunakan untuk mengenali daftar eksepsi yang mungkin di-throw oleh suatu method. Jika tipe eksepsinya adalah error, atau RuntimeException, atau suatu subclassnya, aturan ini tidak berlaku, karena tidak diharapkan sebagai bagian normal dari kerja program. Jika suatu method secara eksplisit men-throws suatu intans dari Exception atau subclassnya, diluar RuntimeException, kita harus mendeklarasikan tipenya dengan pernyataan throws. ini mendefinisikan ulang deklarasi method sebelumnya dengan sintaks sbb : type method-name (arg-list) throws exception-list { } Contoh : class ThrowsDemo { static void procedure () throws IllegalAccessException { System.out.println( Inside Procedure ); throw new IllegalAccessException( demo ); } public static void main(String args[]) { try { procedure(); } catch (IllegalAccessException e) { System.out.println( caught + e); } } } Output : Inside procedure Pemrog. Berorientasi Objek **, Pertemuan Ke-8 Noviyanto, ST Halaman 4 caught java.lang.IllegalAccessException : demo Finally Saat suatu eksepsi dilemparkan, alur program dalam suatu method membuat jalur yang cenderung tidak linier melalui method tersebut, melompati baris-baris tertentu, bahkan mungkin akan keluar sebelum waktunya pada kasus dimana tidak ada bagian catch yang cocok. Kadang-kadang perlu dipastikan bahwa bagian program yang diberikan akan berjalan, tidak perduli eksepsi apa yang terjadi dan ditangkap. Kata kunci finally dapat digunakan untuk menentukan bagian program seperti itu. Setiap try membutuhkan sekurang-kurangnya satu bagian catch atau finally yang cocok. Jika kita tidak mendapatkan bagian catch yang cocok, maka bagian finally akan dieksekusi sebelum akhir program, atau setiap kali suatu method akan kembali ke pemanggilnya, melalui eksepsi yang tidak dapat ditangkap, atau melalui pernyataan return, bagian finally akan dieksekusi sebelum kembali ke method kembali. Berikut adalah contoh program yang menunjukkan beberapa method yang keluar dengan berbagai cara, tidak satupun tanpa mengeksekusi bagian finally-nyA. class finallyDemo { static void procA() { try { System.out.println( Inside procA.. ); throw new RuntimeException( Demo ); } finally { System.out.println( procA is finally ); } } static void procB() { try { System.out.println( Inside procB.. ); return; } finally { System.out.println( procB is finally ); } } public static void main(String args[]) { try { procA( ); } catch (Exception e){ }; procB(); } } Output : Inside procA.. procA is finally Inside procB.. procB is finally Pemrog. Berorientasi Objek **, Pertemuan Ke-9 Noviyanto, ST Halaman 1 Multithreading Banyak persoalan dalam pemrograman membutuhkan kemampuan suatu program untuk melakukan beberapa hal sekaligus, atau memberikan penanganan segera terhadap suatu kejadian/ event tertentu dengan menunda aktivitas yang sedang dijalankan untuk menangani event tersebut dan akhirnya kembali melanjutkan aktivitas yang tertunda. Contoh, dalam sistem aplikasi jaringan, kita dapat membuat suatu program melakukan komputasi lokal dengan data yang sudah didapat dari jaringan, pada saat program tersebut menunggu datangnya tambahan data dari jaringan. Tanpa multithreading, program tersebut harus melakukannya secara sekuensial dalam sebuah alur program tunggal (yaitu alur control utama), yang diawali dengan penantian tibanya keseluruhan data, baru kemudian komputasi. Pada masa penantian tersebut, komputer berada pada keadaan idle yang menyebabkan ketidakefisienan pada keseluruhan program. Dengan multithreading kita dapat menciptakan dua thread secara dinamis, yaitu thread yang berjaga dipintu gerbang, menunggu masuknya data., dan thread yang melakukan komputasi lokal atas data yang sudah tersedia. Multithreading dan Java Thread (seringkali disebut juga lightweight process atau execution context) adalah sebuah single sequential flow of control didalam sebuah program. Secara sederhana, thread adalah sebuah subprogram yang berjalan didalam sebuah program. Seperti halnya sebuah program, sebuah thread mempunyai awal dan akhir. Sebuah program dapat mempunyai beberapa thread didalamnya. Jadi perbedaannya program yang multithreaded mempunyai beberapa flow of control yang berjalan secara konkuren atau paralel sedangkan program yang singlethreaded hanya mempunyai satu flow of control. Dua program yang dijalankan secara terpisah ( dari command line secara terpisah ), berada pada dua address space yang terpisah. Sebaliknya, kedua thread pada gambar diatas berada pada address space yang sama (address space dari program dimana kedua thread tersebut dijalankan). Kalau program itu berjalan diatas mesin dengan single processor, maka thread-thread itu dijalankan secara Konkuren (dengan mengeksekusi secara bergantian dari satu thread ke thread yang lainnya). Jika program itu berjalan diatas mesin dengan multiple processor, maka thread-thread itu bisa dijalankan secara paralel (masing-masing thread berjalan di processor yang terpisah). Gambar 2 dapat menjelaskan perbedaan antara konkurensi dan parallelism. Bahasa Java mempunyai kemampuan multithreading built-in, pada Java Virtual Macjine terdapat thread scheduler yang menentukan thread mana yang beraksi pada selang waktu tertentu. Scheduler pada JVM mendukung preemptive multithreading, yaitu suatu thread dengan prioritas tinggi dapat menyeruak masuk dan menginterupsi thread yang sedang beraksi, kemampuan ini sangat menguntungkan dalam membuat aplikasi real-time. Pemrog. Berorientasi Objek **, Pertemuan Ke-9 Noviyanto, ST Halaman 2 Scheduler pada JVM juga mendukung non-preemptive multithreading (atau sering disebut juga cooperative multithreading), yaitu thread yang sedang beraksi tidak dapat diinterupsi, ia akan menguasai waktu CPU, sampai ia menyelesaikan tugasnya atau secara eksplisit merelakan diri untuk berhenti dan memberi kesempatan bagi thread yang lain. Newborn Sebuah thread berada pada state ini ketika dia di instantiasi. Sebuah ruangan dimemori telah dialokasikan untuk thread itu,dan telah menyelesaikan tahap inisialisasinya. Thread timerThread = new TimerThread(); .. Pada state ini, timeThread belum masuk dalam skema penjadwalan thread scheduler. Runnable Pada state ini, sebuah thread berada dalam skema penjadwalan, akan tetapi dia tidak sedang beraksi. Kita bisa membuat timerThread yang kita buat sebelumnya masuk ke state runnable dengan : .. timerThread.start(); Kapan tepatnya timerThread beraksi, ditentukan oleh thread scheduler. Running Pada state ini, thread sedang beraksi. Jatah waktu beraksi bagi thread ini ditentukan oleh thread scheduler. Pada kasus tertentu, thread scheduler berhak meng-interupsi kegiatan dari thread yang sedang beraksi (misalnya ada thread lainnya dengan prioritas yang lebih tinggi). Pemrog. Berorientasi Objek **, Pertemuan Ke-9 Noviyanto, ST Halaman 3 Thread dalam keadaan running bisa juga lengser secara sukarela, dan masuk kembali ke state runnable, sehingga thread lain yang sedang menunggu giliran(runnable) memperoleh kesempatan untuk beraksi. Tinddakan thread yang lengser secara sukarela itu biasanya disebut yield-ing. public void run() { . Thread.yield(); . } Blocked Pada tahap ini thread sedang tidak beraksi dan diabaikan dalam penjadwalan thread scheduler. Thread yang sedang terblok menunggu sampai syarat-syarat tertentu terpenuhi, sebelum ia kembali masuk kedalam skema penjadwalan thread scheduler (masuk state runnable lagi). Suatu thread menjadi terblok karena hal-hal berikut : a. Thread itu tidur untuk jangka waktu tertentu, seperti berikut : public void run() { try { thread.slepp(3000); //thread yg sedang beraksi akan tidur selama 3000 milisecond=3menit } catch (InterruptedException e) { . } b. Thread itu di- suspend(). Thread yang ter-suspend() itu bisa masuk kembali ke state runnable bila ia resume(). seperti hal berikut : //timerThread akan segera memasuki state blocked timerThread.suspend(); timerThread.resume(); //timerThread kembali masuk state runnable c. Bila thread tersebut memanggil method wait() dari suatu object yang sedang ia kunci. Thread tersebut bisa kembali memasuki state runnable bila ada thread lain yang memanggil method notify() atau notifyAll() dari object tersebut. d. Bila thread ini menunggu selesainya aktifitas yang berhubungan dengan I/O. Misalnya, jika suatu thread menunggu datangnya bytes dari jaringan komputer maka secara otomatis thread tersebut masuk ke state blocked. e. Bila suatu thread mencoba mengakses critical section dari suatu object yang sedang dikunci oleh thread lain. Critical section adalah method/blok kode yang ditandai dengan kata synchronized. Dead Suatu thread secara otomatis disebut mati bila method run() nya sudah dituntaskan (return dari method run() ). Contoh dibawah ini adalah thread yang akan mengecap state running hanya sekali saat thread scheduler memberinya kesempatan untuk running, ia akan mencetak I m doing something .something stupid .but I m proud of It kemudian mati. public class MyThread extends Thread { .. public void run() { System.out.print( I m doing something ); System.out.print( something stupid ); System.out.println( but I m proud of It ); // MyThread akan mati begitu baris diatas selesai dieksekusi } } Pemrog. Berorientasi Objek **, Pertemuan Ke-9 Noviyanto, ST Halaman 4 contoh : 1. class theThread implements Runnable{ 2. Thread t; 3. 4. theThread(){ t = new Thread(this, "DemoThread"); 5. System.out.println("Child Thead : " + t); 6. t.start(); } 7. 8. public void run(){ 9. try{ for(int i=5;i>0;i--){ 10. System.out.println("Child Thread :" + i); 11. Thread.sleep(500); } 12. } 13. catch(InterruptedException e){ 14. System.out.println("Child Interrupted"); } 15. System.out.println("Exiting Child Thread"); } 16. } 17. class MyThread{ 18. public static void main(String args[]){ 19. new theThread(); 20. try{ for(int i=5;i>0;i--){ 21. System.out.println("Main Thread :" + i); 22. Thread.sleep(1000); } 23. } 24. catch(InterruptedException e){ 25. System.out.println("main Interrupted"); } 26. System.out.println("Exiting Main Thread"); } 27. } Output : Child Thread : Thread(Demo Thread, 5, main) Main Thread : 5 Child Thread : 5 Child Thread : 4 Main Thread : 4 Child Thread : 3 Child Thread : 2 Main Thread : 3 Child Thread : 1 Exiting Child Thread Main Thread : 2 Main Thread : 1 Exiting Main Thread Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 1 STREAM DAN FILE Proses penulisan dan pembacaan data sering kita sebut dengan proses input dan output, dimana penulisan data berarti mengalirkan data ke output dan menerima atau mendapatkan data dari input. A. Stream Stream merupakan dasar operasi input-output ( I/O ) dalam Java yang menggunakan package java.io sebagai package utama. Stream adalah representasi abstrak dari input dan output device, dimana aliran bytes akan ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita dapat membaca data dari input stream, yang dapat berupa file, keyboard atau komputer remote. Sedangkan untuk operasi penulisan berarti menulis data pada output stream. Package java.io mendukung dua tipe stream, yaitu binari dan karakter stream. Binari merupakan data berupa bit atau data binari, sedangkan karakter adalah tipe khusus untuk pembacaan dan penulisan teks/karakter. B. Input Stream Subclass-subclass dari inputStream adalah : AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, PipedInputStream, SequenceInputStream, dan StringBufferInputStream. Dua method utama dari InputStream adalah : Read Method ini digunakan untuk membaca stream. Close Method ini digunakan untuk menutup koneksi input stream. Latihan 38. InputStream.java import java.io.*; class InputStream { public static void main(String[] args) throws IOException { byte[] data = new byte[10]; System.out.print("Ketik 10 buah karakter :"); System.in.read(data); System.out.print("Karakter yang Anda ketik yaitu : "); for(int i=0;i<data.length;i++) { System.out.print((char)data[i]); } } } C. Output Stream Subclass-subclass dari outputStream adalah : ByteArrayOutputStream : digunakan untuk menuliskan stream menjadi byte array. FileOutputStream : digunakan untuk menulis pada file FilterOutputStream : merupakan superclass dari subclass-subclass seperti DataOutputStream, BufferOutputStream, PrintStream, CheckedOutputStream ObjectOutputStream : digunakan untuk menuliskan objek pada OutputStream. PipedOutputStream : digunakan untuk menjadi output dari PipedInputStream. Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 2 Sebagian method-method OutputStream adalah : Voidclose() Menutup output stream yang aktif dan melepaskan sumber daya terkait dengan stream tersebut Void flush() Melakukan flush output stream dan memaksa semua byte buffer untuk dituliskan keluar Void write(byte[] b) Menulis sebanyak b.length dari byte array ke output stream Void write(byte[] b, int off, int len) Menuliskan sebanyak len byte dari byte array b dimulai dari index off Latihan 39. OutputStream.java import java.io.*; class OutputStream { public static void main(String[] args) throws IOException { byte[] data = {'a','b','c','d','e','f','g'}; System.out.write(data,3,4); System.out.write('\n'); //pindah baris System.out.write(data); //tulis semua isi array data } } D. DataOutputStream DataOutputStream merupakan class yang menyediakan cara praktis untuk menuliskan tipe data primitif ke output stream. Sebagian method DataOutputStream adalah : writeDouble : berfungsi menuliskan data bertipe double ke output stream writeInt : berfungsi menuliskan data bertipe integer ke output stream writeBoolean : berfungsi menuliskan data boolean ke output stream writeUTF : berfungsi menuliskan data string menggunakan encoding UTF-8 yang tidak tergantung pada mesin. E. DataInputStream DataInputStream berfungsi untuk saling melengkapi dengan DataOutputStream, yaitu untuk mendapatkan data yang ditulis dengan DataOutputStream. Sebagian method DataInputStream adalah : ReadDouble() : membaca data bertipe double readInt() : membaca data bertipe integer readBoolean() : membaca data Boolean readUTF() : membaca data dengan encoding UTF-8 F. FileInputStream dan FileOutputStream FileInputStream digunakan untuk membaca data dari file yang merupakan turunan langsung dari class InputStream dan FileOutputStream untuk menuliskan data ke file merupakan turunan langsung dari class OutputStream. Latihan 40. FileInStream.java import java.io.*; class FileInStream { public static void main(String[] args){ if(args.length==0) { System.out.println("Anda harus memasukkan nama file sebagai parameternya."); return; } byte data; FileInputStream fin=null; try { fin = new FileInputStream(args[0]); do { data = (byte)fin.read(); System.out.print((char)data); }while(data!=-1); }catch(FileNotFoundException e) { System.out.println("File : " + args[0] + " tidak ditemukan."); }catch(IOException e) { System.out.println("Eksepsi tidak diketahui : " + e); }finally {//tutup file Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 3 if(fin!=null) { try{ fin.close(); }catch(IOException err) { System.out.println("Eksepsi tidak diketahui : " + err); } } } } } Latihan 41. FileOutStream import java.io.*; class FileOutStream { public static void main(String[] args){ if(args.length==0) { System.out.println("Anda harus memasukkan nama file sebagai parameternya."); return; } byte data; FileOutputStream fout=null; try{ fout = new FileOutputStream(args[0]); System.out.println("Ketik data yang ingin Anda tulis ke file."); System.out.println("Ketik Q jika Anda ingin berhenti."); data = (byte)System.in.read(); while(data!=(byte)'Q') { fout.write(data); data = (byte)System.in.read(); } }catch(FileNotFoundException e) { System.out.println("File : " + args[0] + " tidak dapat dibuka atau dibuat."); }catch(IOException e) { System.out.println("Eksepsi tidak diketahui : " + e); }finally { //tutup file if(fout!=null) { try{ fout.close(); }catch(IOException err) { System.out.println("Eksepsi tidak diketahui : " + err); } } } } } Keterangan : file output1.txt sebenarnya tidak ada, dengan perintah diatas akan secara langsung terbuat Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 4 G. Class File Class File merupakan langkah awal dalam mempelajari proses input-output dengan Java, karena File merupakan objek yang mewakili path, file, atau direktori pada harddisk. Ada tiga cara membuat objek File, yaitu : Menggunakan objek string sebagai argumen yang menginformasikan path untuk file atau direktori. Menggunakan dua langkah, dimana yang pertama untuk mendefinisikan direktori dan yang kedua untuk file. Menggunakan dua argumen, dimana yang pertama adalah argumen string yang mendefinisikan direktori, dan yang kedua adalah argumen string yang mendefinisikan nama file. H. FileWriter Di dalam aplikasi web, disamping database, penggunaan file untuk menyimpan data cukup banyak dilakukan karena kebutuhan penyimpanan data yang sederhana cukup dengan menggunakan file. FileWriter merupakan subclass dari OutputStreamWriter yang merupakan subclass dari class abstract Writer. Class FileWriter memiliki konstruktor yang umum seperti berikut : FileWriter ( File objekfile ); FileWriter ( String pathkefile ); FileWriter ( String pathkefile, boolean append ); Contoh penggunaan : File inifile = (pathdirektori, namafile); FileWriter outputnya = new FileWriter (inifile); Latihan 42. MenulisFile.java import java.io.*; class MenulisFile { public static void main(String[] args){ if(args.length==0) { System.out.println("Anda harus memasukkan nama file sebagai parameternya."); return; } String data; FileWriter fout=null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) try{ fout = new FileWriter(args[0]); System.out.println("Ketik data yang ingin Anda tulis ke file."); System.out.println("Ketik BERHENTI jika Anda ingin berhenti."); data = br.readLine(); while(!data.equals("BERHENTI")){ // \r\n digunakan untuk pindah baris fout.write(data + "\r\n"); data = br.readLine(); } }catch(FileNotFoundException e) { System.out.println("File : " + args[0] + " tidak dapat dibuka atau dibuat."); }catch(IOException e) { System.out.println("Eksepsi tidak diketahui : " + e); }finally //tutup file if(fout!=null) { try{ fout.close(); }catch(IOException err) { System.out.println("Eksepsi tidak diketahui : " + err); } } } } } Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 5 I. FileReader FileReader merupakan class yang dapat digunakan untuk membaca file teks. Konstruktor dari FileReader : FileReader(File objekfile); FileReader(String pathkefile); Method yang digunakan : Read(char[] array); Read(char[] array, int offset, int length); Contoh penggunaan : File fileteks = new File(direktori, namafile); FileReader baca = new FileReader(fileteks); C=baca.read(char[] yang dibaca); Latihan 43. BacaFile.java import java.io.*; class BacaFile { public static void main(String[] args){ if(args.length==0) { System.out.println("Anda harus memasukkan nama file sebagai parameternya."); return; } String data; FileReader fin=null; try{ fin = new FileReader(args[0]); BufferedReader br = new BufferedReader(fin); //bungkus objek FileReader dengan objek BufferedReader do{ data = br.readLine(); System.out.println(data); }while(data!=null); }catch(FileNotFoundException e) { System.out.println("File : " + args[0] + " tidak ditemukan."); }catch(IOException e) { System.out.println("Eksepsi tidak diketahui : " + e); }finally { //tutup file if(fin!=null) { try{ fin.close(); }catch(IOException err) { System.out.println("Eksepsi tidak diketahui : " + err); } } } } } Pemrog. Berorientasi Objek **, Pertemuan Ke-10 Noviyanto, ST Halaman 6 LATIHAN 1. Jelaskan tentang Byte Stream dan Character Stream, beserta dengan perbedaan utamanya ? 2. Berikan contoh program untuk DataInputStream dan DataOutputStream ! 3. Buatlah program untuk mengecek keberadaan file/isi pada direktori ! 4. Buatlah program untuk mengkopi suatu file teks ! Nama file yang hendak dikopi dan hasil kopianya harus dilewatkan sebagai parameter pada waktu eksekusi. Contoh eksekusi program : Java kopi file1.txt file2.txt Pemrog. Berorientasi Objek **, Pertemuan Ke-11 Noviyanto, ST Halaman 1 GUI Pada Java Pengantar GUI (Graphical User Interface), memungkinkan user untuk berinteraksi dengan komputer secara lebih baik. Pengguna berinteraksi dengan berbagai elemen grafis,diantaranya: button, dialog box, menu, dsb. Sejak 1994 Sun Microsystem berupaya untuk membuat JAVA memiliki perangkat bergaya desktop dengan ToolkitJAVA yang dikenal sebagai AWT (Abstract Windowing Toolkit) Tahun 1997, muncul JFC (Java Foundation Class) untuk kepentingan pembuatan aplikasi Window yang merupakan pengembangan dari AWT. JFC mempunyai kode swing yang terdapat pada package yang disediakan pada JAVA SDK versi 1.2 ke atas (JAVA 2) JAVA menyediakan dua graphical library. AWT (Abstract Windows Toolkit) Swing Contoh: import java.awt.* ; Import java.awt.event.* ; Import javax.swing.* ; Graphical Object Container (tempat), obyek yang dapat menampung komponen grafis dan tempat yang lebih kecil Contoh: frames, panels Component, obyek grafis yang berfungsi untuk menampilkan data, menerima masukan, atau menunjukkan suatu kondisi. Contoh: buttons, labels, text fields Event, obyek yang merepresentasikan suatu kejadian. Contoh: gerakan mouse, penekanan tombol Listener, suatu obyek yang menunggu suatu kejadian khusus dan akan bereaksi (melakukan sesuatu) jika kejadian tersebut terjadi Graphical Object Pemrog. Berorientasi Objek **, Pertemuan Ke-11 Noviyanto, ST Halaman 2 Container : Frame import javax.swing.*; class FramePertamaku extends JFrame { public FramePertamaku() { setTitle( "Frame Pertama ); setSize( 300 , 200 ); } } public class Frameku { public static void main (String args[ ] ) { FramePertamaku coba = new FramePertamaku(); coba.show(); } } Beberapa method java.awt.Frame void setResizable (boolean b) menentukan apakah user dapat merubah ukuran frame void setTitle(String s) mengatur teks pada title bar void setIconImage(Image image) gambar yang digunakan sebagai icon dari frame Component : Text import java.awt.*; public class WindowText extends Frame { public void paint(Graphics g) { setSize(300, 200); setTitle(getClass().getName()); Font f = new Font( "Monospaced , Font.BOLD, 16); g.setFont(f); g.drawString( "Hello ... , 10 , 100); g.drawString( "Salam kenal dari Frame ... , 30 ,120); } public static void main(String[ ] args) { WindowText coba = new WindowText(); coba.setSize(500, 300); coba.setLocation(200, 100); coba.setTitle("Window Text ); coba.show(); } } Beberapa method java.awt.Font : Font (String name, int style, int size) mengatur jenis font, format font (PLAIN,BOLD,ITALIC) dan ukuran font. String getFontName() mengetahui nama font face String getFamily() mengetahui jenis keluarga font Component : Label import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KomponenLabel { public static void main(String[ ] args) { JFrame frame = new JFrame("Membuat Label"); JLabel label = new JLabel("Pemrograman Berorientasi Obyek"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); } } Pemrog. Berorientasi Objek **, Pertemuan Ke-11 Noviyanto, ST Halaman 3 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KomponenLabelBerformat { public static void main(String[] args) { JFrame frame = new JFrame("Membuat Label"); JLabel label = new JLabel("Pemrograman Berorientasi Obyek"); label.setForeground(Color.yellow); label.setBackground(Color.blue); label.setOpaque(true); label.setFont(new Font("SansSerif", Font.BOLD, 14)); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Component : TextField import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TeksField { public static void main(String[ ] args) { JFrame frame = new JFrame("Membuat TeksField"); JLabel label = new JLabel("Nama :"); JTextField textField = new JTextField(20); frame.getContentPane().setLayout(new FlowLayout()); frame.getContentPane().add(label); frame.getContentPane().add(textField); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Component Beberapa obyek ContentPanel, yaitu : JPasswordField, JTextArea, JButton, JRadioButton, JCheckBox, JComboBox. Event - Listener. Jika sebuah CLASS ingin bereaksi atas aksi yang dilakukan oleh pemakai(user) melalui keyboard, mouse atau lainnya, maka Java menjawab dengan sistem yang disebut sebagai Event Handling. Program atau Interface ini disebut sebagai EventListener ActionListener Bereaksi atas perubahan komponen , seperti klik mouse atau tombol. AdjustmentListener Bereaksi atas perubahaan komponen untuk penyesuaian, misalnnya scrollbar yang digerakkan. FocusListener Event yang disebabkan oleh focus pada field, misalnya kursor berada pada field tersebut. ItemListener Bereaksi pada perubahan checkbox, radiobutton dan lainnya. KeyListener Bereaksi atas keyboard, misalnya penekanan tombol ALT Ctrl dan lainnya. Pemrog. Berorientasi Objek **, Pertemuan Ke-11 Noviyanto, ST Halaman 4 WindowsListener Bereaksi atas perubahaan pada window, misalnya diperbesar, diperkecil, digeser atau ditutup. MouseMotionListener Bereaksi atas pergerakan mouse, misalnya bila melewati area komponen tertentu. Listeners terdaftar pada java.awt.event.* Setelah komponen dideklarasikan, maka listener dapat ditambahkan pada komponen tersebut, misalnya pada Button: Jbutton b1=new Jbutton("Tombol"); b1.addActionListener( ) Listener harus ditembahkan lebih dahulu ke dalam komponen, sebelum komponen tersebut diletakkan pada Frame/ Content Pane. Contoh form action listener dengan dua tombol: ketika tombol 1 ditekan maka text pada form akan berubah menjadi "tombol 1 ditekan " Sumber: http://www.freewebs.com/tekomitn/Materi/PBO/Basic%20GUI.ppt Hermawan, Beni. Menguasai Java 2 & Object oriented Programming,Penerbit Andi Yogyakarta, 2004. www2.ukdw.ac.id/kuliah/info/IN1253/DasarPerancanganGUI.pdf roemly.blogspot.com/2008/06/event-listener.html - 101k Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 1 Sinkronisasi Mengapa menggunakan sinkronisasi threads? Bagaimanapun juga sebuah thread yang berjalan bersama-sama kadang-kadang membutuhkan resource atau method dari luar Butuh untuk berkomunikasi satu dengan yang lain sehingga dapat mengetahui status dan aktifitas mereka Contoh: Permasalahan Produser-Konsumer 1 class TwoStrings { 2 static void print(String str1, String str2) { 3 System.out.print(str1); 4 try { 5 Thread.sleep(500); 6 } catch (InterruptedException ie) { 7 } 8 System.out.println(str2); 9 } 10 } 11 class PrintStringsThread implements Runnable { 12 Thread thread; 13 String str1, str2; 14 PrintStringsThread(String str1, String str2) { 15 this.str1 = str1; 16 this.str2 = str2; 17 thread = new Thread(this); 18 thread.start(); 19 } 20 public void run() { 21 TwoStrings.print(str1, str2); 22 } 23 } 24 class TestThread { 25 public static void main(String args[]) { 26 new PrintStringsThread("Hello ", "there."); 27 new PrintStringsThread("How are ", "you?"); 28 new PrintStringsThread("Thank you ", 29 "very much!"); 30 } 31 } Contoh hasil: Hello How are Thank you there. you? very much! Mengunci sebuah object: Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu Java memperbolehkan penguncian terhadap sebuah object termasuk method-method-nya dengan menggunakan monitor Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil Sekali object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 2 Sinkronisasi sebuah method: Menggunakan keyword synchronized Dapat menjadi header dari pendefinisian method Dapat mensinkronisasi object dimana method tersebut menjadi anggota dari synchronized (<object>) { //statements yang akan disinkronisasikan } Contoh Synchronized Pertama 1 class TwoStrings { 2 synchronized static void print(String str1, 3 String str2) { 4 System.out.print(str1); 5 try { 6 Thread.sleep(500); 7 } catch (InterruptedException ie) { 8 } 9 System.out.println(str2); 10 } 11 } 12 class PrintStringsThread implements Runnable { 13 Thread thread; 14 String str1, str2; 15 PrintStringsThread(String str1, String str2) { 16 this.str1 = str1; 17 this.str2 = str2; 18 thread = new Thread(this); 19 thread.start(); 20 } 21 public void run() { 22 TwoStrings.print(str1, str2); 23 } 24 } 25 class TestThread { 26 public static void main(String args[]) { 27 new PrintStringsThread("Hello ", "there."); 28 new PrintStringsThread("How are ", "you?"); 29 new PrintStringsThread("Thank you ", 30 "very much!"); 31 } 32 } Contoh Hasil: Hello there. How are you? Thank you very much! Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 3 Contoh Synchronized Kedua 1 class TwoStrings { 2 static void print(String str1, String str2) { 3 System.out.print(str1); 4 try { 5 Thread.sleep(500); 6 } catch (InterruptedException ie) { 7 } 8 System.out.println(str2); 9 } 10 } 11 class PrintStringsThread implements Runnable { 12 Thread thread; 13 String str1, str2; 14 TwoStrings ts; 15 PrintStringsThread(String str1, String str2, 16 TwoStrings ts) { 17 this.str1 = str1; 18 this.str2 = str2; 19 this.ts = ts; 20 thread = new Thread(this); 21 thread.start(); 22 } 23 public void run() { 24 synchronized (ts) { 25 ts.print(str1, str2); 26 } 27 } 28 } 29 class TestThread { 30 public static void main(String args[]) { 31 TwoStrings ts = new TwoStrings(); 32 new PrintStringsThread("Hello ", "there.", ts); 33 new PrintStringsThread("How are ", "you?", ts); 34 new PrintStringsThread("Thank you ", 35 "very much!", ts); 36 }} Komunikasi Antar Thread: Methods Methods untuk komunikasi Interthread public final void wait() Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify atau notifyAll method dari object ini. Hal ini dapat menyebabkan InterruptedException. public final void notify() Membangunkan thread yang telah memanggil method wait dari object yang sama. public final void notifyAll() Membangunkan semua thread yang telah memanggil method wait dari object yang sama. Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 4 Komunikasi Antar Thread Contoh Produsen-Konsumen 1 class SharedData { 2 int data; 3 synchronized void set(int value) { 4 System.out.println("Generate " + value); 5 data = value; 6 } 7 synchronized int get() { 8 System.out.println("Get " + data); 9 return data; 10 } 11 } 12 class Producer implements Runnable { 13 SharedData sd; 14 Producer(SharedData sd) { 15 this.sd = sd; 16 new Thread(this, "Producer").start(); 17 } 18 public void run() { 19 for (int i = 0; i < 10; i++) { 20 sd.set((int)(Math.random()*100)); 21 } 22 } 23 } Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 5 24 class Consumer implements Runnable { 25 SharedData sd; 26 Consumer(SharedData sd) { 27 this.sd = sd; 28 new Thread(this, "Consumer").start(); 29 } 30 public void run() { 31 for (int i = 0; i < 10 ; i++) { 32 sd.get(); 33 } 34 } 35 } 36 class TestProducerConsumer { 37 public static void main(String args[]) 38 throws Exception { 39 SharedData sd = new SharedData(); 40 new Producer(sd); 41 new Consumer(sd); 42 } 43 } Contoh hasil: Generate 8 Generate 45 Generate 52 Generate 65 Get 65 Generate 23 Get 23 Generate 49 Get 49 Generate 35 Get 35 Generate 39 Get 39 Generate 85 Get 85 Get 85 Get 85 Generate 35 Get 35 Get 35 Contoh Produsen-Konsumen yang telah diperbaiki 1 class SharedData { 2 int data; 3 boolean valueSet = false; 4 synchronized void set(int value) { 5 if (valueSet) { //hanya dihasilkan jika mempumyai sebuah nilai 6 try { 7 wait(); 8 } catch (InterruptedException ie) { 9 } 10 } 11 System.out.println("Generate " + value); 12 data = value; 13 valueSet = true; 14 notify(); 15 } 16 synchronized int get() { 17 if (!valueSet) { 18 //producer belum memiliki suatu nilai 19 try { 20 wait(); 21 } catch (InterruptedException ie) { 22 } 23 } 24 System.out.println("Get " + data); 25 valueSet = false; 26 notify(); 27 return data; 28 } 29 } 30 31 /* Bagian kode tertentu tidak berubah. */ Pemrog. Berorientasi Objek **, Pertemuan Ke-12 Noviyanto Halaman 6 Contoh hasil: Generate 76 Get 76 Generate 25 Get 25 Generate 34 Get 34 Generate 84 Get 84 Generate 48 Get 48 Generate 29 Get 29 Generate 26 Get 26 Generate 86 Get 86 Generate 65 Get 65 Generate 38 Get 38 Generate 46 Get 46 Ringkasan Sinkronisasi Mengunci sebuah Object Keyword synchronized Method header Object Komunikasi Antar Thread (Interthread) Methods wait notify notifyAll