1 PENGANTAR JAVA Sejarah Singkat Perkembangan JAVA Proyek Java dimulai pada tahun 1991, ketika sejumlah insinyur perusahaan Sun yang dimotori oleh Jam...
Sejarah Singkat Perkembangan JAVA Proyek Java dimulai pada tahun 1991, ketika sejumlah insinyur perusahaan Sun yang dimotori oleh James Gosling mempunyai keinginan untuk mendesain sebuah bahasa komputer kecil yang dapat dipergunakan untuk peralatan konsumen seperti kotak tombol saluran TV. Proyek ini kemudian diberi nama sandi Green. Keharusan untuk membuat bahasa yang kecil , dan kode yang ketat mendorong mereka untuk menghidupkan kembali model yang pernah dicoba oleh bahasa UCSD Pascal, yaitu mendesain sebuah bahasa yang portable yang menghasilkan kode intermediate. Kode intermediate ini kemudian dapat digunakan pada banyak komputer yang interpreternya telah disesuaikan. Karena orang-orang Sun memiliki latar belakang sebagai pemakai unix sehingga mereka lebih menggunakan C++ sebagai basis bahasa pemrograman mereka, maka mereka secara khusus mengembangkan bahasa yang berorientasi objek bukan berorientasi prosedur. Seperti yang dikatakan Gosling ”Secara keseluruhan, bahasa hanyalah sarana, bukan merupakan tujuan akhir”. Dan Gosling memutuskan menyebut bahasanya dengan nama “Oak” (diambil dari nama pohon yang tumbuh tepat diluar jendela kantornya di Sun), tetapi kemudian nama Oak diubah menjadi java, karena nama Oak merupakan nama bahasa komputer yang sudah ada sebelumnya. Pada tahun 1994 sebagian besar orang menggunakan mosaic, browser web yang tidak diperdagangkan yang berasal dari pusat Supercomputing Universitas Illinois pada tahun 1993.( Mosaic sebagian ditulis oleh Marc Andreessen dengan bayaran $6.85 per jam, sebagai mahasiswa yang melakukan studi praktek. Di kemudian hari ia meraih ketenaran sebagai salah seorang pendiri dan pemimpin teknologi di netscape) Browser yang sesungguhnya dibangun oleh Patrick Naughton dan Jonathan Payne dan berkembang ke dalam browser HotJava yang kita miliki saat ini. Browser HotJava ditulis dalam Java untuk menunjukkan kemampuan Java. Tetapi para pembuat juga memiliki ide tentang suatu kekuatan yang saat ini disebut dengan applet, sehingga mereka membuat browser yang mampu penerjemahkan kode byte tingkat menengah. “Teknologi yang Terbukti” ini diperlihatkan pada SunWorld ’95 pada tanggal 23 mei 1995, yang mengilhami keranjingan terhadap Java terus berlanjut.
Karakteristik Java Sintaks Java merupakan pengembangan dari bahasa C/C++. Berikut adalah beberapa hal tentang pemrograman Java: 1. Bersifat protable dan platform independent. Program Java yang telah ditulis akan dapat dieksekusi di mesin apapun dan sistem operasi apapun tanpa harus mengubah sedikitpun dari program tersebut. 2. memiliki garbage collection yang dapat mendealokasikan memori secara otomatis. 3. menghilangkan sifat pewarisan berganda yang terdapat pafa C++. 4. Mengurangi pointer aritmetika. Pengaksesan lokasi memori secara langsung dengan menggunakan pointer memungkinakn program untuk melakukan suatu tindakan yang Java.Jamilah,SKom.,MT
1
tidak seharusnya atau tidak boleh dilakukan. Untuk mengurangi kemungkinan kesalahan seperti ini penggunaan pointer pada Java telah dibatasi dengan menggunakan reference. 5. memiliki array sejati. 6. mengurangi kerancuan antara pemberian nilai pada statement conditional. Kriteria “Kertas Putih” Java Penulis Java telah menulis pengaruh “Kertas Putih” yang menjelaskan tujuan rancangan dan keunggulannya. Kertas mereka disusun lewat 11 kriteria berikut : Sederhana (Simple) Syntax untuk Java seperti syntax pada C++ tetapi syntax Java tidak memerlukan header file, pointer arithmatic (atau bahkan pointer syntax), struktur union, operator overloading, class virtual base, dan yang lainnya. Jika anda mengenal C++ dengan baik, maka anda dapat berpindah ke syntax Java dengan mudah tetapi jika tidak, anda pasti tidak berpendapat bahwa Java sederhana. Berorientasi Objek (Object Oriented) Rancangan berorientasi objek merupakan suatu teknik yang memusatkan rancangan pada data (objek) dan interface. Fasilitas pemrograman berorientasi objek pada Java pada dasarnya adalah sama dengan C++. Feature pemrograman berorientasi objek pada Java benar-benar sebanding dengan C++, perbedaan utama antara Java dengan C++ terletak pada penurunanberganda (multiple inheritance), untuk ini Java memiliki cara penyelesaian yang lebih baik. Terdistribusi (Distributed) Java memiliki library rutin yang luas untuk dirangkai pada protokol TCP/IP sepetrti HTTP dan FTP dengan mudah. Aplikasi Java dapat membuka dan mengakses objek untuk segala macam NET lewat URL sama mudahnya seperti yang biasa dilakukan seorang programmer ketika mengakses file sistem secara lokal. Kuat (Robust) Java dimaksudkan untuk membuat suatu program yang benar-benar dapat dipercaya dalam berbagai hal. Java banyak menekankan pada pengecekan awal untuk kemungkinan terjadinya masalah, pengecekan pada saat run0time dan mengurangi kemungkinan timbulnya kesalahan (error). Perbedaan utama antara Java dan C++ adalah Java memiliki sebuah model pointer yang mengurangi kemungkinan penimpaan (overwriting) pada memory dan kerusakan data (data corrupt). Aman (Secure) Java dimaksudkan untuk digunakan pada jaringan terdistribusi. Sebelum sampai pada bagian tersebut, penekanan terutama ditujukan pada masalah keamanan. Java memungkinkan penyusunan program yang bebas virus, sistem yang bebas dari kerusakan. Netral Arsitektur (Architecture Neutral) Kompiler membangkitkan sebuah format file dengan objek arsitektur syaraf, program yang di kompile dapat dijalankan pada banyak prosesor, disini diberikan sistem run time dari Java.Jamilah,SKom.,MT
2
Java. Kompiler Java melakukannya dengan membangkitkan instruksi-instruksi kode byte yang tidak dapat dilakukan oleh arsitektur komputer tertentu. Dan yang lebih baiik Java dirancang untuk mempermudah penterjemahan pada banyak komputer dengan mudah dan diterjemahkan pada komputer asal pada saat run-time. Portabel (Portable) Tidak seperti pada C dan C++, di Java terdapat ketergantungan pada saat implementasi (implement dependent). ukuran dari tipe data primitif ditentukan, sebagaimana kelakuan aritmatik padanya. Librari atau pustaka merupakan bagian dari sistem yang mendefinisikan interface yang portabel. Interpreter Interpreter Java dapat meng-eksekusi kode byte Java secara langsung pada komputerkomputer yang memiliki interpreter. Dan karena proses linking dalam Java merupakan proses yang kenaikannya tahap demi tahapdan berbobot ringan, maka proses pengembangan dapat menjadi lebih cepat dan masih dalam penelitian. Kinerja Yang Tinggi (High Performance) Meskipun kinerja kode byte yang di interpretasi biasanya lebih dari memadai, tetapi masih terdapat situasi yang memerlukan kinerja yang lebih tinggi. Kode byte dapat diterjemahkan (pada saat run-time) de dalam kode mesin untuk CPU tertentu dimana aplikasi sedang berjalan. Multithreaded Multithreading adalah kemampuan sebuah program untuk melakukan lebih dari satu pekerjaan sekaligus. Keuntunga dari multithreading adalah sifat respons yang interaktif dan realtime. Dinamis Dalam sejumlah hal, Java merupakan bahasa pemrograman yang lebih dinamis dibandingkan dengan C atau C++. Java dirancang untuk beradaptasi dengan lingkungan yang terus berkembang. Librari dapat dengan mudah menambah metode dan variabel contoh yang baru tanpa banyak mempengaruhi klien. Informasi tipr run-time dalam Java adalah langsung (straigtforward).
Pemrograman Berorientasi Objek (PBO) Pemrograman Berorientasi Objek dimulai pertama kali dengan bahasa Semula yang dikembangkan di Scandinavia di pertengahan tahun 60-an. Simula utamanya digunakan untuk pemrograman simulasi, dimana adalah alamiah untuk memodelkan suatu entitas eksternal / diluar sistem perangkat lunak dan untuk memilih istilah-istilah untuk entitas-entitas tersebut dan tingkah lakunya. Simula memiliki sintak yang mirip dengan Pascal, tetapi programmer berfikir sedikit lebih berbeda ketika merancang suatu program yang akan dibuat dengan Simula. Sebuah ide dasar yang diperkenalkan dalam Simula adalah inheritance (pewarisan). Dalam Simula juga sudah dikenal objek (entitas) yang ada dalam sistem yang dimodelkan. Ada beberapa objek yang Java.Jamilah,SKom.,MT
3
dikumpulkan kemudian disebut ”Class”, dan tugas utama dari seorang perancang program dengan Simula adalah menentukan behaviour dari class tersebut. Elemen sebuah Objek: atribute dan behaviour Setiap objek selalu memiliki atribute dan behaviour yang dapat mengubah atribut tersebut. Sebagai contoh manusia memiliki atribut: umur, tinggi, berat dan sebagainya. Demikian pula manusia memiliki behaviour: menua, meninggi, makan (menambah berat badan) dan sebagainya. Behaviour juga dapat tidak mengubah sama sekali state dari objek tersebut, baik secara langsung maupun tidak langsung. Secara sederhana state bisa dianggap sebagai suatu kata benda karena sifatnya yang pasif, benda tersebut tidak melakukan operasi tetapi justru menjadi target atau bahan operasi. Demikian pul behaviour bisa dianggap sebagai kata kerja, karena ia berfungsi untuk menujukkan operasi apa yang dilakukan. Konsep Pemrograman Berorientasi Objek Ciri PBO adalah : 1. Enkapsulasi Enkapsulasi adalah suatu mekanisme untuk menyembunyikan atau memproteksi suatu proses dari kemungkinan interferensi atau penyalahgunaan dari luar sistem sekaligus menyederhanakan penggunaan system itu sendiri. Akses ke internal sistem diatur sedemikian rupa melalui seperangkat interface. Contoh kasus sepeda motor tadi, pada sistem pemindahan gigi transmisi, maka pengendara tidak perlu tahu detail dari bagaimana proses pemindahan gigi itu dilakukan oleh mesin, cukup tahu bagaimana menekan gigi transmisi itu. Pedal gigi transmisi yang diinjak pengendara itu merupakan interface (antar muka) pengendara dengan sistem transmisi sepeda motor. Dalam bahasa Java segala sesuatu adalah objek (everything is object). Setiap baris program yang ditulis programmer adalah merupakan bagian dari sebuah objek. Programmer juga dapat membangun sebuah objek yang disusun oleh objek-objek kecil, dimana masing-masing objek yang menyusunnya memiliki fungsi sendiri-sendiri. 2. Pewarisan (Inheritance) Sebagai manusia kita sebenarnya terbiasa untuk melihat objek yang berada disekitar kita tersusun secara hierarki berdasarkan class-nya masing-masing. Dari sini kemudian timbul suatu konsep tentang pewarisan yang merupakan suatu proses dimana suatu class diturunkan dari class lainnya sehingga ia mendapatkkan cirri atau sifat dari class tersebut. Perhatikan contoh hirarki berikut ini:
Java.Jamilah,SKom.,MT
4
Dari hirarki diatas dapat dilihat bahwa, semakin kebawah, class akan semakin bersifat spesifik. Class mamalia memiliki seluruh sifat yang dimiliki oleh binatang, demikian halnya juga Anjing, kucing dan Monyet memiliki seluruh sifat yang diturunkan dari class mamalia. Dengan konsep ini, karakteristik yang dimiliki oleh class binatang cukup didefinisikan didefinisikan dalam class binatang saja. Class mamalia tidak perlu mendefinisikan ulang apa yang telah dimiliki oleh class binatang, karena sebagai class turunannya, ia akan mendapatkan karakteristik dari class binatang secara otomatis. Demikian juga dengan class anjing, kucing dan monyet, hanya perlu mendefinisikan karakteristik yang spesifik dimiliki oleh class-nya masing-masing. Dengan memanfaatkan konsep pewarisan ini dalam pemrograman, maka hanya perlu mendefinisikan karakteristik yang lebih umum akan didapatkan dari class darimana ia diturunkan. 3. Polymorphism Polymorphism berasal dari bahasa Yunani yang berarti banyak bentuk. Dalam PBO, konsep ini memungkinkan digunakannya suatu interface yang sama untuk memerintah objek agar melakukan aksi atau tindakan yang mungkin secara prinsip sama namun secara proses berbeda. Dalam konsep yang lebih umum sering kali polymorphism disebut dalam istilah satu interface banyak aksi. Aturan Dasar Java Aturan Dasar dari penggunaan sintaks bahasa JAVA JAVA bersifat case-sensitive Secara umum JAVA mengabaikan spasi kosong (karakter yang tidak muncul pada layar, mis kosong, tab, baris baru) Brace { } adalah simbol pengelompokkan dalam JAVA yang enandai awal dan akhir bagian suatu program. Setiap pernyataan JAVA diakhiri dengan simbol ; Simbol // membuat sebuah baris komentar Simbol /* … */ membatasi bagian awal dan akhir suatu komentar Komentar javadoc khusus digunakan untuk men-generate dokumentasi HTML untukprogram Java Anda. Anda dapat menciptakan komentar javadoc dengan memulai baris dengan /** dan mengakhirinya dengan */. JAVA memiliki beberapa kata yang dicadangkan dan tidak bisa digunakan dalam ekspresi biasa. Kata-kata tersebut disebut keyword. Kelas pertama dalam sebuah program JAVA (disebut kelas pengendali) harus memiliki nama yang sama dengan file di mana ia disimpan.
Contoh program : // menampilkan sebaris text dengan multiple statement class salam2 { public static void main(String[] args) { System.out.print(“Selamat datang”); System.out.println(“ di JAVA programming”); }} Java.Jamilah,SKom.,MT
5
// menampilkan beberapa baris dengan sebaris statement class salam3 { public static void main(String[] args) { System.out.println(“Selamat datang\n di JAVA programming”); } } Identifier Identifier merupakan nama yang digunakan untuk menamai class, interface, variable dan method. Programmer dapat menentukan sendiri identifier yang akan digunakan. Hanya yang perlu diperhatikan adalah: - tidak ada batasan panjang, jadi identifier dapat dibuat dengan panjang karakter yang tidak terbatas. - Identifier harus diawali dengan huruf, underscore / garis bawah ( _ ) atau lambang dollar ($). Untuk selebihnya dapat digunakan karakter apapun, kecuali karakter yang digunakan sebagai operator oleh Java (*, +, -, /). - Bukan merupakan keyword yang telah dikenal oleh Java. Reserved Word / keywords Ini merupakan kata-kata yang telah dikenal oleh Java dengan memiliki arti khusus dalam program. Berikut ini adalah daftar kata-kata tersebut. Table 1 Daftar Kata (Keyword) yang dikenal dalam Java abstract Boolean break byte case catch Char Class const Continue default Do Double else Extends false Final finally float For goto If Implements import Instanceof int Interface long native New null Package Private protected Public return Short Static strictfp Super switch Synchronized this throw Throws transient True Try void Volatile while Tipe Data 1. Tipe data Primitif Bahasa pemrograman Java mendefinisikan delapan tipe data primitif. Mereka diantaranya adalah boolean (untuk bentuk logika), char (untuk bentuk tekstual), byte, short, int, long, double and float (floating point). Tabel Tipe Data Tipe Boolean Char Byte Java.Jamilah,SKom.,MT
Tipe data composite /reference Merupakan tipe data yang dibentuk dari tipe data primitive seperti array dan String.
Karakter Escape (Escape Sequence ) Karakter Fungsi \a Bunyi bell atau alert \b Mundur 1 spasi (backspace) \f Form feed (ganti halaman) \n New line (ganti baris) \r Carriage return (ke kolom pertama,baris yg sama \t Tabulasi horizontal \v Tabulasi vertical \0 Nilai kosong (null) \’ Tanda petik \” Petik ganada \\ Backslash Berikut adalah beberapa contoh penulisan literal: Contoh 178 0xA17 072 8864L 37.266 37.266D 87.363F 26.77E3 'c' True False
Tipe Data Int Int dalam bentuk hexa Int dalam bentuk octal Long Double Double Float Double Char Boolean Boolean
Variabel Ada 3 jenis variabel, yaitu : 1. variabel instance (objek) adalah variabel yang digunakan untuk mendefnisikan atribut dari objek tertentu dan dideklarasikan di luar definisi method.
Java.Jamilah,SKom.,MT
7
2. variabel kelas adalah variabel yang bersifat global terhadap kelas dan terhadap instance kelas. Untuk mendeklarasikan variabel kelas digunakan kata kunci static. Cont : static int jumlah static final int jumlah = 12; // untuk konstanta./ 3. Variabel local adalah variabel yang dideklarasikan dan dipakai dalam definisi method. Sintaks pendeklarasian variabel secara umum adalah sebagai berikut: Tipe_data nama_variable = nilai ; Contoh : int hitung; String kata = “Java”; Catatan: 1. Tipe data pada JAVA, tidak tergantung pada mesin komputer. 2. Character selalu diapit oleh tanda petik tunggal → ‘H’ 3. “H” → suatu string yang berisi sebuah karakter Konversi Tipe Numerik Jika salah satu operand bertipe double, operand yang lain akan diubah menjadi double pula. Jika salah satu operand bertipe float, operand yang lain akan diubah menjadi float pula. Jika salah satu operand bertipe long, operand yang lain akan diubah menjadi long pula. Perubahan : byte → short → int → long → float → double Sama halnya dengan int , short dan byte Type casting adalah istilah dimana suatu data dipaksa menjadi tipe data lain. Contoh : int x = 9; int y = 4; int z = x/y; Maka nilai z = 2.0 maka z diganti : double z = (double) x/y; maka z = 2.25; Constant (Konstanta) final final int PANJANG_SEGIEMPAT = 30; biasanya ditulis dengan huruf besar semua class constant ditulis dengan static final class Contoh { static final double G = 9.81; public static void main (String[] args) { System.out.println(G + “meter per detik”); }} Separator (Pemisah) Java.Jamilah,SKom.,MT
8
Simbol ()
Nama Kurung
{}
kurung kurawal
[]
kurung siku
; ,
titik-koma koma
.
titik
Fungsi Digunakan untuk menghimpun parameter dalam definisi dan pemanggilan method, juga digunakan untuk menyatakan tingkatan pernyataan, menghimpun pernyataan untuk pengaturan alur program dan menyatakan tipe cast. Digunakan untuk menghimpun nilai yang otomatis dimasukkan kedalam array, juga digunakan untuk mendefinisikan blok program, untuk cakupan class, method, dan lokal. Digunakan untuk menyatakan tipe array, juga digunakan untuk membedakan nilai array. pemisah pernyataan. Pemisah urutan identifier dalam deklarasi variabel, juga digunakan untuk mengaitkan pernyataan didalam pernyataan for. Dugunakan untuk memisahkan nama paket dari sub-paket dan class, juga digunakan untuk memisahkan variabel atau method dari variabel referensi.
Operation AND OR XOR Shift Kanan Shift Kiri Shift Kanan isi dengan nol
Unary Operator Operator ~ ++ --
Operation Unary NOT Minus Increment Decrement
Relational Operator Operator == != > < >= <=
Operation Equal To Not Equal To Greater Than Less Than Greater or Equal To Less or Equal To
Logical Operator Operator ! && || ?:
Operation Short-circuit NOT Short-circuit AND Short-circuit OR Operator ternary if-thenelse Preseden Operator Tertinggi () ++
[] --
Java.Jamilah,SKom.,MT
. ~
! 10
* + >> > == & ^ | && || ?: = Terendah
/ >>> >= !=
% << <
<=
op=
CONTROL FLOW
Percabangan
if – else Bentuk if-else menyebabkan eksekusi dijalankan melalui sekumpulan keadaan boolean sehingga hanya bagian tertentu program yang dijalankan. Bentuk umum pernyataan if-else : if (boolean expression) statement 1; [else statement 2; ] Klausa else bersifat optional, setiap statement dapat berupa satu statement tunggal atau dapat berupa satu blok statement yang ditandai dengan tanda {} (kurung kurawal). Boolean expression dapat berupa sembarang pernyataan boolean yang menghasilkan besaran boolean.
Break Java tidak memiliki pernyataan goto. Penggunaan goto adalah untuk membuat percabangan secara sembarang yang membuat program sulit dimengerti dan mengurangi optimasi compiler tertentu. Pernyataan break pada Java dirancang untuk mengatasi semua kasus tersebut. Istilah break mengacu kepada proses memecahkan blok program. Proses tersebut memerintahkan runtime untuk menjalankan program dibelakang blok tertentu. Untuk dapat ditunjuk blok diberi nama/label. Break juga dapat digunakan tanpa label untuk keluar dari suatu loop dan pernyataan switch. Penggunaan break menunjukkan bahwa kita akan keluar dari sutu blok program. Contoh break berlabel :
Java.Jamilah,SKom.,MT
11
int[][] numbers = {{1, 2, 3},{4, 5, 6},{7, 8, 9}}; int searchNum = 5; boolean foundNum = false; searchLabel: for( int i=0; i
Switch Pernyataan switch memberiikan suatu cara ubtuk mengirimkan bagian program berdasarkan nilai suatu variabel atau pernyataan tunggal. Bentuk umum pernyataan switch : switch (expression) { case value1 : Statement; break; case value2 : Statement; break; case valueN : Statement; break; default; } Expression dapat menghasilkan suatu tipe sederhana, dan setiap value yang disebutkan pada pernyataan case harus berupa tipe yang cocok. Pernyataan switch bekerja dengan cara membandingkan nilai expression dengan setiap nilai pada pernyataan case. Jika ada yang cocok maka urutan program yang ada di pernyataan case tersebut akan dijalankan, jika tidak ada yang cocok, program akan menjalankan default
Return Java menggunakan bentuk sub-routine yang disebut method untuk mengimplementasikan antarmuka prosedural ke class objek. Setiap saat dalam method dapat digunakan pernyataan return yang menyebabkan eksekusi mencabang kembali ke pemanggil method.
Java.Jamilah,SKom.,MT
12
Perulangan (Looping) Looping artinya mengulangi eksekusi blok program tertentu sampai tercapai kondisi untuk menghentikannya. Setiap perulangan memiliki 4 bagian : a. Inisialisasi, adalah program yang mengyiapkan bagian awal perulangan b. Badan program, adalah pernyataan yang ingin kita ulangi. c. Iterasi, adalah program yang sering digunakan untu penambahan atau penguranagn pencacah dan index. d. Terminasi, adalah pernyataan boolean yang diperiksa setiap kali selama perulangan dilaksanakan untuk melihat apakah perulangan sudah saatnya dihentikan.
While While adalah pernyataan perulangan yang paling mendasar pada Java. Penggunaan pernyataan while akan menyebabkan rekursi pernyataan secara terus menerus selama pernyataan booleannya bernilai true. Bentuk umum dari pernyataan while : [initialization;] while (termination) { body program ; [iteration;] }
do-while Penggunaan pernyataan do –while menyebabkan body program akan dieksekusi sekurang-kurangnya 1 kali walaupun pernyataan booleannya menghasilkan nilai false. Pemeriksaan terminasi dilaksanakan pada akhir program. Bentuk umum pernyataan do – while : [initialization;] do { body program; [iteration;] } while [termination];
for Pernyataan for adalah cara praktis untuk menyatakan suatu perulangan. Bentuk umum pernyataan for : for {initialization; termination; iteration ) body program; Jika keadaan awal tidak menyebabkan termination bernilai true maka pernyataan body program dan iteration tidak akan dijalankan.
Pernyataan koma Kadang-kadang ada keadaan dimana kita ingin memasukkan lebih dari satu pernyataan inisialisasi atau terminasi, Java menyediakan cara lain untuk menyatakan beberapa
Java.Jamilah,SKom.,MT
13
pernyataan sekaligus. Penggunaan koma untuk memisahkan pernyataan di batasi hanya untuk digunakan didalam tanda kurung untuk pernyataan for.
continue Pernyataan continue akan menghentikan iterasi yang bersangkutan tetapi program akan menjalankan sisa perulangan sampai dengan selesai. Bentuk labeled akan melanjutkan sebuah statement dengan melewati pengulangan yang sedang berjalan dari loop terluar yang diberi label (tanda). Contoh continue berlabel :
Pada contoh ini, pesan ke-2 tidak dicetak, saat j = 2 proses akan melanjutkan looping i karena statement continue akan melewati pengulangan yang sedang berjalan untuk melanjutkan looping terluar berdasarkan label yang ditunjuk “outerLoop”.
Java.Jamilah,SKom.,MT
14
ARRAY Array Dimensi satu Pendeklarasian Array : int[ ] nilaiMahasiswa; nilaiMahasiswa = new int [14]; Atau bisa juga :
int nilaiMahasiswa [] = new int[15]; Int [] nilai Mahasiswa = new int[15];
Bila nilai array langsung diberikan, maka penulisanyya tidak perlu menggunakan kata new. Penulisannya menjadi : int nilaiMahasiswa [] = {100,20,45,40,100}; Jika array tidak diberi nilai, maka elemen array diberi nilai 0. Mendapatkan besar array dapat dilakukan dengan nama_array.length. Contoh : class Larik { public static void main(String[ ] args) { int A[ ] = {1 , 2 , 3 , 4}; System.out.print(A.length); System.out.println(A[1]); }} Out: 42 Contoh2 : import java.io.* class input Array { public static void main(String[] args) throws IOException { String[] nama = new String[100]; BufferedReader masuk= new BufferedReader (new InputStreamReader(System.in)); System.out.print("masukkan banyak data:"); int pil = Integer.parseInt(masuk.readLine()); for (int i =1; i<= pil ; i++ ) { System.out.print ("masukkan nama ke : "+ i + “ “); nama[i]=masuk.readLine(); } } } Out : masukkan banyak data : 2 masukkan nama ke : 1 Lusiana masukkan nama ke : 2 Gracia Java.Jamilah,SKom.,MT
15
Array Multi Dimensi Array multi dimensi merupakan array yang berisi array. Pendeklarasiannya : Dimensi 2 : int matriks [ ] [ ] = new int [2][3] ; int matriks [][] = { {5,2,3},{4,5,6}}; int mat[][2] = {3,4,5,6,3,4,5,5,6,9}; Dimensi 3 : int nilai[][][] = new int[2][2][3]; int nilai[][][] = {{{1,2,3},{3,4,5}},{{4,5,7},{3,4,5}}} Contoh 1: import java.io.*; class Array { BufferedReader a = new BufferedReader(new InputStreamReader(System.in));; int [][]mat = new int[2][3]; Array() throws Exception //membuang eksepsi karena inputan { for (int i =0; i< 2 ; i++ ) { for (int j =0; j< 3 ; j++ ) { System.out.print("Masukan elemen mariks ke "+ i +" "+ j +" :"); mat[i][j] = Integer.parseInt(a.readLine()); } } }}
class inputArray { public static void main(String[] args) throws Exception { Array a = new Array(); //menjalankan konstruktor array }} Out : Masukan elemen matriks ke 0 0 : 2 Masukan elemen matriks ke 0 1 : 4 Masukan elemen matriks ke 1 0 : 2 Masukan elemen matriks ke 1 1 : 6
Contoh 2 : import java.util.*; import java.io.*; class test { public static void main(String args[]) throws Exception{ Java.Jamilah,SKom.,MT
16
Scanner a = new Scanner(System.in); BufferedReader b = new BufferedReader(new InputStreamReader(System.in)); String nama[] = new String[100]; int nilai[]=new int[4]; int rata[]=new int[100]; System.out.print("Jumlah Mhs : "); int n = a.nextInt(); for(int i = 0;i
30
void menangis(){System.out.println("aduh..aduh…."); } static void berjalan() {System.out.println("Tak..tik..tuk.."); } } class Anak extends Bapak { Anak() { super(1); super.umur = 100; System.out.println("Ini kelas Anak"); } void tidur() { super.menangis(); System.out.println("errr…errr…err…"); } void tertawa ( ) { System.out.println("Hihihi..hihi…."); super.tertawa();} } class utama { public static void main(String [ ] args) { Bapak Andi = new Bapak(); Anak Tama = new Anak(); Andi.tertawa(); Tama.umur = 19; Tama.makan(); Tama.tidur(); Bapak.berjalan(); System.out.println("umur Tama = "+ Tama.umur +" berat = "+ (Tama.berat + 50) ); } } Output :
Class Abstract Merupakan suatu class yang memiliki minimal satu abstract methode (method yang belum terdapat implementasinya) dan tidak dapat diinstantiasi. Kelas turunan harus mengimplementasikan semua method abstract. Kata kunci abstract tidak dapat digunakan untuk konstruktor dan method static. Contoh 4: abstract class manusia { int tinggi, berat; Java.Jamilah,SKom.,MT
31
abstract void marah( ) ; void bernyanyi(){ System.out.println(“Tralala..lilili”); } } class bapak extends manusia { void marah() { System.out.println(“errr…rrrr”); } //implementasi method } class utama{ public static void main(String args[]) { //manusia putri = new manusia(); tidak diijinkan membuat objek kls manusia. bapak budi = new bapak(); // diperbolehkan membuat referensi objek manusia putri; putri = budi; budi.marah(); budi bernyanyi(); } } out :
errr…rrr Tralala..lilili
Final Class Merupakan kelas yang tidak dapat diturunkan lagi menjadi kelas baru. Contoh : final class manusia { int tinggi, berat; void bernyanyi(){ System.out.println(“Tralala..lilili”); } } class bapak extends manusia { }// salah Ket : pernyataan class bapak extends manusia tidak lagi diperbolehkan karena class manusia memiliki modifier final. Method Final Method final pada superclass merupakan method yang tidak dapat lagi dimiliki pada subclass, artinya method tersebut tidak dapat dioverride (diperbaharui) pada kelas turunan. Contoh : class manusia { final void bernyanyi(){ System.out.println(“Tralala..lilili”); } } class bapak extends manusia { // void bernyanyi() { System.out.println(“Trilili..Lalala”); }salah } ket :
Pada kelas bapak tidak boleh mengimplementasikan ulang method bernyanyi karena pada kelas manusia method tersebut final.
Java.Jamilah,SKom.,MT
32
Inner Class Merupakan kelas yang didefinisikan di dalam kelas. Kelas inner dapat mengakses data dan method dari kelas luar, meskipun data dan method tersebut bersifat private. Sebaliknya kelas luar tidak dapat mengakses data atau method dari kelas dalam yang bersifat private. Ketentuan kelas inner : a. Kelas Luar yang mnegandung kelas inner bila dikompilasi akan menghasilkan dua file yaitu Luas.class dan Luas$Inner.class. b. Kelas Inner boleh tidak diberi nama disebut Anonymous Inner. c. Pada non-static, pembuatan objek inner class bila dilakukan di dalam method static, maka harus membuat objek kelas luar terlebih dahulu. Contoh : Luar a = new Luar(); // membuat objek kelas luar Dalam.Luar b = a.new Dalam(); // membuat objek kelas Dalam Bila instantiasi dilakukan pada method non-static dari kelas luar, maka dapat dilakukan secara langsung seperti biasa. Contoh : Dalam b = new Dalam(); d. Jika kelas Inner bersifat static, maka objek milik kelas Inner dapat dibuat sendiri tanpa melalui kelas luarnya tetapi kelas inner tidak dapat mengakses atribut ataupun method non-static milik kelas luar. Contoh 5 : class Luar { private int c = 10; class Dalam { private int d = 100; void show() { System.out.println(“Nilai c = “+c +”d = “+d); } } void tampil(){ System.out.println(“ Kelas luar c = “+c); //System.out.println(“dari kelas luar d = “+d); tidak diijinkan krn d private } } class test{ public static void main(String[]args) { Luar a = new Luar(); //Dalam b = new Dalam(); tidak diperbolehkan karena inner non-static Luar.Dalam b = a.new Dalam(); a.tampil(); b.show(); } } out :
Nilai c = 10 d = 100 Kelas luar c = 10
Java.Jamilah,SKom.,MT
33
Bila pembuatan objek kelas dalam dilakukan dalam method non-static milik kelas luar maka menjadi : class Luar { private int c = 10; class Dalam { private int d = 100; void show() { System.out.println("Nilai c = "+c +" d = "+d); } } void tampil(){ Dalam b = new Dalam(); b.show(); } } class test{ public static void main(String[]args) { Luar a = new Luar(); a.tampil(); }} Out : nilai c = 10 d = 100 Static Inner class Pada static inner class pembuatan objek dapat dilakukan langsung tanpa harus melalui kelas luar. Tetapi kelas inner tidak dapat menggunakan data atau method non-static pada kelas luar. Contoh 6 : class Luar { int c = 10; static int e = 5; static class Dalam { private int d = 100; void show() { // System.out.println("Nilai c = "+c ); salah karena c non-static System.out.println("Nilai d = "+d +" dan e = "+e); } }} class test{ public static void main(String[]args) { Luar.Dalam b = new Luar.Dalam(); b.show(); }} Output:
Java.Jamilah,SKom.,MT
34
PACKAGE DAN INTERFACE
Package adalah container class yang digunakan untuk menjaga ruang nama class tetap terbagibagi. Package disimpan secara hirarkis dan secara eksplisit diimpor ke dalam definisi class baru. Package sangat berguna untuk : - memungkinkan kita mengoorganisir kelas2 ke dalam unit-unit. - Mengurangi masalah yang timbul akibat konflik nama. Fasilitas Pakage merupakan mekanisme penamaan dan kendali atas ketampakan data dan metoda. Package didefinisik an dengan menambahkan baris: package ; pada awal file. Jika sebuah kelas tidak mempunyai package maka akan masuk ke package default. File-file class yg tergabung dalam satu package harus disimpan pd satu direktori dg nama direktori adalah nama package. Kelas yang berasal dari suatu package diakses dengan menggunakan nama package dan nama kelas. Misal points.Point (kelas Point yang terdapat pada package points). Kelas yang berasal dari suatu package dapat diakses langsung dengan menggunakan nama kelas dengan cara menggunakan import Package & enkapsulasi Package juga merupakan mekanisme untuk membatasi scope sebuah variabel/method/class variabel/method/class yang tidak memiliki access modifier (public/private/protected) memiliki scope package, yaitu hanya dapat diakses oleh class lain yang berada dalam satu package variabel/method dengan access modifier protected dapat diakses oleh class lain yang berada dalam satu package dan kelas turunan pada package yang berbeda. Modifier di kelas & Package Segala sesuatu yg didekalrasikan public dpt diakses dari manapun Segala sesuatu yg dideklarasikan private tidak dpt diakses diluar kelasnya Ketika modifier tidak ditulis secara eksplisit (menjadi default) maka data dan method itu akan tampak di subkelas-subkelas, dan kelas lain dalam satu paket Jika data dan metoda hanya ingin dilihat pd subkelas secara langsung modifier yg digunakan protected Level tertinggi adalah paket yang disebut Java (built-in) yang mencakup kelas-kelas : a. lang : berisi fungsionalitas bahasa yang paling dasar. b. applet : kelas dasar untuk seluruh applet. c. awt : kelas untuk pengembangan antarmuka grafis (Abstrac Windowing Toolkit). d. io : untuk operasi file Input/Output e. net : untuk operasi jaringan Java.Jamilah,SKom.,MT
35
f. util : berisi utilitas-ultilitas yang penting. BU : package nama pkg1[.pkg2[.pkg3]] ; Contoh 1 : package Paketku.Display ; public class Displayku { public void suara() {System.out.print(“Test package”); } keterangan :
}
buat class Displayku (file Displayku.java) di dalam package Display atau Displayku simpan di dalam folder C:\Paketku\Display.
Statement Import Untuk mengimport kelas dari suatu paket, kita menggunakan perintah import. BU : import package1[.package2].nama_kelas ; Mis : import Paketku.Display.Displayku; import java.io.* ; //mengimport semua kelas yang terdapat dalam java.io Conflik nama : import hariclass.*; import idoclass.*; keduanya mempunyai class Namaku, pembuatan obyek :
Namaku a= new Namaku(); // salah hariclass.Namaku a = new Namaku(); // benar
Penulisan : import java.util.*; class MyDate extends date { …. ………………….. } bila tanpa statemen import dapat dituliskan menjadi class MyDate extends java.util.date { ……………….. }
Hak akses pada package Class yang sama Subclass package yg sama Non subclass p. yg sama Subclass beda package Non subclass beda package
Private V X X X X
Tanpa pengubah V V V X X
Protected V V V V X
Public V V V V V
V : Dapat diakses Java.Jamilah,SKom.,MT
36
X : tidak dapat diakses Contoh : Bandingkan dengan program pada contoh 3 materi inheritance Susunan folder D:\uji\uji1 Ket : Simpan file utama.java pada drive C. Simpan file Anak.java pada C:\uji Simpan file Bapak.java pada C:\uji\uji1 Compile C:\javac utama.java Untuk class yang mengimport package harus memiliki hirarki yang lebih tinggi atau sama bila mempunyai path yang sama. package uji.uji1; public class Bapak{ public int umur, berat = 60; public Bapak() { System.out.println("Ini kelas Bapak"); } public Bapak(int a) { System.out.println("Ini kelas Bapak dengan nilai a"); } public void tidur() { System.out.println("zzz…zzzz…zzzz"); } public void tertawa( ) { System.out.println("Huahaha…haha.."); } public void makan() { System.out.println("Nyam..");} protected void menangis(){System.out.println("aduh..aduh…."); } public static void berjalan() {System.out.println("Tak..tik..tuk.."); } } package uji; import uji.uji1.*; public class Anak extends Bapak { public Anak() { super(1); super.umur = 100; System.out.println("Ini kelas Anak"); } public void tidur() { super.menangis(); System.out.println("errr…errr…err…"); } public void tertawa ( ) { System.out.println("Hihihi..hihi…."); super.tertawa();} } import uji.*; import uji.uji1.*; class utama { public static void main(String [ ] args) { Bapak Andi = new Bapak(); Anak Tama = new Anak(); Andi.tertawa(); Tama.umur = 19; Java.Jamilah,SKom.,MT
Ket : Untuk dapat memanggil variabel dan fungsi dari kelas yang berbeda paket/folder dan bukan kelas turunan, maka method/variabel tersebut harus dideklarasikan public. Contoh pada statemen Andi.tertawa(); di kelas utama, maka method tertawa pada kelas Bapak harus public. Sedangkan jika method atau variabel tersebut dipanggil dari kelas turunan maka dapat diberi hak akses protected. Contoh pada statement super.menangis(); di kelas Anak maka method menangis pada kelas Bapak dapat diberi hak akses protected. Kelas Anak meng-extends kelas Bapak yang terdapat pada folder uji\uji1, maka terlebih dahulu harus meng-import uji.uji1. Hal ini Berlaku untuk semua yang mengakses kelas dalam paket yang berbeda.
Antarmuka ( Interface) Adalah eksplisit suatu kumpulan methode yang dapat diipmlementasikan class tanpa implementasi sesungguhnya yang berhubungan dengan spesifikasi tersebut. Suatu class dapat mengimplementasikan antarmuka dengan jumlah tak terbatas, meskipun hanya diturunkan dari 1 superclass. Untuk menggunakan interface, class harus mengimplementasikan interface tersebut. Antarmuka : - tanpa variabel instance - method dideklarasikan tanpa isi dan konstanta - kelas yang mengimplementasikan sebuah interface harus menyediakan semua method yang disebutkan dalam interface tersebut. Bentuk umum : [modifier] interface nama+interface { [isi interface] } Java.Jamilah,SKom.,MT
38
Modifier : public atau default Contoh : interface Coba{ void method1 ( int nilai); int A = 5; String B = “Sukses”; } class Test implements Coba{ void method1 (int n) { System.out.println(“callback called with “ + n +A); public static void main (Sting args[]) { Test c = new Test(); c. method1(42); System.out.println(B); }
out :
callback called with 425 Sukses
Apabila suatu class mengimplementasikan interface maka semua konstanta dari interface akan dimiliki oleh oleh class. Kelas yang mengimplement interface harus mengimplementasikan semua method pada interface. Interface harus dideklarasikan public dan secara default merupakan static dan final sedangkan method dlam interface otomatis selalu public dan abstract( tidak ada definisinya). Pewarisan pada interface Berdasarkan contoh sebelumnya interface Coba : interface Coba2 extends Coba { void method2(); void method3(); } maka kelas yg mengimplements interface Coba2 harus mengimplementasikan semua method pada interface Coba dan Coba2, yaitu method1(), method2(), dan method3().
Java.Jamilah,SKom.,MT
39
EXCEPTION Exception adalah pesan yang sengaja dilemparkan oleh Java Virtual Mecine ketika terjadi kegagalan dalam menjalankan statement. Ecxeption merupakan keadaan tidak normal yang muncul pada suatu bagian program pada saat dijalankan. Dalam Java Excetion adalah sebuah objek dari kelas-kelas yang diturunkan dari Throwable. Class Throwable memiliki 2 subclass, yaitu Error dan Exception. Error ditunjukkan dan ditanganni secara internal oleh JVM. Sedangkan class yang dapat ditangani merupakan turunan dari Exception. Beberapa keadaan yang dapat dilaporkan disebabkan oleh kesalahan program/desain program, diantaranya : NullPointerException : dilemparkan jika Anda memanggil sebuah metode dari sebuah variable yang bernilai null FileNotFoundException : dilemparkan jika anda mencoba mengakses sebuah file tidak ada. ArrayOutOfBondException : dilemparkan jika Array melebihi batas SQLException : dilemparkan jika terjadi kesalahan/ kegagalan berinterkasi dengan basis data. ClassCastException : dilemparkan jika anada mencoba mencasting obyek lain yang tidak sesuai. Penanganan Eksepsi Try-Catch Bentuk : try{…..} catch() {….} Di dalam blok try merupakan kode program yang ingin dilindungi. Catch enentukan eksepsi yang ingin ditangkap. Bolk catch untuk mendefinisikan kode program yang akan dijalankan bila terjadi eksepsi tersebut. Jika terjadi kesalahan makan blok catch akan diabaikan. Contoh tanpa penanganan : class cobaException { public static void main(String args[]) { int bil = 10; System.out.println( bil / 0 ); } } Output : Exception in thread “main” java.lang.ArithmeticException : / by zero At cobaException.main(cobaException.java:4) Contoh dengan Try-Catch class cobaException { public static void main(String args[]) { int bil = 10; try { System.out.println( bil / 0 ); } Java.Jamilah,SKom.,MT
Catch majemuk 1 blok try dapat menggunakan lebih dari satu blok catch Contoh : class catchMajemuk { public static void main(String args[]) { int a = args.length; string b[ ] = (“a”,”b”,”c”}; try { System.out.println(40/a); System.out.println( b[3] ) ; } catch(ArithmeticException ai) { System.out.println(“Ada pembagian dengan nol”);} catch(ArrayIndexOutOfBoundsException n) { System.out.println(“Array melebihi kapasitas”); } catch(Exception e) { System.out.println(“Ada error”); } } } C:\ java catchMajemuk Output : Ada pembagian dengan nol C:\ java catchMajemuk 2 Output : 40 Array melebihi kapasitas Ket : Pada output yang pertama tidak terdapat argument, maka a yang menyimpan panjang args bernilai 0 sehingga terdapat pembagian nol. Catch yang pertama menangkap pembagian 40/a yaitu 40/0. Karena eksepsi telah ditangkap oleh blok catch yang pertama, maka blok catch yang kedua tidak dijalankan lagi. Pada output yang kedua terdapat argument sehingga panjang a bernilai 1,. maka eksepsi yang tertangkap adalah ArrayIndexOutOfBoundsException karena index array ke-3 tidak ada.
public static void main(String args[]) { int a = args.length; try { System.out.println(40/a); dalam(); } catch(ArithmeticException ai) { System.out.println("Ada pembagian dengan nol");} catch(Exception e) { System.out.println("Ada error"); } } } Output sama dengan contoh catchMajemuk. Prosedur memiliki penanganan try-catchnya sendiri.
Throw Digunakan untuk melemparkan suatu eksepsi. Pertama kita harus mendapatkan penanganan dalam suatu instant Throwable, melalui suatu parameter ke dalam bagian catch, atau dengan menggunakan operator new. Bentuk umum : throw Throwableinstance; Setelah exception dilemparkan oleh throw, program akan mencari blok try-catch yang cocok. Contoh : class cobaThrow{ Static void coba() { try {throw new NullPointerException(“Demo”); } catch(NullPointerException e) { System.out.println(“tertangkap dalam dalam method coba”); throw e; } public static void main(String args[]) { try { coba(); } catch(NullPointerException e) { System.out.println(“Tertangkap lagi dalam main: “ +e) ; } } } output :
}
tertangkap dalam method coba Tertangkap lagi dalam main : java.lang.NullPointerException :Demo
Ket : pada method coaba sudah tertangkap adanya eksepsi sehingga blok catch dijalankan. Kemudian eksepti tersebut dilemparkan kedalam main yang memanggilnya maka akan tertangkap lagi dalam blok try-catch yang sesuai sehingga blok catch pada main menangkap lagi eksepsi pada method coba.
Throws Dipakai untuk menyatakan sebuah method yang mungkin melemparkan exception yang tidak ditanganinya sendiri. Contoh : class cobaThrows { static void fungsi() throws Exception { String b[] ={"a","b","c"};
Finally Blok finally digunakan bersamaan dengan blok try-catch. Blok finally akan selalu dieksekusi baik ada eksepsi atau tidak sebelum program berakhir. Dalam pemanggilan suatu methode, finally disksekusi sebelum methode kembali. Contoh : class cobaFinally { public static void main(String args[]) { int a = 10; try { System.out.println(a / 0); } catch(ArithmeticException ai) { System.out.println(“Ada pembagian dengan nol”);} finally { System.out.println(“Finally selalu dieksekusi”); } } } Output : Ada pembagian dengan nol Finally selalu dieksekusi
Subclass Exception Kita dapat membuat class baru yang mewarisi class Exception dari java.lang.Exception. Contoh : class salah extends Exception { salah(String a) //gunakan konstruktor { super(a); // memanggil kontuktor pada kelas Exception dengan mengirim String } } class ujiTest{ static void hitung(int a) throws salah{ System.out.println(“hitung dengan nilai a = “ +a); if (a > 3) throw new salah(“salah disengaja ko”); System.out.println (“Kondisi normal”) ; } public static void main(String args[]) {
hitung dengan nilai a = 1 Kondisi normal Hitung dengan nilai a = 4 Terdapat eksepsi salah : salah disengaja ko
MULTITHREADING
Thread (lightweight process raut execution context) adalah sebuah singlesequential flow control di dalam program. Secara sederhana, thread adalah sebuah sub program yang berjalan di dalam program. Sebuah thread mempunyai awal dan akhir. Multhithreading adalah program yang mempunyai beberapa flow of control yang berjalan secara konkuren atau pararel. Scheduler JVM mendukung : a. preemptive multithreading, suatu thread prioritas tinggi bisa menyeruak masuk dan menginterupsi thread yang sedang beraksi. b. non-preemptive (cooperative) multithreading, thread yang sedang beraksi tidak dapat diinterupsi. Ada dua macam thread dalam Java, yaitu : 1. Daemon thread, merupakan thread yang siklus hidupnya tergantung pada thread utama. Apabila thread utama berakhir maka otomatis thread-thread daemon juga berakhir. 2. User thread, apabila thread utama berakhir maka user thread akan terus dijalankan. Daur hidup thread : newborn thread diinstantiasi, sebuah ruangan di telah dialokasikan untuk thread ini dan telah menyelesaikan tahap inisialisasi. Pada state ini, timerThread belum masuk dalam skema penjadwalan. …. Thread coba = new Thread ( ); …. Runnable Sebuah thread berada dalam skema penjadwalan akan tetapi dia tidak sedang beraksi. ….. coba.start() Running Pada state ini, thread sedang beraksi. Jatah waktu beraksi ditentukan oleh thread scheduler. Thread yang berada dalam state ini dapat juga lengser secara sukarela, dan masuk kembali ke status runnable, sehingga thread lain yang sedang menunngu giliran Java.Jamilah,SKom.,MT
44
memperoleh kesempatan untuk beraksi. Tindakan thread yang lengser secara sukarela disebut dengan yield-ing. public void run ( ){ … Thread.yield(); …. } Blocked Pada tahap ini thread sedang tidak beraksi dan diabaikan dalam penjadwalan. Suatu thread terblok jika : a. Thread itu tidur untuk jangka waktu tertentu. Thread.sleep(3000); // tidur selama 3000milisecond = 3 menit. b. Thread itu di-suspend( ) Thread yang ter-suspend bisa masuk kembali ke ruunable bila ia di resume. ………. timerThread.suspend( ); // thread memasuki state blok timerThread.resume( ); // thread memasuki state runnable … c. Thread tersebut memanggil method wait( ) dari suatu objek yang sedang ia kunci. Thread tersebut bisa kembali ke ruunable bila ada thread lain yang memanggil method notify( ) atau notifyAll( ) dari objek tersebut. d. Bila thread ini menunggu selesainya aktivitas yang berhubungan dengan I/O. e. Bila thread mencoba mengakses critical section dari suatu objek yang sedang dikunci oleh thread lain. Critical section adalah segmen dalam kode, bisa berupa method maupun blok dimana beberapa thread yang berbeda mengakses objek yang sama. Dead Suatu thread secara otomatis disebut mati bila method run()-nya sudah diselesaikan. Suatu thread juga bisa dead bila ia di stop( ). Untuk mendefinisikan thread ada dua cara, yaitu : 1. Membuat subclass dati Thread 2. Mengimplementasikan Interface Runnable. 1. Thread dengan membuat subclass dari java.lang.Thread : public class Coba1 extends Thread { String nama; coba1(String nm) { nama = nm ; } public void run ( ) { for(int i = 0; i<100; i++) { System.out.print (nama); } } public static void main (String args[ ]) { Thread t = Thread.currentThread(); //mendapatkan thread yg sedang berjalan System.out.println(t); t.setName(“Threadku”); System.out.prinln(t); //merubah nama thread coba1 t1 = new coba1(“A”); Java.Jamilah,SKom.,MT
45
coba1 t2 = new coba1(“B”); coba1 t3 = new coba1(“C”); t1.start(); //mejalankan method run t2.start(); t3.start(); }} Out program diatas Program akan memberikan kluaran yang berbeda tiap kali eksekusi. Misal : Thread[main,5,main] Thread[Threadku,5,main] AAAAAAAABBCCCCBCABBCCABBBBCCBC………….AABBBB 2. Thread dengan mengimplementasikan Interface Runnable Bentuk : Thread objek = new Thread(Objekrunnable,<String name>); Objek.start(); atau new Thread(Objekrunnable,<String name>).start(); Contoh : public class Coba2 implements Runnable { String nama; Coba2 (String nm) { nama=nm; Thread objek = new Thread(this) ; objek.start(); } public void run ( ) { for(int i = 0; i<100;i++) { System.out.print (nama); } } public static void main (String args[ ]) { Coba2 t1 = new Coba2(“A”); Coba2 t2 = new Coba2(“B”); Coba2 t3 = new Coba2(“C”); }} Output sama dengan contoh program pertama. ket : untuk menjalankan thread, lakukan dengan memanggil method start(). Saat start() dijalankan maka sebenarnya mehod run() dari class dijalankan. Jenis thread ada dua,yaitu : a. Daemon merupakan thread yang siklus hidupnya tergantung pada thread utama (main). Bila thread induk berakhir, maka thread daemon juga berakhir. b. User merupakan thread yang memiliki siklus tidak tergantung pada siklus thread utama. apabila thread utama berakhir maka user thread akan terus dijalankan. Contoh : Java.Jamilah,SKom.,MT
46
import java.io.*; public class user extends Thread { String nama; user(String nm) { super(nm); /**menjalankan thread dengan sekali instantiasi*/ nama = nm ; start(); } public void run ( ) { while(true) { System.out.print (nama); } } public static void main (String args[ ]) { user t1 = new user("A"); user t2 = new user("B"); user t3 = new user("C"); try{ System.in.read(); System.out.println(" Tombol enter ditekan");} catch(IOException o) {System.out.println(o);} System.out.println("selesai"); }} Apabila dijalankan maka program ini akan menampilkan A, B, dan C secara bergantian. Bila kita menekan tombol enter maka akan keluar : Tombol enter ditekan selesai Setelah thread utama yang menjalankan method main berakhir maka thread yang telah dibuat akan terus berjalan karena merupakn tipe user thread. Untuk menghentikan tekan tombol Control+C. Untuk menjadikan suatu thread menjadi daemon thread, gunakan method setDaemon(true). Misal pada contoh1 pada method Coba1(String nm) menjadi : Coba1(String nm) { super(nm); nama = nm ; setDaemon(true) ; start(); } maka ketika menekan enter program berhenti termasuk semua thread-thread yang ada. Sinkronisasi Satu atau lebih thread membutuhkan akses yang hampir bersamaan ke suatu sumber daya terbagi, maka thread-thread tersebut perlu sangat memperhatikan agar hanya ada satu yang mengakses dalam satu saat. Java menyediakan dukungan tingkat bahasa yang unik untuk sinkronisasi yang disebut monitor. Monitor adalah suatu objek yang digunakan sebagai kunci eksklusif untuk kepentingan bersama. Cara untuk memasuki suatu monitor objek adalah dengan memanggil suatu method yang ditandai dengan kata kunci synchronize. Bentuk : synchronize(