Saat mencapai pernyataan println, diketahui bahwa

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?