Jurusan Teknik Informatika - Unijoyo
1 7 0
Operator instanceof
•
Pada contoh di atas, jika class dari suatu obyek diketahui, maka dapat diketahui pula apakah mungkin memanggil
metode getNumberOfEggs.
•
Ini dapat dilakukan menggunakan operator instanceof:
public class FarmExample6 { public static void mainString[] args {
Animal[] farm = {new Goose, new Cow, new Pig, new Sheep};
for int i=0; ifarm.length; i++ { farm[i].talk;
if farm[i] instanceof Goose System.out.printlnGoosefarm[i].
getNumberOfEggs+ “ eggs”; }
} end of main }
•
Output dari kode di atas adalah
Honk 2 eggs
Moo Grunt
Baa
•
Q. Saat mencapai pernyataan println, diketahui bahwa
farm[i]
sebenarnya adalah instance dari Goose. Mengapa masih diperlukan cast
farm[i]
ke Goose?
Contoh Klasik Polymorphism
•
Berikut adalah
contoh klasik
dari polymorphism;
menggambarkan sekumpulan bidang pada layar grafis.
•
Terdapat class Asquare, ACircle dan Atriangle yang merupakan turunan dari class AShape.
public class AShape { double x, y;
public AShape { this0.0, 0.0;
}
Diktat - Pemrograman Berorientasi Obyek 2007
1 7 1
public AShapedouble x, double y { this.x=x;
this.y=y; }
public void drawEasyGraphics g { System.out.println“Error - can’t draw a shape”;
}
} public class ASquare extends AShape {
double sideLength; public ASquaredouble x, double y, double s {
superx,y; sideLength=s;
} public void drawEasyGraphics g {
double x0 = x-sideLength2; double y0 = y-sideLength2;
g.moveTox0,y0; g.lineTox0+sideLength,y0; g.lineTox0+sideLength,y0+sideLength;
g.lineTox0,y0+sideLength; g.lineTox0,y0; }
} public class ATriangle extends AShape {
double sideLength; public ATriangledouble x, double y, double s {
superx,y; sideLength=s;
} public void drawEasyGraphics g {
double x0 = x-sideLength2; double y0 = y-sideLength2;
g.moveTox0,y0; g.lineTox0+sideLength,y0;
g.lineTox,y+sideLengthMath.sinMath.PI3.0; g.lineTox0,y0;
}
} public class ACircle extends AShape {
the number of steps around the circle private static final int NUM_STEPS = 30;
double radius; public ACircledouble x, double y, double r {
superx,y; radius=r;
}
Jurusan Teknik Informatika - Unijoyo
1 7 2
public void drawEasyGraphics g { double theta = 2.0Math.PINUM_STEPS-1;
g.moveTox+radius,y; for int i=1; iNUM_STEPS; i++
g.lineTox+radiusMath.costhetai, y+radiusMath.sinthetai;
}
}
• Aplikasi menggambarkan bentuk lingkaran, segiempat dan
segitiga dalam suatu jendela. Setiap kali perlu me-refresh tampilan, dilakukan iterasi melalui array obyek AShape dan
menjalankan metode draw dari setiap bentuk.
• Metode draw tepat dipanggil tergantung pada tipe dari obyek
ACircle, ASquare atau ATriangle.
import TruePkg.; public class GraphicsDisplay {
public static void mainString[] args { EasyGraphics g = new EasyGraphics300,300;
AShape[] shape = {new ACircle100,100,80, new ATriangle150,150,100,
new ASquare220,220,80}; for int i=0; ishape.length; i++
shape[i].drawg; }
}
• Pemrogram tidak pernah menginisiasi AShape karena begitu
general, tidak diketahui bagaimana menggambarkan suatu “shape”, masih perlu diperjelas.
• Kode di atas dapat dibuat lebih baik dengan menggunakan
suatu abstract class bagi AShape. Silakan membaca bab 13.
Rangkuman
• Inheritance memungkinkan penempatan atribut metode
umum dalam superclasses, dan subclass kemudian dapat menggunakannya
• Subclass juga dapat mendeklarasikan atribut dan metode
bernama sama seperti pada superclass, sehingga dua atribut
Diktat - Pemrograman Berorientasi Obyek 2007
1 7 3
atau metode bernama sama tersebut mempunyai lingkup berbeda, dan cara penanganannya juga berbeda.
• Variabel instanve non-private yang diturunkan dari superclass
dapat dibayangi oleh variabel bernama sama dideklarasi di dalam subclass.
• Metode non-private yang diturunkan dari superclass juga
dapat di-overridde oleh metode bernama sama di dalam subclass.
• Metode dan variabel superclass dapat dirujuk menggunakan
kata kunci super.
• Konstruksi suatu obyek diawali oleh konstruksi obyek
superclass melalui
constructor; perilaku
contructor superclass dapat dipanggil dan dilengkapi fungsinya dengan
perintah super di dalam constructor subclass. •
Polymorphism mengacu
kepada kemampuan
untuk menjalankan suatu metode bergantung pada class obyek.
• Java menerapkan dynamic binding untuk memutuskan
metode mana yang dijalankan saat runtime. •
Polymorphism memungkinkan
koleksi heterogen
diperlakukan secara seragam. •
Casting kadang diperlukan untuk memastikan bahwa metode yang tepat akan dijalankan saat run time.
Jurusan Teknik Informatika - Unijoyo
1 7 4
1 3
Class Abstrak Interface
Class Abstrak
•
Class yang mempunyai instance langsung dinamakan class konkrit concrete class.
•
Pendefinisian class abstrak abstract classes yang tidak mempunyai instance langsung, pada kondisi tertentu, akan
bermanfaat.
•
Class abstrak menyediakan fungsionalitas yang akan diturunkan oleh subclass konkrit.
•
Contoh: bentuk-bentuk dalam aplikasi gambar sebelumnya.
Shape
x : double y : double
area : double draw : void
setPosition : void
Rectangle
width : double height : double
area : double draw : void
Triangle
sideLength : double area : double
draw : void
Circle
radius : double area : double
draw : void
•
Semua bentuk mempunyai beberapa metode dan atribut umum.
•
Detail dari bagaimana metode bekerja berbeda bagi setiap bentuk.
•
Beberapa bentuk dapat mempunyai atribut tambahan.
Diktat - Pemrograman Berorientasi Obyek 2007
1 7 5
Hirarki Shape
public abstract class Shape { protected double x;
protected double y; public void setPositiondouble xval, double yval {
x = xval; y = yval;
} public abstract void drawEasyGraphics g;
public abstract double area; }
•
Jelas metode draw dan area adalah ‘abstract’ karena tidak menyediakan suatu implementasi, hanya deklarasi yang
mendefinisi bagaimana metode tersebut harus dipanggil, apa yang harus dijadikan argumen oleh pemanggil.
•
Suatu class yang mengandung metode abstrak harus selalu dideklarasikan abstrak.
•
Class abstrak dapat mengandung metode konkrit seperti setPosition. Setiap metode dari class abstrak dapat dibuat
konkrit, jika diperlukan.
Mengembangkan Class Shape
•
Rectangle merupakan sebuah concrete class. Class ini menyediakan suatu implementasi dari metode abstrak draw
dan area, dan juga menurunkan implementasi setPosition dari superclass Shape.
public class Rectangle extends Shape { private double width;
private double height; public Rectangledouble w, double h {
width = w; height = h;
} public void drawEasyGraphics g {
g.moveTox, y; g.lineTox + width, y; g.lineTox + width, y + height;
g.lineTox, y + height;
Jurusan Teknik Informatika - Unijoyo
1 7 6
g.lineTox, y; }
public double area { return width height;
}
}
•
Penggunaan class Rectangle:
EasyGraphics g = new EasyGraphics300, 300, 150, 150; Rectangle myRect = new Rectangle40, 70;
myRect.setPosition-130, -130; myRect.drawg;
System.out.printlnmyRect.area;
Mengapa Bersusah Ria?
•
Mendeklarasikan suatu abstract class terlihat memunculkan masalah karena harus diimplementasikan itu di dalam
concrete subclass.
Namun: Dalam pemodelan data, sangat bermanfaat menerapkan
generalisasi dan spesialisasi. Semua bentuk mempunyai beberapa fitur umum.
Lebih dari itu, abstract class memungkinkan pemrogram untuk mengeksploitasi polymorphism dengan menyediakan
suatu superclass umum bagi beberapa subclass terkait.
•
Contoh:
EasyGraphics g = new EasyGraphics300, 300, 150, 150; Shape myShape = new Rectangle40, 70;
myShape.setPosition-130, -130; myShape.drawg;
System.out.printlnmyShape.area;
•
Ini sangat berguna bagi pembangunan koleksi heterogen dari obyek-obyek.
Diktat - Pemrograman Berorientasi Obyek 2007
1 7 7
Koleksi Heterogen
•
Contoh: daftar bentuk yang tergambar pada tampilan gafis.
•
Bagaimana menggambar ulang tampilan? Dilakukan iterasi sesuai daftar pemanggilan metode draw dari setiap bentuk.
import TruePkg.; public class ShapeDemo {
public static void mainString args[] { EasyGraphics g =
new EasyGraphics300,300,150,150; Shape[] list = new Shape[5];
mengisi array dengan bentukshape list[0] = new Rectangle40,70;
list[0].setPosition20,20; list[1] = new Circle70;
list[1].setPosition-40,-60; list[2] = new Triangle30;
list[2].setPosition-40,40; list[3] = new Rectangle90,50;
list[3].setPosition20,50; list[4] = new Circle30;
list[4].setPosition0,0; sekarang, update tampilan
for int i=0; i5; i++ list[i].drawg;
} }
Multiple Inheritance
•
Kadang perlu memodelkan situasi dimana suatu obyek mungkin mewarisi perilaku lebih dari satu superclass. Seperti
disebutkan sebelumnya, Java tidak mendukung ini secara langsung melalui konsep inheritance extends.
•
Contoh kasus adalah pada hirarki aset berikut:
Jurusan Teknik Informatika - Unijoyo
1 7 8
•
Diagram di atas memperlihatkan multiple inheritance. Bank account rekening bank adalah jenis dari aset asset, tetapi
adalah interest bearing berbunga dan dapat diasuransi terhadap kehilangan.
•
Q. Java tidak membolehkan multiple inheritance murni. Mengapa?