PENGENALAN OOP
2. Contoh Program Java
6.4 Pengertian dan implementasi instance dalam Java CLASS :
Referensi Objek
Class mendefinisikan bentuk dan sifat suatu objek.setiap class baru yang anda dapat buat menambahkan tipe lain yang dapat diperlakukan sebagai tipe sederhana. Jadi, jika Anda mendeklarasikan variabel baru, Anda dapat menggunakan nama suatu class sebagai tipenya. Variabel seperti itu kemudian merujuk pada instans atau objek class tersebut. Variabel-variabel ini dikenal sebagai referensi objek. Semua referensi objek juga cocok dengan instan sub-class dari tipe-tipe yang dideklarasikannya. Seperti kita menyatakan byte untuk variabel yang dideklarasikan int, Anda boleh juga mendeklarasikan sebuah variabel sebagai Object dan menyimpan sebuah referensi ke suatu instans dari sembarang sub-class Object.
Variabel Instans
Data dienkapsulasi dalam suatu class dengan mendeklarasikan variabel di antara tanda kurung kurawal deklarasi class. Variabel yang dideklarasikan dalam cakupan ini dikenal sebagai variabel instans. Cara mendeklarasikan variabel instans sama persis dengan cara yang kita lakukan untuk mendeklarasikan variabel lokal dalam contoh-contoh sebelumnya, kecuali Anda mendeklarasikannya di luar cakupan method tertentu, seperti main.
Contohnya berikut ini adalah program yang mendeklarasikan class dengan nama Point dengan dua variabel instans integer bernama x dan y.
class Point { int x , y; }
82 Operator new
Operator new menghasilkan instans tunggal dari suatu class dan menghasilkan referensi ke objek tersebut. Berikut ini contoh sebuah instans baru dari Point yang dibuat dan disimpan dalam variabel p.
point p = new point()
Di sini p adalah referensi ke sebuah instans dari Point.
Berikut ini contoh yang menghasilkan objek Point tunggal , tetapi menciptakan dua variabel yang merujuk kepadanya.
Point p = new point(); Pointp2 = p;
Perubahan apapun ke objek yang dirujuk p2 akan mempengaruhi objek yang sama yang dirujuk oleh p. Pernyataan p ke p2 tidak mengalokasikan memori atau menyalin bagian apapun dari objek asli. Kenyataannya , pernyataan untuk p pada baris kedua contoh di atas akan melepaskan kaitan p dari objek asli tanpa mempengaruhi objeknya, seperti contoh berikut
Point p = new point(); Point p2 = p ;
P = null;
Meskipun p telah dibuat null , p2 tetap menunjuk ke objek yang dibuat dengan operator new.
Operator Dot (.)
Operator dot (.) digunakan untuk mengakses variabel instans dan method di dalam objek. Berikut ini bentuk umum untuk mengakses variabel instans dengan operator dot.
0bjectreference . variablename
Di sini objectreference adalah referensi ke suatu objek dan variablename adalah nama variabel instans di dalam objek yang ingin anda akses.
Cuplikan program berikut ini menunjukkan bagaimana operator dot dapat digunakan untuk menyimpan suatu ke dalam variabel instan.
p.x = 10 ; p.y = 20 ;
83 Baris program berikut ini menunjukkan bagaimana merujuk ke suatu nilai variabel instans dengan operator dot.
System.out.println("x = " + p.x + " y = " + p.y); Deklarasi method
Method dideklarasikan di dalam definisi class di tingkat yang sama dengan variabel instans. Anda harus memanggil method dalam konteks instans tertentu class tersebut. Method dapat merujuk langsung ke variabel instans tanpa menggunakan operator dot seakan-akan mereka itu variabel local yang dideklarasikan di luar cakupan.
Method dideklarasikan untuk memiliki nilai keluaran dengan tipe tertentu dan sekumpulan parameter masukan.. Bentuk umum deklarasi method adalah :
type method name (formal-parameter-list) { method-body;
}
type adalah tipe besaran yang akan dikeluarkan oleh method, termasuk void jika tidak ada nilai yang akan dikeluarkan.
Method name adalah sembarang identifier yang berlaku selain yang telah dipakai untuk nama class di dalam cakupan yang bersangkutan.
formal-parameter-list adalah urutan pasangan tipe dan identifier yang dipisahkan dengan koma.
Pemanggilan method
Method dipanggil pada instans suatu class dengan menggunakan operator dot (.). Bentuk umum pemanggilan method ditunjukkan di bawah ini ;
Objectreference.methodname (parameter-list)
Objectreference adalah sembarang variabel yang merujuk ke suatu objek , method name adalah nama suatu method dalam class yang dideklarasikan sebagai objectreference, dan parameter-list adalah besaran atu pernyataan yang dipisahkan dengan koma yang jumlah dan tipenya cocok dengan method yang dideklarasikan sebagai method name dalam class yang bersangkutan.
Point p = new (Point); p.init(10 , 20) ;
84 Contoh ini membuat instan baru dari Point , menyimpan referensinya dalam p. Kemudian operator dot digunakan untuk memanggil method init pada instans yang bersangkutan, melewatkan 10 dan 20 secara berurutan untuk parameter a dan b . Pernyataan x ke 10 dan y ke 20 dilakukan dan method menghasilkan nilai.
this
Java memasukkan suatu besaran referensi khusus yang disebut this yang digunakan di dalam method yang dirujuk untuk objek yang sedang berlaku. Nilai this merujuk pada objek dimana method yang sedang berjalan dipanggil. Anda dapat menggunakan this disembarang tempat dimana dibutuhkan referensi ke suatu objek dari class yang berlaku. Pada contoh sebelum ini kita menggunakan p.init tetapi saat kita berada pada method init, this akan menunjuk ke objek yang sama dengan p. Jika objek lain mnggunakan program yang sama dikirim melalui instans lainnya maka masing-masing objek tersebut akan memiliki hasil this-nya sendiri.
Di dalam Java tidak diperbolehkan mendeklarasikan dua variabel lokal dengan nama yang sama di dalam cakupan yang sama. Yang menarik, diperbolehkan untuk mendeklarasikan variabel lokal termasuk parameter formal suatu method yang tumpang tindih dengan nama variabel instan. Anda akan melihat bahwa kita tidak menggunakan x dan y sebagai nama parameter untuk method init karena mereka akan menyembunyikan variabel instan x dan y sebnarnya untuk cakupan method tersebut. Jika kita lakukan, maka x akan merujuk pada parameter formal, menyembunyikan variabel instan x. this justru memperbolehkan kita merujuk langsung ke objeknya sendiri bukannya membiarkan cakupan yang berlaku mendefinisikan aturan-aturan resolusi variabel kita. Berikut ini versi lain init yang menggunakan x dan y untuk nama parameter formal dan kemudian menggunakan this untuk mengakses variabel instans objek yang berlaku pada saat itu.
void
init (int x, int y) { this.x = x ; this.y = y; }
Contoh TwoPoints dapat memanfaatkan method inisialisasi baru untuk init seperti ditunjukkan di bawah ini
85 class Point {
int x; int y;
void init (int x, int y) { this.x = x; this.y = y; }
}
class TwoPointsInit {
public static void main( String args[] ) { Point p1 = new Point();
Point p2 = new Point(); p1.init(10, 20); p2.init(42, 99); System.out.println("x = "+ p1.x + " y = "+ p1.y); System.out.println("x = "+ p2.x + " y = "+ p2.y); } }
Contoh ini menunjukkan pembuatan dua objek Point dan method init mereka yang terkait yang dipanggil dengan pasangan nilai yang berbeda. Keluaran program ini sama dengan contoh program TwoPoints sebelumnya.
Konstruktor
Menginisialisasi semua variabel dalam class setiap kali instans dibuat sangatlah membosankan. Bahkan jika anda membuat fungsi yang sederhana seperti init dia atas tetap lebih sederhana dan singkat jika semua yang diperlukan telah siap saat objek dibuat. Untuk alasan ini, class dapat mengimplementasikan method khusus yang disebut konstruktor. Konstruktor adalah method yang menginisialisasi objek segera setelah pembuatannya. Konstruktor tersebut memiliki nama yang sama persis dengan class tempatnya. Sebenarnya anda tidak dapat membuat method yang bernam sama dengan class-nya. Sekali didefinisikan, konstruktor secara otomatis segera dipanggil sebelum operator new selesai bekerja. Konstruktor kelihatan agak aneh karena tidak memiliki tipe keluaran, bahkan tidak memiliki void sekalipun. Ini karena tipe hasil implisit konstruktor adalah menginisialisasi semua keadaan internal suatu objek sehingga program yang menghasilkan instan dengan operator new akan segera memiliki objek yang baik dan berguna.
86 Berikut ini adalah class point, di sini dapat kita lihat bagaimana cara menginisialisasi kedua variabel instans sambil membentuk objek. Disini method init dari contoh terakhir digantikan dengan method yang kelihatannya sangat mirip tetapi berbagi nama dengan class-nya dan tidak memiliki tipe hasil.
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } } class PointCreate {
public static void main(String args[] ) { Point p = new Point( 10, 20);
System.out.println("x = " + p.x +" y = " + p.y); }
}
Method konstruktor dipanggil tepat setelah instans dibuat dan sebelum new menghasilkan nilai untuk pemanggilnya. Daftar parameter yang dispesifikasikan setelah nama class dalam pernyataan new digunakan untuk melewatkan parameter ke konstruktor yang tepat. Contoh sebelumnya yang menggunakan newPoint() memanggil konstruktor Point(), yang dibuat default oleh konstruktor object () superclass.
Overloading Method
Dalam pemrograman Java, mungkin kita seringkali menginginkan pembuatan lebih dari satu method dengan nama sama tetapi dengan daftar parameter yang berbeda. Ini disebut overloading method. Overloading method digunakan untuk melayani sifat polimorfik Java. Contoh berikut ini adalah versi class Point yang menggunakan overloading method untuk menghasilkan konstuktor alternatif yang membuat beberapa nilai default untuk koordinat x dan y. class Point { int x; int y; Point(int x, int y) { this.x = x;
87 this.y = y; } Point() { x = -1; y = -1; } } class PointCreateAlt {
public static void main(String args[] ) { Point p = new Point();
System.out.println("x = " + p.x +" y =" + p.y); }
}
Contoh ini menghasilkan sebuah objek Point yang memanggil konstruktor kedua tanpa parameter, berbeda dengan yang pertama. Ini adalah keluarannya.
x = -1 y = -1
This pada Konstruktor
Pengembangan dan perbaikan lebih lanjut menunjukkan bagaimana satu konstruktor dapat memanggil konstruktor lainnya untuk menghasilkan instan yang jelas. Seringkali sangat baik untuk membangun konstruktor terhadap konstruktor lainnya sehingga class yang anda buat dapat brkembang lebih lancar dalam siklus pengembangan. Contohnya:
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } Point() { this(-1,-1); } }
Konstruktor kedua sekarang memanggil yang pertama untuk menyelesaikan inisialisasi instans.
Anda juga dapat membuat method non-konstruktor yang menggunakan overloading. Berikut ini adalah contoh yang menambahkan dua versi dari suatu method yang distance untuk class
88 Point. Fungsi distance menghasilkan jarak Eucleidean antara dua Points. Satu method membutuhkan pasangan x dan y dan yang lainnya membutuhkan objek Point yang lain. Pada contoh ini, method sqrt di class Math digunakan untuk menghitung akar kuadrat parameternya. class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; }
float distance (int x, int y) { } double distance(int x, int y) {
int dx = this.x - x; int dy = this.y - y;
return Math.sqrt (dx*dx + dy*dy); }
double distance(Point p) {
return distance(p.x, p.y); }
}
class Point Dist {
public static void main(String args[] ) { Point p1 = new Point(0, 0); Point p2 = new Point(30, 40);
System.out.println("p1 = "+ p1.x +", "+ p1.y); System.out.println("p2 = "+ p2.x +", "+ p2.y); System.out.println("p1.distance(p2) = " +p1.distance(p2)); System.out.println("p1.distance(60, 80) = "+ p1.distance(60, 80)); } }
Contoh ini menunjukkan bagaimana suatu method dapat dioverload agar memiliki dua cara alternatif untuk menjalankan proses komputasi yang sama. Perhatikan bahwa bentuk kedua dari distance memanggil bentuk pertama untuk nilai keluarannya. Berikut ini keluaran contoh tersebut.
p1 = 0, 0 p2 = 30, 40
89 p1.distance(p2) = 50
p1.distance(60, 80) = 100 Inheritansi
Dasar kedua mekanisme berorientasi objek adalah inheritansi. Inheritansi adalah konsep yang memetakan hubungan class dengan class lainnya secara hirarkis. Ini memungkinkan turunan dari suatu class mewarisi semua variabel dan method dari moyangnya dan juga membuat miliknya sendiri. Turunan ini disebut sub-class. Moyang langsung suatu class disebut superclass. Sekali anda membuat class seperti Point, sangat mudah untuk membuat subclass darinya subclass adalah versi khusus suatu class yang mewarisi semua variabel instns dan metodenya. Pada contoh ini, kita mengembangkan class Point untuk mengikutkan komponen ketiga yang disebut z.
class Point3D extends Point { int z;
Point3D(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } Point3D0() { this(-1, -1, -1); } }
kata kunci extends digunakan untuk menegaskan bahwa kita ingin membuka sub-class dari point. Seperti yang anda dapat lihat, variabel x dan y tidak perlu dideklarasikan dalam Point3D karena sudah diwarisi dari Point. Java memungkinkan kita untuk mendeklarasikan variabel x dan y dalam Point3D yang akan menyembunyikan x dan y dari Point. Akan tetapi ini akan tetapi ini akan merusak tujuan pengsub-class-an dan sebaiknya dihindari. Ada perlakuan khusus untuk x dan y berkaitan dengan z. Mereka semua ada dalam cakupan yang sama dari sudut instans Point3D.
Super
Pada contoh Point3D ada bagian program dari superclass yang diulang oleh Point yaitu bagian yang menginisialisasi x dan y ada pada kedua class.
90
this.x = x;
this.y = y;
Mirip dengan cara kita menggunakan this untuk merujuk ke konstruktor pertama pada contoh Point, ada variabel khusus lain dalam Java yang disebut super yang merujuk langsung ke konstruktor superclassnya. Berikut ini adalah contoh program yang mendsfinisikan versi baru Point3D yang menggunakan konstruktor super untuk menginisialisasi variabel x dan y lalu mencetak hasil keluaran Point3D.
class Point3D extends Point{ int x;
Point3D(int x, int y, int z) {
super(x, y); //memanggil konstruktor Point(x, y) this.z = z;
}
public static void main (String args[] ) {
Point3D p = new Point3D(10, 20, 30);
System.out.println("x = "+p.x + "y =" +p.y +" z = " +p.z); }
}
keluaran program ini adalah seperti berikut : x = 10, y = 20, z =30
Rferensi super juga dapat digunakan untuk langsung mengirim method dengan nama tertentu seperti mengirim konstruktor. Anda dapat memperlakukan super sebagai suatu versi dari this yang merujuk ke superclsnya. Jadi suatu pernytaan seperti super.translate(x, y) berarti memanggil method translate milik superclass untuk instans this.
Overidding method
Subclass baru Point ini mewarisi implementasi method distance dari superclassnya. Katakanlah bahwa untuk mengukur jarak antara titik 3D dengan 2D, komponen x dan y 3D harus dibagi dulu dengan z. masalahnya Point sudah mendefinisikan satu versi distance (int x, int y) yang secara sederhana menghasilkan jark euclidean 2D. kita harus meng-override dfinisi trsbut dengan yang baru untuk 3D. Contoh berikut ini mengimplementasikan ovrloading distance 3D dan overriding distance 2D.
class Point { int x, y;
91 Point(int x, int y) {
this.x = x; this.y = y; }
double distance (int x, int y) { int dx = this.x - x; int dy = this.y - y;
return math.sqrt(dx*dx + dy*dy); }
double distance(Point p) {
return distance(p.x, p.y); }
}
class Point3D extends Point { int z ;
Point3D(int x, int y, int z) { super(x, y); this.z = z ; }
double distance(int x, int y, int z) { int dx = this.x - x;
int dy = this.y - y; int dz = this.z -z;
return Math.sqrt(dx*dx + dy*dy + dz*dz); }
double distance(Point3D other) {
return distance(other.x, other.y, other.z); }
double distance(int x, int y) { double dx = (this.x / z) - x; double dy = (this.y / z)- y;
return math.sqrt(dx*dx + dy*dy); }
}
class Point3DDist {
public static void main(String args[] ) {
Point3D p1 = new Point3D(30,40, 10); Point3D p2 = new Point3D(0, 0, 0); Point p = new Point (4, 6);
92 System.out.println("p1 = " + p1.x + ", "+ p1.y + ", " +p1.y);
System.out.println("p2 = " + p2.x + ", "+ p2.y + ", " +p2.y); System.out.println("p = " + p.x + ", "+ p.y + ", " +p.y); System.out.println ("p1.distance(p2) = "+ p1.distance(p2)); System.out.println ("p1.distance(4, 6) = "+ p1.distance(4, 6)); System.out.println ("p1.distance(p)= "+ p1.distance(p)); } } Hasilnya adalah p1 = 30, 40, 10 p2 = 0, 0, 0; p = 4, 6 p1.distance(p2) = 50.9902 p1.distance(4, 6) = 2.23607 p1.distance(p) = 2.23607
Keluaran program tersebut menunjukkan sesuatu yang sangat penting. Perhatikan bahwa kita mengharapkan jarak antara dua titik 3D dan pasangan 2D (4, 6). Saat kita panggil distance pada objek Point3D dengan Point2D maka kita akan mengeksekusi method distance yang diturunkan dalam class Point karena Point3D tidak meng-override method distance (Point p) dalam Point. Bagian yang mengejutkan adalah kita selanjutnya memanggil method distance (int x, int y) dalam Point3D bukan dalam Point. Method dipilih berdasarkan tipe instan saat program berjalan bukan berdasarkan class dimana method yang brjalan dieksekusi. Ini disebut pengiriman mthod dinamis (dynamic method dispatch ).
Pengiriman Method Dinamis
Saat anda memanggil method dengan operator dot pada sebuah referensi obyek. Tipe referensi objek yang dideklarasikan diperiksa saat dicompile untuk memastikan bahwa method yang dipanggil ada di dalam class yang dideklarasikan. Saat dijalankan referensi objek dapat merujuk ke suatu instan dari subclass peda tipe yang dideklarasikan. Dalam kasus ini Java ,menggunakan instans yang ada untuk memutuskan method mana yang dipanggil. Sebagai contoh ambil dua class ini yang memiliki method tunggal yang dioverride dalam subclass tersebut.
class a {
void callme() {
System.out.println("inside A's callme method "); }
93 }
class b extends a { void callme() {
System.out.println("inside B's callme method "); }
}
class Dispatch {
public static void main(String args [] ) { a a = new b();
a.callme(); }
}
Yang menrik disini adalah di dalam method main kita mendeklarasikan variabel sebagai tipe a, kemudian di dalamny disimpan suatu referensi ke suatu instans dari class b. pada baris selanjutnya dimana kita memanggil method callme pada a, compiler Java memastikan apakah a tersebut memiliki method callme. Tetapi runtime Java melihat bahwa referensinya sebenarnya adalah instans dari b jadi runtime kan mmanggil method callme milik b, bukan milik b.
Keluaran program tersebut ditunjukkan di bawah ini : Inside B's callme method
Bentuk polimorfisme runtime dinamis ini adalh salah satu mekanisme paling ampuh yang dimiliki oleh rancangan berorientasi objek untuk menangani penggunaan kembali program. Kemampuan library program untuk memanggil method pada instans class baru tanpa melakukan compile ulang merupakan sarana yang terbukti sangat ampuh.
Final
Semua method dan variabel instan dapat di-override secara default. Jika anda ingin mendeklarasikan bahwa anda ingin subclass mengoverride variabel atau method anda, anda dapat mndeklarasikannya sebagai final. Pengubah tipe final mengakibatkan semua refrensi selanjutnya untuk unsur ini akan bergantung pada definisi ini. Contoh :
Final int FILE_NEW =1; Final int FILE_OPEN = 2;
94 Final int FILE_SAVE = 3;
Final int FILE_SAVEAS = 4; Final int FILE_QUIT = 5;
Anda dapat menggunakan final sebagai pengubah deklarasi method jika anda ingin subclass tidak mengoverride method tertentu. Method yang dideklarasikan sebagai final kadang-kadang dapat menghasilkan peningkatan kinerja karena compiler bebas untuk memanggil mereka secara in-line, tidak mungkin method-method tersebut dioverride secara tidak diduga oleh suatu subclass.
Sudah menjadi kesepakatan umum pemrograman bahwa semua identifier ditulis dengn huruf besar semua untuk variabel final. Variabel final tidak mengambil ruang sedikitpun dalam basis per instan. Dalam hal ini penggunaan final sama dengan static yang akan dijelaskan selanjutnya.
Finalize
Finalisasi sangatlah sederhana. Anda tinggal mnambahkan ke semua class sebuah method yang disebut finalize. Dan runtime Java memanggil method tersebut ketika waktunya untuk mengambil ruang untuk objek tersebut. Method finalize harus secara eksplisit mengambil tindakan yang diperlukan untuk membebaskan sumber dari luar. Pengmpul sampah (garbage collector method) berjalan secara periodik memerikasa objek mana yang tidak lagi dirujuk oleh keadaan yang sedang berjalan atau secara tidak langsung melalui objek yang dirujuk. Tepat sebelum suatu bagian dibebaskan Java memanggil method finalize pada suatu objek. Static
Kadang-kadang anda ingin membuat suatu method yang digunakan di luar konteks semua instan. Seperti method main pada contoh-contoh awal yang perlu anda lakukan adalah mendeklarasikan method ini sebagai static dan semua akan berjalan semestinya. Method static hanya boleh memanggil method static lain ecara langsung dan mereka tidak boleh merujuk ke this atau super dengan cara apapun. Variabel boleh saja dideklarsikan static tetapi anda harus memperhatikan bahwa ini menjadi deklarasi varibel global yang dapt diakses oleh sembarang bagian program. Jika anda ingin melakukan komputasi untuk menginisialisasi variabel static anda dapat mendeklarasikan blok static yang akan dijalankan hanya sekali, saat class pertama
95 kali diambil. Contoh berikut ini menunjukkan sebuah class yang memiliki sebuah method static sejumlah variabel static dan blok inisialisasi.
class static {
static int b; static int a = 3;
static void method(int x) {
System.out.println("x = " +x); System.out.println("a = " + a); System.out.println("b = " + b); }
static {
System.out.println("static block initialized"); b = a * 4;
}
public static void main(String args[] ) { method(42);
} }
Segera setelah class diambil, semua penginisialisasi variabel static berjalan yang mengisi a dengan 3 lalu menjalankan block static yang mencetak pesan dan mengisis b dengan a * 4 atau 12. Kemudian interpreter memanggil method main yang memanggil method untuk mengisikan 42 pada x. println merujuk pada dua variabel static a dan b serte variabel lokal x. Tidak diperbolehkan untuk merujuk variabel instan apapun di dalam method static. Keluaran program adalah sebagai berikut:
Static block initialized x = 42
a = 3 b = 12
Cara lain di mana static bermanfaat adalah untuk menghasilkan method yang dapat memanggil langsung dengan merujuk nama suatu class di mana mereka dideklarasikan. Mirip dengan bagaimana anda memanggil method dalam instan melalui variabel referensi objek, anda dapat memanggil method static apapun atau merujuk ke sejumlah variabel static menggunakan operator dot pada nama clasnya. Beginilah cara Jav mengimplementasikan fungsi dan variabel global. Keunggulan utama method dan variabel adalah class yang berisi
96 cakupan nama untuk menghindari tabrakan. Pada contoh dibawajh ini kita menghasilkan sebuah class dengan method static dan sejumlah variabel static. Class kedua dapat memanggil method static dengan namanya dan juga merujuk ke variabel static dengan langsung menyebut classnya.
class StaticClass {
static int a = 42; static int b = 99; static void callme () {
System.out.println("a = " + a); }
}
class StaticByName {
public static void main (String args[] ) { StaticClass.callme();
System.out.println("b = " +staticClass.b); }
}
inilah keluaran dari program tersebut a = 42;
b = 99; Abstract
Ada keadaan dimana anda perlu mendefinisikan class yang mendeklarasikan struktur abstraksi tertentu tanpa menyediakan implementasi lengkap daris setiap method. Anda dapat mendeklarasikan method yang perlu dioverride tersebut dengan subclass yang mnggunakan pengubah tipe abstract. Method ini kadang disebut tanggung jawab pengsubclassan (sub-classer responsibility). Semua class yang berisi method yang dideklarasikan abstract juga harus dideklarasikn abstract. Anda tinggal menambahkan kata kunci abstract di depan deklarasi class. Class seperti itu tidak dapat mendeklarasikan konstruktor abstract juga method abstract static. Semua subclass pada class abstract harus mengimplementasikan semua method abstract. Berikut ini adalah contoh sebuah class dengan method abstract diikuti dengan sebuah class yang mengimplementasikan method tersebut.
abstract class a {
abstract void callme(); void metoo() {
97 }
}
class b extends a { void callme() {
System.out.println("inside B's callme method "); }
}
class abstract {
public static void main(String args[] ) { a a = new b();
a.callme(); a.metoo(); }
}
Perhatikan bagaimana class abstract mengimplementasikan method secara konkret. Class abstract dapat berisi sebanyak mungkin implementasi yang dianggap cocok. Contoh ini menggunakan pengiriman method dinamik yang telah dibahas sebelumnya untuk memanggil implementasi method callme abstract, juga method abstract metoo superclassnya. Keluaran program adalah sebagai berikut :
Inside B's callme method Inside A's metoo method. Package
Package adalah container class yang digunkn untuk menjaga ruang nama class tetap terbagi-bagi. Contohnya package memungkinkan anda dapat membuat sebuah class brnama List