tatic jumlahLingkaran dengan tipe data integer bernilai 0 

d. Konstruktor pertama tanpa ada masukan dan tidak melakukan apa-apa 

e. Konstruktor kedua memiliki 1 masukan yaitu jari_jari_baru bertipe data 

double 

 60 

 

f. Method setJari memiliki 1 masukan yaitu jari_jari bertipe data double yang 

memperbarui nilai dari property jari_jari 

g. Method getJari, mengembalikan nilai jari_jari 

h. Method getLuas, mengembalikan nilai luas lingkaran 

i. Method getKeliling, mengembalikan nilai keliling lingkaran 

j. Method static getJumlahLingkaran, mengembalikan nilai jumlah lingkaran 

yang dibuat 

Gunakan modifier private untuk semua property serta modifier public untuk 

semua konstruktor dan method. Buat juga 3 objek, objek pertama tanpa inisialisasi 

jari_jari, objek kedua dengan inisialisasi jari_jari dari method setter setJari, dan 

objek ketiga dengan inisialisasi jari_jari dari konstuktor. Gambar pula UML class 

diagramnya. 

2. Buatlah program class PiramidaEnkapsulasi yang merepresentasikan bentuk piramida 

yang merepresentasikan template Piramida dan menerapkan konsep enkasulapsi. 

Kreasikan konten property, method, dan objek sesuai keinginan Anda. 

3. Buatlah program class MahasiswaEnkapsulasi berdasarkan UML class diagram di 

bawah ini 

MahasiswaEnkapsulasi 

-nim: string 

-nama: string 

-alamat: string 

-ipk: double  

+Mahasiswa() 

+Mahasiswa(nim: string) 

+Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru: string) 

+setNim(nim: string): void 

+getNim(): string 

+setNama(nama: string): void 

+getNama(): string 

+setAlamat(alamat: string): void 

+getAlamat (): string 

 61 

 

+setIpk(ipk: double): void 

+getIpk(): double 

+predikat(ipk: double): Sstring   

+cetak(): void   

 

Penjelasan UML class diagram MahasiswaEnkapsulasi 

Atribut 

 nim bertipe data string dengan modifier private 

 nama bertipe data string dengan modifier private 

 alamat bertipe data string dengan modifier private 

 ipk bertipe data double dengan modifier private 

Konstruktor 

 Mahasiswa() 

Tidak melakukan apapun 

 Mahasiswa(nim: string) 

o Beri nilai property nim milik class diisi dengan nilai nim masukan method 

 Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru: 

string) 

o Beri nilai property nim milik class diisi dengan nilai nimBaru masukan 

method 

o Beri nilai property nama milik class diisi dengan nilai namaBaru masukan 

method 

o Beri alamat property nama milik class diisi dengan nilai alamatBaru 

masukan method 

o Beri nilai property ipk milik class diisi dengan nilai ipkBaru masukan 

method 

Method 

 setNim(nim: string): void 

memberi nilai property nim milik class diisi dengan nilai masukan method 

 +getNim(): string 

mengembalikan nilai dari property nim 

 +setNama(nama: string): void 

 62 

 

memberi nilai property nama milik class diisi dengan nilai masukan method 

 +getNama(): string 

mengembalikan nilai dari property nama 

 +setAlamat(alamat: string): void 

memberi nilai property alamat milik class diisi dengan nilai masukan method 

 +getAlamat (): string 

mengembalikan nilai dari property alamat 

 +setIpk(ipk: double): void 

memberi nilai property ipk milik class diisi dengan nilai masukan method 

 +getIpk(): double 

mengembalikan nilai dari property ipk 

 predikat(ipk: double): String   

Jika ipk diantara 2.0 sampai 2.75, kembalikan string “Memuaskan” 

Jika ipk diantara 2.76 sampai 3.5, kembalikan string ‘Sangat memuaskan” 

Jika ipk diantara 3.51 sampai 4.0, kembalikan string “Dengan pujian” 

Jika tidak, kembalikan string “-“ 

 cetak(): void   

o Menampilkan nim, nama, alamat, ipk dan predikat dalam susunan vertical 

 

Contoh output: 

Nama      = Dilan 

Alamat    = Bandung 

NIM        = 1 

IPK          = 3.51 

Predikat   = Dengan Pujian 

 

 63 

 

BAB 5 INTERAKSI ANTAR OBJEK 

5.1 Keterkaitan antar Class 

Kita perlu mengetahui keterkaitan antar class untuk merancang class. Keterkaitan 

umum antar class yaitu asosiasi, agregrasi, komposisi dan pewarisan. Pada bab 5 ini akan 

membahas keterkaitan antar class tentang asosiasi, agregrasi, dan komposisi, sedangkan 

pewarisan akan dibahas pada bab 7. 

5.2 Asosiasi 

Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class. 

Sebagai contoh, seorang penonton yang menonton film adalah keterkaitan class Penonton dan 

class Film. Anggota rumah produksi, seorang sutradara membuat film adalah keterkaitan 

class RumahProduksi dan class Film. Asosiasi dapat digambarkan dalam UML class diagram 

pada gambar 5.1. 

 

 

Gambar 5.1 UML asosiasi pada class Penonton, Film, dan RumahProduksi 

Gambar 5.1 menunjukkan bahwa penonton dapat menonton beberapa film. Anggota 

rumah produksi (sutradara) dapat membuat beberapa film. Film mungkin memiliki 1 sampai 

300 penonton dan film dibuat oleh 1 atau 2 anggota rumah produksi (sutradara). 

Sebuah asosiasi digambar oleh garis solid antar class. Label menunjukkan keterkaitan 

antar class dan segitiga hitam menunjukkan arah hubungan. Pada gambar 5.1 memiliki label 

menonton dan membuat. Simbol segitiga hitam     menunjukkan bahwa penonton dapat 

menonton beberapa film. Setiap class yang terlibat mungkin memiliki nama peran yang 

menggambarkan peran yang dimainkannya dalam hubungan. Pada gambar 5.1, sutradara 

adalah peran dari RumahProduksi. 

Setiap class yang terlibat dalam hubungan asosiasi dapat menentukan multiplicity 

yang ditempatkan disamping class dekat garis solid. Multiplicity berfungsi untuk menentukan 

berapa banyak objek class yang terlibat dalam hubungan di UML. Multiplicity simbol * 

berarti objek yang tidak terbatas dan interval m…n berarti objek yang berjumlah diantara 

Penonton Film RumahProduksi 

1..300 * 

Menonton  Membuat 

* 1..2 

Sutradara 

 64 

 

angka m dan n. Pada gambar 5.1, penonton dapat menonton film sebanyak apapun dan setiap 

film dapat ditonton antara 1 sampai 300 orang dalam satu kali penayangan. Setiap film 

diproduksi oleh 1 atau 2 anggota rumah produksi, dan sutradara dapat membuat film 

sebanyak apapun. 

Dalam bahasa pemrograman Java, kita dapat menerapkan keterkaitan antar class 

menggunakan property dan method. Gambar 5.2 menggambarkan implementasi dari gambar 

5.1. Keterkaitan penonton menonton film dapat diimplemntasikan menggunakan method 

nontonFilm di class Penonton dan method tambahPenonton di class Film. Keterkaitan rumah 

produksi membuat film diimplementasikan menggunakan method buatFilm di class 

RumahProduksi dan method setRumahProduksi di class Film. Class penonton dapat 

menggunakan listFilm untuk menyimpan film-film apa saja yang ditonton, class 

RumahProduksi dapat menggunakan listFilm untuk menyimpan film-film yang dibuat, dan 

class Film dapat menggunakan listPenonton untuk menyimpan para penonton yang menonton 

dan property rumahProduksi untuk menyimpan informasi pembuat film. 

 

 

 

 

 

 

 

 

 

 

 

 

Gambar 5.2 Asosiasi yang diimplementasikan menggunakan property dan method di class 

public class Penonton{ 

   private Film[] listFilm; 

 

   public void nontonFilm(Film f){ 

   ... 

    } 

public class Film{ 

   private Penonton[] listPenonton; 

   private RumahProduksi[] listRumahProduksi; 

 

   public void tambahPenonton(Penonton p){ 

   ... 

   } 

 

   public void setRumahProduksi(RumahProduksi rp){ 

   ... 

   }  

public class RumahProduksi{ 

   private Film[] listFilm; 

  

   public void buatFilm(Film f){ 

   ... 

   } 

 

 65 

 

5.3 Agregasi dan Komposisi 

Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua 

objek. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class. 

Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class. Kita dapat 

menyebut agregasi antara dua objek sebagai komposisi jika keberadaan aggregated object 

tergantung pada aggregating object. Maka, aggregated object tidak dapat tercipta dengan 

sendirinya.  

Contoh "seorang penonton memiliki nama" adalah komposisi hubungan antara class 

Penonton dan class Nama sebab   nama tergantung pada penonton, sedangkan "seorang 

penonton memiliki alamat" adalah hubungan agregasi antara class Penonton dan class Alamat 

sebab   alamat bisa ada dengan sendirinya. Komposisi menyiratkan kepemilikan. Satu objek 

memiliki objek lain. Ketika objek pemilik dihancurkan, objek yang terkait hancur juga. 

Lihat gambar 5.3 yang berisikan UML, simbol belah ketupan hitam menyatakan 

bahwa aggregating class (Penonton) memiliki hubungan komposisi dengan aggregated class 

(Nama). Sedangkan simbol belah ketupan putih yang melekat pada aggregating class 

(Penonton) memiliki hubungan agregrasi dengan aggregated class (Alamat). 

 

 

 

 

 

Gambar 5.3 Contoh UML dengan keterkaitan Agregrasi dan Komposisi 

 

Pada gambar 5.3, setiap penonton hanya memiliki satu multiplicity alamat dan 

masing-masing alamat bisa dibagikan oleh hingga 3 penonton. Setiap penonton memiliki satu 

nama, dan nama itu  unik untuk setiap penonton. 

Keterkaitan agregasi biasanya direpresentasikan sebagai property dalam aggregating 

class. Contohnya pada gambar 5.4 yang menunjukkan relasi "seorang penonton memiliki 

nama" dan "seorang penonton memiliki alamat", terlihat dari variabel property nama dan 

alamat di kelas Siswa. 

 

 

Nama Penonton Alamat 

Komposisi Agregrasi 

1…3 1 1 

 66 

 

 

 

 

 

 

 

 

          Aggregated class  Aggregating class         Aggregated class 

Gambar 5.4 Agregrassi dan Komposisi yang diimplementasi menggunakan property 

 

Agregasi bisa muncul di antara objek-objek dari kelas yang sama. Misalnya, seorang 

pegawai mungkin memiliki pengawas. Gambar 5.5 menjelaskan hubungan "seorang pegawai 

memiliki pengawas". Seorang pengawas dapat direpresentasikan sebagai property di kelas 

Pegawai. 

 

 

 

Gambar 5.5 Agregasi Seorang Pegawai Memiliki Pengawas 

Jika seorang pegawai dapat memiliki beberapa pengawas, maka kita perlu 

menambahkan array, lihat gambar 5.6. Array itu  berguna untuk pengawas produksi, 

pengawas kualitas, dan lain-lain. 

 

 

 

Gambar 5.6 Agregasi Seorang Pegawai Memiliki Banyak Pengawas 

 

5.4 Studi Kasus 

Agar lebih memahami materi, mari kita implementasi class Penonton, Film, dan 

RumahProduksi. UML class diagram lengkap terdapat pada gambar 5.7 yang merupakan 

perluasan dari UML pada gambar 5.2. Kode sumber 5.1 hanya menampilkan class Film 

secara utuh, sedangkan class Penonton dan class RumahProduksi bisa dilengkapi secara 

public class Nama{ 

   … 

 

 

 

 

public class Penonton{ 

   private Nama nama; 

   private Alamat alamat; 

   … 

public class Alamat{ 

   … 

 

 

 

 

public class Pegawai{ 

  private Pegawai pengawas; 

  … 

 

 

 

Penonton 

1 pengawas 

public class Pegawai{ 

  private Pegawai[] pengawas; 

  … 

 

 

 

Penonton 

m pengawas 

 67 

 

mandiri sebagai tugas praktikum. Kode sumber yang digunakan menerapkan konsep array of 

object, kita dapat memahami praktiknya pada bab ini dan akan belajar tentang teorinya pada 

bab 6.5. 

Penonton 

-nama: String 

-listFilm: Film[] = new Film[1000]; 

-jumlahFilm: int 

+Penonton(nama: String) 

+getNamaPenonton(): String 

+nontonFilm(f Film): void 

+getListFilm(): Film[] 

+getJumlahFilm(): int 

+main(args String[]): void 

 

 

 

 

 

 

 

 

 

 

 

 

 

Gambar 5.7 UML class diagram ClassPenonton, Film, dan RumahProduksi Lengkap 

RumahProduksi 

-sutradara: String 

-listFilm: Film[] = new Film[1000]; 

-jumlahFilm: int 

+RumahProduksi(sutradara: String) 

+getNamaSutradara(): String 

+buatFilm(f Film): void 

+getListFilm(): Film[] 

+getJumlahFilm(): int 

+main(args String[]): void 

Film 

-namaFilm: String 

-listPenonton: Penonton[] = new Penonton [300]; 

-jumlahPenonton: int 

-listRumahProduksi: RumahProduksi[] = new RumahProduksi [300]; 

-jumlahRumahProduksi: int 

+Film(namaFilm: String) 

+getNamaFilm(): String 

+tambahPenonton(p Penonton): void 

+getPenonton(): Penonton[] 

+getJumlahPenonton (): int 

+setRumahProduksi(rp RumahProduksi): void 

+getRumahProduksi(): RumahProduksi[] 

+getRumahProduksi(): int 

+main(args String[]): void 

 68 

 

Kode 5.1 Penonton.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

public class Penonton { 

    //property 

    private String nama; 

   /*Sebagai tugas praktikum 1, konversi property dibawah ini  

menggunakan kode sumber 

   -listFilm: Film[] = new Film[1000]; 

         //Array untuk menampung Film 

   -jumlahFilm: int 

         //Jumlah dari Film yang ditampung (default = 0) 

   sampai property ini*/ 

     

    //konstruktor 

    public Penonton(String nama){ 

        this.nama = nama; 

    } 

 

    //method     

    public String getNamaPenonton(){ 

        return nama; 

    } 

 

   /*Buat dan isi method-method dibawah ini 

    +nontonFilm(f Film): void 

         //Tambah film yang ditonton 

    +getListFilm(): Film[] 

         //Kembalikan list film yang ditonton 

    +getJumlahFilm(): int 

         //Kembalikan jumlah film yang ditonton 

    sampai method ini*/ 

 

    public static void main(String[] args) { 

 69 

 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

 

45 

46 

47 

48 

49 

50 

51 

52 

53 

 

54 

55 

56 

57 

58 

59 

60 

61 

        Penonton p1 = new Penonton("Abas"); 

        Penonton p2 = new Penonton("Yogi"); 

        Penonton p3 = new Penonton("Anisa"); 

         

        p1.nontonFilm(new Film("Dilan 1991")); 

        p1.nontonFilm(new Film("Avenger: Endgame")); 

         

        p2.nontonFilm(new Film("Dilan 1991")); 

        p2.nontonFilm(new Film("Avenger: Endgame")); 

         

        p3.nontonFilm(new Film("Dilan 1991")); 

         

        System.out.println("Jumlah film yang ditonton  

"+p1.getNamaPenonton()+" adalah "+p1.getJumlahFilm()); 

        Film[] f1 = p1.getListFilm(); 

        System.out.print("|| "); 

        for(int i=0; i<p1.getJumlahFilm(); i++){ 

            System.out.print(f1[i].getNamaFilm()+" || "); 

        } 

         

        System.out.println("\n"); 

         

        System.out.println("Jumlah film yang ditonton  

"+p2.getNamaPenonton()+" adalah "+p2.getJumlahFilm()); 

        Film[] f2 = p2.getListFilm(); 

        System.out.print("|| "); 

        for(int i=0; i<p2.getJumlahFilm(); i++){ 

            System.out.print(f2[i].getNamaFilm()+" || "); 

        } 

         

        System.out.println("\n"); 

      

 70 

 

62 

 

63 

64 

65 

66 

67 

68 

69 

        System.out.println("Jumlah film yang ditonton  

"+p3.getNamaPenonton()+" adalah "+p3.getJumlahFilm()); 

        Film[] f3 = p3.getListFilm(); 

        System.out.print("|| "); 

        for(int i=0; i<p3.getJumlahFilm(); i++){ 

            System.out.print(f3[i].getNamaFilm()+" || "); 

        } 

    } 

Output: 

Jumlah film yang ditonton Abas adalah 2 

|| Dilan 1991 || Avenger: Endgame ||  

 

Jumlah film yang ditonton Yogi adalah 2 

|| Dilan 1991 || Avenger: Endgame ||  

 

Jumlah film yang ditonton Anisa adalah 1 

|| Dilan 1991 ||  

 

Kode 5.2 Film.java 

10 

11 

12 

public class Film { 

    //property 

    private String namaFilm; 

    private Penonton[] listPenonton = new Penonton[300]; 

    private int jumlahPenonton; 

    private RumahProduksi[] listRumahProduksi = new RumahProduksi[2]; 

    private int jumlahRumahProduksi; 

     

    //konstruktor 

    public Film(String namaFilm){ 

        this.namaFilm = namaFilm; 

 71 

 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

    } 

 

    //method 

    public String getNamaFilm(){ 

        return namaFilm; 

    } 

    public void tambahPenonton(Penonton p){ 

        listPenonton[jumlahPenonton] = p; 

        jumlahPenonton++; 

    } 

    public Penonton[] getPenonton(){ 

        return listPenonton; 

    } 

    public int getJumlahPenonton(){ 

        return jumlahPenonton; 

    } 

    public void setRumahProduksi(RumahProduksi rp){ 

        listRumahProduksi[jumlahRumahProduksi] = rp; 

        jumlahRumahProduksi++; 

    } 

    public RumahProduksi[] getRumahProduksi(){ 

        return listRumahProduksi; 

    } 

    public int getJumlahRumahProduksi(){ 

        return jumlahRumahProduksi; 

    } 

    public static void main(String[] args) { 

        Film film1 = new Film("Dilan 1991"); 

        Film film2 = new Film("Avenger: Endgame"); 

         

        film1.setRumahProduksi(new RumahProduksi("Pidi Baiq")); 

        film1.setRumahProduksi(new RumahProduksi("Fajar Bustomi")); 

 72 

 

45 

46 

47 

48 

49 

50 

51 

52 

53 

54 

55 

56 

57 

58 

59 

60 

61 

62 

63 

64 

 

65 

66 

67 

68 

69 

70 

71 

72 

73 

74 

75 

         

        film2.setRumahProduksi(new RumahProduksi("Anthony Russo")); 

        film2.setRumahProduksi(new RumahProduksi("Joe Russo")); 

         

        film1.tambahPenonton(new Penonton("Abas")); 

        film1.tambahPenonton(new Penonton("Yogi")); 

        film1.tambahPenonton(new Penonton("Anisa")); 

         

        film2.tambahPenonton(new Penonton("Abas")); 

        film2.tambahPenonton(new Penonton("Yogi")); 

         

        System.out.println("=== Box Office 2019 ==="); 

        System.out.println("Film 1 - "+film1.getNamaFilm()); 

        System.out.print("Sutradara = "); 

        RumahProduksi[] rp1 = film1.getRumahProduksi(); 

        for(int i=0; i<film1.getJumlahRumahProduksi(); i++){ 

            System.out.print(rp1[i].getNamaSutradara()+", "); 

        } 

        System.out.println(""); 

        System.out.println("Jumlah penonton film  

"+film1.getNamaFilm()+" adalah "+film1.getJumlahPenonton()); 

        Penonton[] p1 = film1.getPenonton(); 

        System.out.print("|| "); 

        for(int i=0; i<film1.getJumlahPenonton(); i++){ 

            System.out.print(p1[i].getNamaPenonton()+" || "); 

        } 

        System.out.println("\n\n"); 

        System.out.println("Film 2 - "+film2.getNamaFilm()); 

        System.out.print("Sutradara = "); 

        RumahProduksi[] rp2 = film2.getRumahProduksi(); 

        for(int i=0; i<film2.getJumlahRumahProduksi(); i++){ 

            System.out.print(rp2[i].getNamaSutradara()+", "); 

 73 

 

76 

77 

78 

 

79 

80 

81 

82 

83 

84 

85 

86 

        } 

        System.out.println(""); 

        System.out.println("Jumlah penonton film  

"+film2.getNamaFilm()+" adalah "+film2.getJumlahPenonton()); 

        Penonton[] p2 = film2.getPenonton(); 

        System.out.print("|| "); 

        for(int i=0; i<film2.getJumlahPenonton(); i++){ 

            System.out.print(p2[i].getNamaPenonton()+" || "); 

        } 

        System.out.println(""); 

    } 

Output: 

=== Box Office 2019 === 

Film 1 - Dilan 1991 

Sutradara = Pidi Baiq, Fajar Bustomi,  

Jumlah penonton film Dilan 1991 adalah 3 

|| Abas || Yogi || Anisa ||  

 

Film 2 - Avenger: Endgame 

Sutradara = Anthony Russo, Joe Russo,  

Jumlah penonton film Avenger: Endgame adalah 2 

|| Abas || Yogi ||  

 

Kode 5.3 RumahProduksi.java 

 

public class RumahProduksi{ 

    //property 

    private String sutradara; 

   /*Sebagai tugas praktikum 1, konversi property dibawah ini  

menggunakan kode sumber 

   -listFilm: Film[] = new Film[1000]; 

         //Array untuk menampung Film 

 74 

 

10 

11 

12 

11 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

   -jumlahFilm: int 

         //Jumlah dari Film yang ditampung (default = 0) 

   sampai property ini*/ 

     

    //konstruktor 

    public RumahProduksi(String sutradara){ 

        this.sutradara = sutradara; 

    } 

 

    //method 

    public String getNamaSutradara(){ 

        return sutradara; 

    }  

   /*Buat dan isi method-method dibawah ini 

    +buatFilm(f Film): void 

         //Tambah film yang dibuat 

    +getListFilm(): Film[] 

         //Kembalikan list film yang ditonton 

    +getJumlahFilm(): int 

         //Kembalikan jumlah film yang ditonton 

    sampai method ini*/ 

 

    public static void main(String[] args) { 

        RumahProduksi rp1 = new RumahProduksi("Pidi Baiq"); 

        RumahProduksi rp2 = new RumahProduksi("Fajar Bustomi"); 

        RumahProduksi rp3 = new RumahProduksi("Anthony Russo"); 

        RumahProduksi rp4 = new RumahProduksi("Joe Russo"); 

         

        rp1.buatFilm(new Film("Dilan 1990")); 

        rp1.buatFilm(new Film("Dilan 1991")); 

        rp2.buatFilm(new Film("Dilan 1990")); 

        rp2.buatFilm(new Film("Dilan 1991")); 

 75 

 

38 

39 

40 

41 

42 

43 

44 

45 

46 

47 

48 

49 

        rp3.buatFilm(new Film("Avenger: Endgame")); 

        rp4.buatFilm(new Film("Avenger: Endgame")); 

         

        System.out.println("Jumlah film yang dibuat  

"+rp1.getNamaSutradara()+" adalah "+rp1.getJumlahFilm()); 

        Film[] f1 = rp1.getListFilm(); 

        System.out.print("|| "); 

        for(int i=0; i<rp1.getJumlahFilm(); i++){ 

            System.out.print(f1[i].getNamaFilm()+" || "); 

        } 

    } 

Output: 

Jumlah film yang dibuat Pidi Baiq adalah 2 

|| Dilan 1990 || Dilan 1991 || 

Kode sumber 5.1 Class Penonton, Film, dan RumahProduksi 

5.5 Kesimpulan 

1. Keterkaitan umum antar class yaitu asosiasi, agregrasi, komposisi dan pewarisan 

2. Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class. 

3. Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua 

objek. 

4. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class. 

Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class.  

5. Kita bisa menyebut keteraitan komposisi jika keberadaan aggregated object 

tergantung pada aggregating object. 

5.6 Kuis dan Latihan Soal 

1. Jelaskan perbedaan antara keterkaitan asosiasi, agregrasi, dan komposisi! 

2. Disebut apakah keterkaitan yang menyiratkan kepemilikan? 

3. Keterkaitan yang memungkinkan muncul di antara objek-objek dari kelas yang sama 

adalah … 

 76 

 

5.7 Praktikum 

1. Lengkapi kode sumber 5.1 pada class Penonton 

2. Lengkapi kode sumber 5.1 pada class RumahProduksi 

Lihat pada class Film sebagai contoh acuan! 

 77 

 

BAB 6 ARRAY DAN COLLECTION 

6.1 Konsep Array 

Biasanya seorang programmer membutuhkan suatu cara untuk menyimpan data dengan 

jumlah data yang besar. Misalnya, setelah programmer berhasil menyimpan sejumlah data 

yang besar tadi akan digunakan untuk mengurutkan setiap data yang disimpan. Hal ini akan 

membutuhkan banyak variabel untuk menampung setiap nilai yang ada. Jika data itu  

berjumlah kurang dari 10 mungkin tidak akan menjadi problem  apabilai membuat sebanyak 

10 variabel. Akan tetapi, jika jumlah data yang disimpan itu  ratusan atau ribuan atau 

bahkan lebih, tentu programmer tidak akan mungkin menuliskan variabel sebanyak itu. Jadi 

bagaimana programmer akan menangani problem  ini? 

Dibutuhkan suatu cara yang efisien agar programmer tidak perlu menuliskan banyak variabel 

untuk menampung data. Beberapa bahasa pemrograman tingkat tinggi (seperti Java) sudah 

menyediakan struktur data yang disebut dengan istilah Array. Array memungkinkan 

programmer untuk menyimpan suatu koleksi elemen nilai yang serupa secara terurut dengan 

tipe data yang sama. Sebagai contoh, programmer membutuhkan penyimpanan nilai-nilai 

integer sebanyak 6 elemen nilai integer. Maka programmer hanya cukup membuat satu 

variabel array untuk menampung seluruh koleksi dari setiap elemen nilai integer yang ada. 

Setiap elemen nilai yang ada didalam Array diakses dengan suatu indeks. Indeks itu  

merepresentasikan urutan data yang ada didalam array. Pada bahasa pemrograman Java 

indeks dimulai dari nilai 0 (sebab   di bahasa pemrograman lain indeks kadang dimulai dari 

nilai 1). Berikut adalah ilustrasi array ListNilai: 

Tabel 6.1 Ilustrasi array ListNilai 

Indeks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

ListNilai  34 5 23 23 2 12 123 1 28 4 6 76 45 64 66 

 

Pada contoh itu  kita memiliki variabel array dengan nama ListNilai dengan tipe 

integer. Misal dari ListNilai itu  elemen pertama memiliki nilai 34 dan berada pada 

indeks ke-0. Kita dapat menyederhanakan pemanggilan nilai pada indeks ke-0 itu  

dengan cara ListNilai[0]=34. Sehingga jika dilihat elemen variabel ListNilai akan menjadi 

 78 

 

ListNilai[0], ListNilai[1], ... , ListNilai[14]. Perhatikan bahwa jumlah seluruh 

elemen array pada variabel ListNilai adalah 15, bukan 14. Hal itu disebab  kan indeks array 

dimulai dari 0 bukan 1. 

6.2 Deklarasi dan Pembuatan Array 

Deklarasi variabel array berbeda dengan deklarasi variabel primitif biasa. Deklarasi suatu 

variabel dari array tidak mengalokasikan ruang memori secara langsung, namun hanya 

menyiapkan lokasi penyimpanan data didalam memory sebagai referensi. Jika suatu variabel 

tidak memuat referensi dari array maka variabel itu  akan bernilai null. Berikut adalah 

cara untuk mendeklarasikan variabel array. 

tipeElement[] arrRefVar; 

atau, 

tipeElement arrRefVar[]; 

Suatu tipeElement bisa jadi apapun termasuk tipe data primitif atau objek. Pada contoh 

sintak kedua yaitu tipeElement arrRefVar[]; menggunakan gaya penulisan sintak pada 

C/C++, untuk pemograman dengan Java menuliskan sintak array dengan cara itu  tidak 

disarankan. Implementasi kode dari deklarasi array dengan nama variabel ListNilai dengan 

referensi array dari elemen bertipe data int adalah sebagai berikut: 

int[] ListNilai;  

Kita tidak dapat mengisi nilai element array sampai array itu  selesai diciptakan. Setelah 

mendeklarasikan array, untuk menciptakan array kita harus mengunakan operator new dan 

melakukan assignment kepada tipe data yang direferensi pada variabel array itu . Berikut 

adalah cara untuk menciptakan array pada variabel ListNilai yang sudah dideklarasikan 

sebelumnya: 

ListNilai = new int[15]; 

Atau kita dapat secara langsung mendeklarasikan dan menciptakan array, seperti berikut: 

int[] ListNilai = new int[15]; 

Untuk men-assign suatu nilai didalam array tentu kita harus melakukan dengan tipe data yang 

sesuai dengan yang di referensi oleh array itu . Pada variabel ListNilai hanya 

memperbolehkan nilai yang bertipe integer saja. Sintak untuk men-assign suatu nilai kedalam 

array adalah sebagai berikut: 

 79 

 

arrRefVar[indeks] = nilai; 

Sebagai contoh dari ListNilai yang sebelumnya sudah kita buat, adalah sebagai berikut: 

ListNilai[0] = 34; 

ListNilai[1] = 5; 

ListNilai[2] = 23; 

ListNilai[3] = 23; 

ListNilai[4] = 2; 

ListNilai[5] = 12; 

ListNilai[6] = 123; 

ListNilai[7] = 1; 

ListNilai[8] = 28; 

ListNilai[9] = 4; 

ListNilai[10] = 6; 

ListNilai[11] = 76; 

ListNilai[12] = 45; 

ListNilai[13] = 64; 

ListNilai[14] = 66; 

Pada dasarnya sewaktu array dibuat, programmer mendefinisikan nilai kapasitas dari array 

itu , misalnya pada variabel ListNilai memiliki kapasitas array sejumlah 15 elemen.  

Jumlah atau kapasitas dari elemen itu  dapat diakses dengan memanggil length dari nama 

variabel array yang dideklarasikan sebelumnya, seperti ListNilai.length. Sehingga kita 

dapat mengisi elemen array ke 14 dengan cara ListNilai[ListNilai.length-1] = 66; 

dari pada ListNilai[14] = 66;. Kenapa harus ListNilai.length-1? sebab   maksimal 

indeks yang dimiliki ListNilai adalah 14 bukan 15 yang merupakan jumlah seluruh element 

array. 

Bagaimana jika programmer tidak men-assign nilai dari variabel array yang sudah dibuat? 

Secara otomatis, ketika array diciptakan setiap elemen dari array itu  akan diberi nilai 

awal. Untuk tipe data numerik nilai awal adalah 0, karakter adalah \u0000, dan false untuk 

boolean.  

 80 

 

Inisialiasasi suatu array dapat dilakukan dengan dua cara. Cara pertama memasukkan nilai-

nilai elemen array saat array diciptakan secara langsung. Cara kedua adalah memasukkan 

nilai-nilai setelah array di ciptakan. Cara pertama adalah sebagai berikut: 

double[] arrNilai = {23.2, 1.2, 4.2}; 

Cara yang kedua adalah sebagai berikut: 

double[] arrNilai = new double[3]; 

arrNilai[0] = 23.2; 

arrNilai[1] = 1.2; 

arrNilai[2] = 4.2; 

Perhatikan bahwa untuk cara pertama tidak bisa dipisahkan tanpa pembuatan array (dengan 

keyword new). Berikut adalah cara yang SALAH ketika melakukan inisialisasi array di Java: 

double[] arrNilai; 

arrNilai[0] = 23.2; 

arrNilai[1] = 1.2; 

arrNilai[2] = 4.2; 

Cara kedua memberikan leluasa kepada programmer untuk dapat menginisialisasi setiap 

elemen array. Namun demikian, jika jumlah kapasitas array yang diciptakan besar, maka 

tidak mungkin akan dilakukan di isi nilai satu per satu. Maka dari itu, biasanya programmer 

akan menginisialisasi dengan bantuan perulangan. Berikut adalah Kode 7.1 merupakan 

contoh mengisi array dan men-outputkan array dengan mekanisme perulangan. 

Kode 6.1 ArrayInputOutputDemo.java 

10 

public class ArrayInputOutputDemo { 

    /* Main Method */ 

    public static void main(String[] args){ 

        // deklarasi dan ciptakan array 

        double[] arrNilai = new arrNilai[10]; 

        // inputkan nilai pada setiap elemen array 

        java.util.Scanner input = new java.util.Scanner(System.in); 

        System.out.print("Enter " + arrNilai.length + " values: "); 

        for (int i = 0; i < arrNilai.length; i++) 

 81 

 

11 

12 

13 

14 

15 

16 

17 

             arrNilai[i] = input.nextDouble(); 

        // outputkan setiap elemen array yang sudah diinputkan 

        for (int i = 0; i < arrNilai.length; i++) { 

             System.out.print(arrNilai[i] + " "); 

        } 

    } 

 

Kode 7.1 dapat dimodifikasi jika user tidak menginginkan untuk menginputkan nilai secara 

manual melainkan dengan nilai random dari 0 sampai 10 misalnya. Maka mekanisme input 

nilai pada setiap elemen array dapat diganti seperti berikut: 

for (int i = 0; i < arrNilai.length; i++) { 

arrNilai [i] = Math.random() * 10; 

Java juga memiliki mekanisme perulangan khusus yang disebut dengan foreach. Programmer 

dapat menggunakan perulangan ini untuk menelusuri array tanpa harus mengakses indeksnya. 

Secara umum sintaks untuk membuat perulangan foreach ini adalah sebagai berikut: 

for(tipedataElemen elemen: variabelreferensiarray) { 

//proses setiap elemen array 

Kita akan mencoba untuk memodifikasi bagian output dari Kode 7.1 yang tadinya dengan 

perulangan for menjadi perulangan foreach. Berikut adalah kode output yang sudah dirubah: 

for(double e: arrNilai) { 

System.out.print(e+" "); 

6.3 Mengolah data dengan Array 

Array berisi data-data yang mungkin akan diolah sedemikian rupa sehingga dapat 

memberikan output keluaran seperti yang diinginkan. Array juga dapat di salin / copy dengan 

cara membuat dua buah variabel dengan tipe data array dan memanfaatkan operator ‘=’. 

Pastikan bahwa kedua variabel array itu  bertipe sama. 

 82 

 

arr1 = arr2; 

Berikut adalah contoh implementasi menyalin nilai setiap member array dari suatu variabel 

ke variabel lain: 

int[] arrSumber = {1,2,3,4,5}; 

int[] arrTarget = new int[arrSumber.length]; 

for(int i=0;i<arrSumber.length;i++) 

 arrTarget[i] = arrSumber[i]; 

Cara yang lain adalah dengan menggunakan System.arraycopy. System.arraycopy 

memiliki empat lima buah parameter yaitu variabel sumber yang akan di salin, posisi awal 

indeks dari variabel sumber, variabel target, posisi awal indeks dari variabel target, dan 

banyaknya member array yang akan di salin. Berikut adalah implementasi kodenya: 

System.arraycopy(arrSumber, 0, arrTarget, 0, arrSumber.length); 

Array juga dapat digunakan sebagai referensi didalam parameter suatu method dan 

mengembalikan nilai dari suatu method. Misalnya kita akan membuat method untuk 

menyalin array dengan versi sendiri: 

public static int[] copyMyArray(int[] arrSumber) 

 int[] arrTarget = new int[arrSumber.length]; 

 for(int i=0;i<arrSumber.length;i++) 

  arrTarget[i] = arrSumber[i]; 

return arrTarget; 

Untuk memanggil method itu  dapat dilakukan didalam method main seperti berikut: 

int[] arrS = {23,42,2,1}; 

int[] arrT = copyMyArray(arrS); 

for(int i=0;i<arrT.length;i++) 

System.out.println(arrT[i]); 

 83 

 

Java mendukung banyaknya argumen variabel dengan tipe data yang sama yang diteruskan 

kedalam suatu method yang dapat dianggap sebagai array. Hal itu  dapat juga disebut 

dengan list dengan agrument yang panjang. Kode 7.2 merupakan contoh implementasi list 

dengan argumen yang panjang yang digunakan pada pemanggilan dan parameter suatu 

method.  

Kode 6.2 AgumentVariabelDemo.java 

10 

11 

12 

13 

14 

15 

16 

17 

public class AgumentVariabelDemo { 

 public static void main(String[] args) { 

  cetakMaks(34, 3, 3, 2, 56.5); 

  cetakMaks(new double[]{1, 2, 3}); 

 } 

 public static void cetakMaks(double... numbers) { 

  if (numbers.length == 0) { 

   System.out.println("tidak ada argumen."); 

   return; 

  } 

  double result = numbers[0]; 

  for (int i = 1; i < numbers.length; i++) 

   if (numbers[i] > result) 

    result = numbers[i]; 

  System.out.println("Nilai maksimal: " + result); 

 } 

 

Programmer juga dapat mencari element didalam array. Pada dasarnya array menyimpan 

data-data yang mungkin akan di cari oleh user. Dalam pencarian data didalam array dapat 

menggunakan algoritma pencarian seperti: pencarian linier/sekuensial, pencarian biner, dan 

lain sebagainya. Berikut adalah contoh method yang berisi algoritma pencarian linier didalam 

array. 

 

 

 84 

 

public static int linierSearch(int[] arr, int yangdicari) 

 for(int i=0;i<arr.length;i++) 

  if(yangdicari == arr[i]) 

   return i; 

 return -1; 

Elemen array dapat juga diurutkan dengan suatu algoritma pengurutan. Seperti halnya 

algoritma pencarian, banyak sekali algoritma pengurutan yang dapat digunakan untuk 

mengurutkan setiap elemen array, seperti: pengurutan sekuensial, buble sort, merge sort, dan 

lain sebagainya. Berikut adalah contoh method dengan pengurutan sekuensial: 

public static void selectionSort(double[] list) { 

 for (int i = 0; i < list.length - 1; i++) { 

 // cari nilai minimal dari list[i..list.length−1] 

 double min = list[i]; 

 int minIndex = i; 

 

 for (int j = i + 1; j < list.length; j++) { 

  if (min > list[j]) { 

   min = list[j]; 

   minIndex = j; 

  } 

 } 

 

 // tukar list[i] dengan list[minIndex] 

 if (minIndex != i) { 

  list[minIndex] = list[i]; 

  list[i] = min; 

 } 

Jika programmer tidak ingin susah-susah untuk membuat method pencarian atau pengurutan 

sendiri, Java menyediakan class Arrays. Class Arrays memungkinkan kita untuk memanggil 

 85 

 

beberapa method seperti pencarian atau pengurutan. Untuk memanfaatkan method-method 

atau operasi yang ada didalam class Arrays harus di tambahkan terlebih dahulu import 

java.util.Arrays;. Berikut adalah contoh operasi sorting dan searching dengan class 

Arrays: 

double[] num = {1.2,31,2.65,10}; 

Arrays.sort(num); 

Arrays.binarySearch(num, 1.2); 

6.4 Array Multidimensi 

Biasanya data secara fisik direpresentasikan dengan bentuk tabel. Sedangkan yang Array 

hanya berisi sebaris atau secarik data. Java memungkinkan untuk merepresentasikan data 

Array seperti halnya suatu tabel yaitu dengan Array 2D (dimensi). Misalnya ada tabel seperti 

berikut: 

Tabel 6.2 Tabel merepresentasikan Array 2D 

Nama Nilai Matematika Nilai Fisika 

Hanum 92 80 

Eko 75.6 98.4 

Heri 67 70 

  

Dari data nilai itu , programmer dapat memubuat array 2D-nya dengan cara seperti 

berikut: 

double[][] nilai =  { 

{92,80}, 

{75.6,98.4}, 

{67,70}}; 

Perhatikan bahwa sintak [][] merupakan deklarasi untuk array 2D. Kode sebelumnya dapat 

dibuat seperti berikut: 

double[][] nilai = new double [3][2]; 

nilai[0][0] = 92; nilai[0][1] = 80; nilai[1][0] = 75.6; 

 86 

 

nilai[1][1] = 98.4; nilai[2][0] = 67; nilai[2][1] = 70; 

Array 2D seringkali juga dapat digunakan untuk pengganti “matriks”. Untuk dapat 

menggunakan array 2D biasanya programmer tetap memanfaatkan perulangan. Berikut 

adalah kode untuk deklarasi dan inisialisasi array 2D dengan diberikan nilai random dan 

kemudian dicetak pada console output: 

//deklarasi 

int[][] matriks = new int[10][10]; 

//inisialisasi dan pemberian nilai random 0-99 

for(int baris=0;baris<matriks.length;baris++) 

 for(int kolom=0;kolom<matriks[baris].length;kolom++) 

  matriks[baris][kolom] = (int)(Math.random() * 100); 

//cetak pada console output 

for(int baris=0;baris<matriks.length;baris++) { 

 for(int kolom=0;kolom<matriks[baris].length;kolom++) { 

  System.out.print(matriks[baris][kolom]+” ”); 

System.out.println(); 

6.5 Array dari Objek 

Kita juga dapat membuat array dari objek. Sebagai contoh, sebelumnya terdapat class 

MahasiswaIndividu. Kemudian dari class MahasiswaIndividu itu  akan dibuat array dari 

MahasiswaIndividu dan akan digunakan untuk mengakses member class MahasiswaIndividu. 

Kode 7.3 merupakan class MahasiswaIndividu dan Kode 7.4 merupakan class 

TestMahasiswaIndividu yang mengimplementasikan array dari objek MahasiswaIndividu. 

Kode 6.3 MahasiswaIndividu.java 

public class MahasiswaIndividu 

 private String nim; 

 public void setNim(String nim) 

 { 

  this.nim = nim; 

 87 

 

10 

11 

12 

 } 

 public String getNim() 

 { 

  return this.nim; 

 } 

 

Kode 6.4 TestMahasiswaIndividu.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

public class TestMahasiswaIndividu 

 public static void main(String[] args) 

 { 

  //deklarasi list dari objek 

  MahasiswaIndividu[] listMhs = new MahasiswaIndividu[10]; 

   

  //instance setiap member list 

  for(int i=0;i<10;i++) 

   listMhs[i] = new MahasiswaIndividu(); 

   

  //akses setter getter method dari setiap member 

  for(int i=0;i<10;i++) 

   listMhs[i].setNim("A11.2020."+(i+1)); 

   

  for(int i=0;i<10;i++) 

   System.out.println(listMhs[i].getNim()); 

 } 

 

Kode 7.4 akan menghasilkan output sebagai berikut: 

A11.2020.1 

A11.2020.2 

 88 

 

A11.2020.3 

A11.2020.4 

A11.2020.5 

A11.2020.6 

A11.2020.7 

A11.2020.8 

A11.2020.9 

A11.2020.10 

6.6 Array Dinamis (List Collection) 

Berbeda dengan array yang sebelumnya dijelaskan, array dinamis merupakan bentuk array 

yang memungkinkan programmer untuk dapat membuat list dengan mengatur setiap member 

list sesuka hati. Di Java terdapat banyak cara untuk membuat array dinamis tanpa harus 

membuat array dinamis manual, seperti, list, linked list, queue, ataupun stack. Terdapat class 

ArrayList di Java. ArrayList merupakan kelas turunan dari List yang memiliki ukuran list 

yang bisa bertambah (dinamis/growable). Class ini salah satu bagian dari Generic 

Programming di Java. Generic Programming adalah suatu teknik pemorgraman dari 

pembentukan variable atau method atau class yang  dapat digunakan untuk semua jenis tipe 

data. ArrayList termasuk dalam java framework collection. 

 

Gambar 6.1 Class Diagram ArrayList 

Didalam ArrayList terdapat beberapa method yang seringkali digunakan. Berikut adalah 

beberapa method itu : 

 89 

 

 add(obj)  untuk menambahkan member list 

 remove(obj)  untuk menghapus/menghilangkan member list 

 get(index)  mendapatkan akses memberlist ke-index 

Kode 7.5 adalah Kode TestMahasiswaIndividu yang isinya telah dirubah menggunakan 

ArrayList. 

Kode 6.5 TestMahasiswaIndividu.java 

 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

import java.util.ArrayList; 

public class TestMahasiswaIndividu 

 public static void main(String[] args) 

 { 

  //deklarasi list dari objek 

  ArrayList<MahasiswaIndividu> listMhs = new  

ArrayList<MahasiswaIndividu>(); 

   

  //instance setiap member list dengan menambahkan kedalam  

list 

  for(int i=0;i<10;i++) 

   listMhs.add(new MahasiswaIndividu()); 

   

  //akses setter getter method dari setiap member 

  for(int i=0;i<10;i++) 

   listMhs.get(i).setNim("A11.2020."+(i+1)); 

   

  for(int i=0;i<10;i++) 

   System.out.println(listMhs.get(i).getNim()); 

 } 

 

 90 

 

Selain ArrayList juga terdapat Vector. Turunan dan implementasi yang sama dengan 

ArrayList. Setiap vektor mencoba untuk mengoptimalkan manajemen penyimpanan dengan 

mempertahankan kapasitasnya. Termasuk juga kedalam Java Collection. Lebih banyak 

Method dari Vector jika dibandingakan dengan ArrayList. Vector tensinkronisasi sedangkan 

ArrayList tidak. Tensinkronisasi maksudnya ”Thread-Safe" dari semua keuntungan method 

yang sedang disinkronkan (melalui kata kunci synchronized). Berikut adalah method-method 

yang ada pada Vector: 

 addElement(element)   Menambah element 

 capacity()   Mengembalikan kapasitas vektor 

 clone()  Mengembalikan objek  yang di copy dari vector 

 containts(element) mencari element vector 

 copyInto(element[]) copy element pada array tertentu 

 elementAt(index)  ambil elemen dari index yang ditentukan 

 insertElementAt(element , index)  tambahkan element dengan indexnya 

 isEmpty() cek apakah vector Kosong atau tidak 

 remove(index) hapus element berdasarkan index 

 size() ukuran vektor 

 set(index, element)   isikan elemen vector pada suatu index yang diingkan 

Kode 7.6 merupakan implementasi dari penggunaan Vector. 

Kode 6.6 TestVector.java 

import java.util.Vector; 

public class TestVector 

 public static void main(String[] args) 

 { 

  // initial size is 3, increment is 2 

  Vector v = new Vector(3, 2); 

 91 

 

10 

11 

12 

 

13 

14 

 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

 

29 

 

30 

31 

32 

33 

34 

35 

  System.out.println("Initial size: " + v.size()); 

  System.out.println("Initial capacity: " + v.capacity()); 

 

  v.addElement(new Integer(1)); 

  v.addElement(new Integer(2)); 

  v.addElement(new Integer(3)); 

  v.addElement(new Integer(4)); 

  System.out.println("Capacity after four additions: " +  

v.capacity()); 

 

  v.addElement(new Double(5.45)); 

  System.out.println("Current capacity: " + v.capacity()); 

 

  v.addElement(new Double(6.08)); 

  v.addElement(new Integer(7)); 

  System.out.println("Current capacity: " + v.capacity()); 

 

  v.addElement(new Float(9.4)); 

  v.addElement(new Integer(10)); 

  System.out.println("Current capacity: " + v.capacity()); 

  v.addElement(new Integer(11)); 

  v.addElement(new Integer(12)); 

  System.out.println("First element: " +  

(Integer)v.firstElement()); 

  System.out.println("Last element: " +  

(Integer)v.lastElement()); 

 

  if(v.contains(new Integer(3))) 

   System.out.println("Vector contains 3."); 

  

 } 

 92 

 

 

6.7 Kesimpulan 

Array sangat membantu programmer untuk membuat list dari serangkaian data. Terdapat dua 

jenis array yaitu array statis dan dinamis. Array Statis merupakan array yang sudah memiliki 

ukuran yang ditentukan dari awal. Sedangkan array dinamis merupakan array yang dapat 

memiliki ukuran yang dapat disesuaikan (growable). Pada dasarnya stuktur data akan lebih 

teratur dan rapi jika menggunakan array. Pada java sudah disediakan beberapa objek array 

dinamis seperti ArrayList dan Vector. 

6.8 Kuis dan Latihan Soal 

1. Jelaskan apa yang dimaksud dengan array? 

2. Apa perbedaan array statis dan dinamis? 

3. Apakah bisa membuat list dari objek dengan Vector? Jika bisa buatkan contoh 

programnya! 

6.9 Praktikum 

Buat class Mobil dan kemudian buat implementasi list dari Mobil dengan menggunakan 

ArrayList! 

 93 

 

BAB 7 PEWARISAN 

7.1 Konsep Pewarisan 

Pewarisan/ inheritance memungkinkan kita untuk mendefinisikan class baru dari class yang 

sudah ada. Konsep ini sangat penting dan bermanfaat untuk menghindari redundansi, 

membuat sistem mudah dipahami dan musah dirawat. Misalnya terdapat class 

PersegiPanjang, Persegi, Lingkaran, dan Segitiga. Class-class itu  memiliki banyak fitur/ 

method umum yang sama seperti luas, keliling, volume dan lain-lain. Agar tidak membuat 

method umum secara berulang-ulang, kita perlu menggunakan konsep pewarisan. 

Meletakkan method umum ke dalam superclass dan method itu  dapat digunakan oleh 

subclass (class PersegiPanjang, Persegi, Lingkaran, dan Segitiga). Pewarisan ini disebut 

hierarchical inheritance (1 superclass dan banyak subclass), terdapat jenis pewarisan yang 

lain seperti single inheritance (1 superclass dan 1 subclass), multi level inheritance (1 

superclass, banyak subclass, dan banyak subclass lagi), dan multiple inheritance (2 superclass 

atau lebih dan 1 subclass), jenis ini bisa dilakukan dengan interface. Jenis-jenis pewarisan 

dapat dilihat pada tabel 7.1. 

 

Tabel 7.1. Jenis-jenis pewarisan 

Struktur Contoh Kode Sumber 

Single Inheritance  

 

 

 

 

public class Bentuk{ 

    …. 

public class PersegiPanjang extends Bentuk{ 

    …. 

Multi Level  

Inheritance 

 

 

 

 

 

public class Bentuk{ 

    …. 

public class PersegiPanjang extends Bentuk{ 

    …. 

public class Balok extends PersegiPanjang{ 

    …. 

Hierarchical  

Inheritance 

 

 

 

public class Bentuk{ 

    …. 

public class PersegiPanjang extends Bentuk{ 

    …. 

public class Lingkaran extends Bentuk{ 

    …. 

PersegiPanjang 

Bentuk 

Balok 

Bentuk 

PersegiPanjang 

PersegiPanjang 

Bentuk 

Lingkaran 

 94 

 

Multiple  

Inheritance 

 

 

 

public class Bentuk{ 

    …. 

public interface Dimensi{ 

    …. 

public class Balok extends implements Dimensi{ 

    …. 

7.2 Superclasses dan Subclasses 

Superclass dapat juga disebut dengan parent class atau base class, dan subclass 

disebut dengan child class, extended class, atau derived class. Superclass berisi method dan 

property umum. Misal kita akan membuat superclass Bentuk, dengan property warna dan isi. 

Sedangkan kita memiliki subclass PersegiPanjang, Persegi, Lingkaran, dan Segitiga. Property 

yang dimiliki superclass Bentuk dapat digunakan pula oleh masing-masing subclassnya. 

sebab   kita sudah memiliki class PersegiPanjang dan Lingkaran pada bab-bab sebelumnya, 

kita akan mengkonversi mandiri jadi class pewarisan di bagian praktikum.  

Kali ini, mari kita menggunakan contoh lain dengan jenis multi level inheritance. 

Class Kendaraan sebagai superclass, class Udara sebagai subclass, dan class Pesawat sebagai 

subclass lainnya. Berikut gambar 7.1 yang berisi tentang UML Pewarisan Kendaraan. 

Kendaraan 

-nama: string  

-tahunProduksi: integer  

+getNama(): string  

+setNama(nama: String): void  

+getTahunProduksi(): integer 

+setTahunProduksi(tahunProduksi: int): void  

+Kendaraan() 

+Kendaraan(nama: string, tahunProduksi: int)  

+cetak(): void   

 

Udara 

-mesin: boolean  

+getMesin(): boolean  

+setMesin(mesin: boolean): void  

+Udara()  

+Udara(nama: string, tahunProduksi: int, mesin: boolean)  

+cetak(): void  

 

Pesawat 

-muatan: integer   

+getMuatan(): integer   

+setMuatan(muatan: integer ): void  

Balok 

Bentuk 

<<interface>> 

Dimensi 

 95 

 

+Pesawat ()   

+Pesawat (nama: string, tahunProduksi: int, mesin: boolean, muatan: int)  

+reset(nama: string, tahunProduksi; int, mesin: boolean, muatan: int): void  

+kategori(muatan: int): String 

+cetak(): void  

Gambar 7.1. UML Pewarisan Kendaraan 

Class Kendaraan memiliki property dan method umum, seperti contoh property nama 

dan tahunProduksi, serta method-method pendukung. sebab   class Kendaraan merupakan 

superclass, maka semua property dan method itu  dapat digunakan pada class Udara. 

Class Udara juga merupakan superclass dari class Pesawat, jadi class Pesawat bisa 

mengakses semua property dan method milik class Udara maupun class Kendaraan. Gunakan 

katakunci extends untuk menunjukkan bahwa kelas itu  merupakan pewarisan.  

Subclass    Superclass 

public class Udara extends Kendaraan{} 

Berikut kode sumber 7.1 yang menjelaskan pewarisan kendaraan berdasarkan UML gambar 

7.1. 

Kode 7.1 Kendaraan.java 

10 

11 

12 

13 

14 

15 

public class Kendaraan { 

    private String nama; 

    private int tahunProduksi; 

     

    public String getNama(){ 

        return nama; 

    } 

    public void setNama(String nama){ 

        this.nama = nama; 

    } 

    public int getTahunProduksi(){ 

        return tahunProduksi; 

    } 

    public void setTahunProduksi(int tahunProduksi){ 

        this.tahunProduksi = tahunProduksi; 

 96 

 

16 

17 

 

18 

19 

20 

 

21 

22 

23 

24 

25 

26 

27 

28 

    } 

    public Kendaraan(){ //overloading method, ingat.. kontruktor juga  

merupakan methhod 

         

    } 

    public Kendaraan(String nama, int tahunProduksi){ //overloading  

method 

        setNama(nama); 

        setTahunProduksi(tahunProduksi); 

    } 

    public void cetak(){//overriding method 

        System.out.println("Nama\t\t= "+nama); 

        System.out.println("Tahun Produksi  = "+tahunProduksi); 

    } 

 

Kode 7.2 Udara.java 

10 

11 

12 

13 

 

14 

public class Udara extends Kendaraan{ 

    private boolean mesin; 

     

    public boolean getMesin(){ 

        return mesin; 

    } 

    public void setMesin(boolean mesin){ 

        this.mesin = mesin; 

    } 

    public Udara(){//overloading method 

         

    } 

    public Udara(String nama, int tahunProduksi, boolean mesin){  

//overloading method 

 97 

 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

        super(nama, tahunProduksi); //memanggil konstruktor Kendaraan 

        setMesin(mesin); 

    } 

    public void cetak(){ //overriding method 

        super.cetak(); //memanggil method cetak dari Kendaraan 

        System.out.print("Mesin\t\t= "); 

        if(mesin==true) 

            System.out.println("Jet"); 

        else 

            System.out.println("Baling-baling"); 

    } 

 

Kode 7.3 Pesawat.java 

10 

11 

12 

13 

 

14 

 

15 

16 

public class Pesawat extends Udara{ 

    private int muatan; 

     

    public int getMuatan(){ 

        return muatan; 

    } 

    public void setMuatan(int muatan){ 

        this.muatan = muatan; 

    } 

    public Pesawat(){//overloading method 

         

    } 

    public Pesawat(String nama, int tahunProduksi, boolean mesin, int  

muatan){ //overloading method 

        super(nama, tahunProduksi, mesin); //memanggil konstruktor  

Udara 

        setMuatan(muatan); 

 98 

 

17 

18 

 

19 

20 

 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

    } 

    public void reset(String nama, int tahunProduksi, boolean mesin,  

int muatan){ 

        setNama(nama); //memanggil method setNama dari Kendaraan 

        setTahunProduksi(tahunProduksi); //memanggil method  

setTahunProduksi dari Kendaraan 

        setMesin(mesin); //memanggil method setMesin dari Udara 

        setMuatan(muatan); 

    } 

    public String kategori(int muatan){ 

        if(muatan<=100) 

            return "Mini"; 

        else if(muatan<=200) 

            return "Sedang"; 

        else 

            return "Besar"; 

    } 

    public void cetak(){ //overriding method 

        super.cetak();//memanggil method cetak dari Udara 

        System.out.println("Muatan \t\t= "+muatan+" orang"); 

        System.out.println("Kategori\t= "+kategori(muatan)); 

    } 

 

Kode 7.4 PesawatDemo.java 

public class PesawatDemo { 

    public static int min2(int a, int b){ 

        if(a<b) 

            return a; 

        else 

            return b; 

 99 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

 

36 

 

37 

    } 

    public static boolean isNamaSama(Pesawat p1, Pesawat p2){ 

         

if(p1.getNama().toLowerCase().equals(p2.getNama().toLowerCase())) 

            return true; 

        else 

            return false; 

    } 

    public static void main(String[] args){ 

        Pesawat[] p = new Pesawat[3]; 

        p[0] = new Pesawat(); 

        p[1] = new Pesawat("Garuda Boeing 777", 1990, true, 305); 

        p[2] = new Pesawat("Citilink Airbus A320", 1988, true, 150); 

        p[0].reset("Wings Air ATR 72-500", 1988, false, 72); 

         

        p[0].cetak(); System.out.println(""); 

        p[1].cetak(); System.out.println(""); 

        p[2].cetak(); System.out.println(""); 

         

        System.out.print("Nama pesawat pertama dan kedua "); 

        if(isNamaSama(p[0], p[1])) 

            System.out.println("sama"); 

        else 

            System.out.println("tidak sama"); 

         

        System.out.print(""); 

        if(p[0].getMuatan()<min2(p[1].getMuatan(), p[2].getMuatan())) 

            System.out.println("Muatan paling sedikit =  

"+p[0].getNama()); 

        else if(p[1].getMuatan()<min2(p[0].getMuatan(),  

p[2].getMuatan())) 

            System.out.println("Muatan paling sedikit = 

 100 

 

 

38 

39 

 

40 

41 

"+p[1].getNama()); 

        else 

            System.out.println("Muatan paling sedikit =  

"+p[2].getNama()); 

    } 

Output: 

Nama  = Wings Air ATR 72-500 

Tahun Produksi  = 1988 

Mesin  = Baling-baling 

Muatan   = 72 orang 

Kategori = Mini 

 

Nama  = Garuda Boeing 777 

Tahun Produksi  = 1990 

Mesin  = Jet 

Muatan   = 305 orang 

Kategori = Besar 

 

Nama  = Citilink Airbus A320 

Tahun Produksi  = 1988 

Mesin  = Jet 

Muatan   = 150 orang 

Kategori = Sedang 

 

Nama pesawat pertama dan kedua tidak sama 

Muatan paling sedikit = Wings Air ATR 72-500 

 

 101 

 

7.3 Keyword Super 

Keyword super digunakan untuk merujuk langsung property/ method/ konstruktor pada 

superclass. Contoh masing-masing penerapan sebagai berikut: 

 Keyword super untuk property,contohnya super.nama berarti kita merujuk property nama 

dari class Kendaraan 

 Keyword super untuk method, contohnya pada kode sumber 7.1 Udara.java baris ke-17. 

Menggunakan super.cetak(); berarti memanggil method cetak dari Kendaraan. sebab   

pada class Udara juga memiliki method cetak, maka kita wajib menggunakan super jika 

ingin memanggil method cetak milik superclass 

 Keyword super untuk konstruktor, contohnya pada kode sumber 7.1 Udara.java baris ke-

13. Menggunakan super(nama, tahunProduksi); berarti memanggil konstruktor 

Kendaraan yang memiliki parameter inputan nama dan tahunProduksi. 

7.4 Overriding Method 

Overriding method adalah method yang memiliki nama dan parameter inputan yang sama. Itu 

berarti overriding menyediakan implementasi baru untuk suatu method dalam subclass. 

Contohnya pada kode sumber 7.1 untuk method cetak(). Method cetak pada Kendaraan.java 

terletak di baris ke 23, pada Udara.java terletak di baris 16, dan pada Pesawat.java terletak di 

baris ke 31. Jika kita ingin memanggil method cetak milik superclass, kita harus 

menggunakan keyword super. Kalau tidak, maka method cetak merujuk pada diri sendiri. 

 

7.5 Overriding vs Overloading 

Overriding method adalah method yang memiliki nama dan parameter inputan yang sama. 

Sedangkan overloading method adalah method-method yang memiliki nama yang sama 

namun berbeda-beda parameter inputannya, kita sudah membahsanya tuntas pada BAB 3.3. 

Untuk melihat perbedaan overriding dan overloading dengan lebih jelas, mari kita lihat tabel 

7.1 di bawah ini. 

 

 

 102 

 

Tabel 7.1. Overriding vs Overloading 

Overriding Overloading 

public class Kendaraan { 

       public void 

cetak(){//overriding method 

             … 

       } 

public class Udara extends Kendaraan 

       public void 

cetak(){//overriding method 

             … 

       } 

public class Kendaraan { 

 

    public Kendaraan(){ 

//overloading method, ingat.. 

kontruktor juga merupakan methhod 

             …         

    } 

    public Kendaraan(String nama, 

int tahunProduksi){ //overloading 

method 

             … 

    } 

 

7.6  Kesimpulan 

Pewarisan/ inheritance memungkinkan kita untuk mendefinisikan class baru dari class yang 

sudah ada. Konsep ini sangat penting dan bermanfaat untuk menghindari redundansi, 

membuat sistem mudah dipahami dan musah dirawat. Superclass dapat juga disebut dengan 

parent class atau base class berisi property atau method umum yang akan diturunkan untuk 

subclass. Subclass disebut dengan child class, extended class, atau derived class, dapat 

menggunakan property atau method dari superclass. Syarat untuk melakukan pewarisan, 

harus menggunakan keywords extends. Keyword super digunakan untuk merujuk langsung 

property/ method/ konstruktor pada superclass. Overriding method adalah method yang 

memiliki nama dan parameter inputan yang sama. Itu berarti overriding menyediakan 

implementasi baru untuk suatu method dalam subclass. 

 

7.7 Kuis dan Latihan Soal 

1. Apa manfaat dari pewarisan? 

2. Apakah benar, kita bisa menggunakan semua property atau method dari superclass? 

 103 

 

3. Apa keyword yang digunakan untuk melakukan pewarisan? 

4. Apa keyword yang digunakan untuk merujuk langsung property/ method/ konstruktor 

pada superclass? 

5. Jelaskan perbedaan overloading dan overriding! 

7.8 Praktikum 

1. Buatlah implementasi kode sumber dari UML class diagram di bawah ini! 

2. Buatlah UML Class Diagram dan kode sumber yang menerapkan konsep pewarisan 

dengan tema bebas! Minimal 3 class. 

 

 

 

 

 

 

 

 

 

 

Lingkaran 

-radius: double = 0.0 

+Lingkaran() 

+Lingkaran(radius: double) 

+Lingkaran(radius: double, warna: 

String, isi: boolean) 

+setRadius(): double 

+getRadius(): double 

+getLuas(): double 

+getKeliling(): double 

+toString(): String 

 

 

 

Bentuk 

-warna: String = “red” 

-isi: boolean = true 

+Bentuk() 

+Bentuk(warna: String, isi: boolean) 

+getWarna(): String 

+setWarna(warna: String): void 

+setIsi(isi: boolean): boolean 

+getIsi(): Boolean 

+toString(): String 

PersegiPanjang 

-panjang: double = 1.0 

-lebar: double = 1.0 

+PersegiPanjang() 

+PersegiPanjang(panjang: double, lebar: 

double) 

+PersegiPanjang(panjang: double, lebar: 

double: double, warna: String, isi: boolean) 

+setPanjang(): void 

+getPanjang (): double 

+setLebar(): void 

+getLebar(): double 

+getLuas(): double 

+getKeliling(): double 

+toString(): String 

 104 

 

BAB 8 POLYMORPHISM 

8.1 Konsep Polymorphism 

Tiga pilar dasar pada PBO yaitu Enkapsulasi, Inheritance, dan Polymorphism. Kita sudah 

mempelajari Enkapsulasi dan Inheritance.  Sebelum ke polymorphism, ada dua istilah yang 

harus dimengerti terlebih dahulu:  

 Class yang didefinisikan oleh sub-class disebut dengan subtype 

 Class yang didefinisikan oleh super-class disebut dengan supertype 

Sebagai contoh ObjekGeometri merupakan supertype dan Kotak merupakan subtype 

sebagaimana yang sudah dipahami seperti pada konsep inheritance. Secara sederhana 

Polymorphism berarti memiliki arti banyak bentuk. Dalam pemrograman berorientasi objek, 

polymorphism berarti suatu variable dari supertype dapat mereferensi objek subtype. 

Lalu apa yang dimaksud dengan mereferensi? Hubungan inheritance memungkinkan subclass 

untuk mewarisi fitur dari superclass-nya dengan tambahan fitur baru. Subclass adalah 

spesialisasi superclass-nya. Setiap contoh dari subclass juga merupakan instance dari 

superclass, tetapi tidak sebaliknya. Misalnya setiap kotak adalah ObjekGeometri, tetapi tidak 

setiap ObjekGeometri adalah kotak. sebab   itu, kita bisa selalu meneruskan instance dari 

subclass ke parameter dari jenis superclassnya. 

Kode 8.1 ObjekGeometri.java 

10 

11 

public class ObjekGeometri 

 private String color = "red"; 

  

 public void setColor(String color) 

 { 

  this.color = color; 

 } 

 public String getColor() 

 { 

  return this.color; 

 105 

 

12 

13 

 } 

 

Kode 8.2 Lingkaran.java 

public class Lingkaran extends ObjekGeometri 

 

 

Kode 8.3 Kotak.java 

public class Kotak extends ObjekGeometri 

 

 

Kode 8.4 TestPolymorphism.java 

10 

11 

12 

13 

14 

15 

public class TestPolymorphism 

 public static void main(String[] args) 

 { 

  Kotak persegi = new Kotak(); 

  persegi.setColor("Blue"); 

  ObjekGeometri bentukSem = new ObjekGeometri(); 

  bentukSem.setColor("Black"); 

   

  displayObject(persegi); 

  displayObject(new Lingkaran()); 

  displayObject(bentukSem); 

 } 

 public static void displayObject(ObjekGeometri obj) 

 { 

 106 

 

16 

17 

18 

  System.out.println(obj.getColor()); 

 } 

Output 

Blue 

Red 

Black 

 

Pada Kode 8.4 terdapat static method untuk mendisplay warna objek yaitu displayObject. 

Pada mehthod itu  terdapat parameter masukan ObjekGeometri yang berarti super-type 

dari Lingkaran dan Kotak. Secara sederhana polymorphism berarti variabel super-type dapat 

merujuk ke objek sub-type. 

8.2 Dynamic Binding 

Dynamic Binding merupakan perluasan dari konsep polymorphism yang tidak hanya super-

type dan sub-type juga, tetapi terkadang super-type juga merupakan sub-type dari super-type 

yang lain. Sehingga jika akan membuat method dengan dynamic binding berarti method yang 

dapat diimplementasi pada beberapa kelas sepanjang rantai keturunan. Method yang akan di 

panggil secara dinamis dan terikat saat runtime. Kode 8.5 adalah contoh penerapan Dynamic 

Binding. 

Kode 8.5 DynamicBindingDemo.java 

10 

public class DynamicBindingDemo {   

 public static void main(String[] args) { 

    m( new GraduateStudent());  

    m(new Student()); 

    m(new Person()); 

    m(new Object()); 

 }   

 

 public static void m(Object x) {  

  System.out.println(x.toString()); 

 107 

 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

 } 

class GraduateStudent extends Student { } 

 

class Student extends Person { 

 @Override 

 public String toString() {  

  return "Student" ; 

 } 

class Person extends Object { 

 @Override 

 public String toString() { 

  return "Person"; 

 } 

Output: 

Student 

Student 

Person 

Java.lang.Object@15db9742 

 

8.3 Kesimpulan 

Salah satu konsep penting dalam pemrograman berorientasi objek adalah polymorphism. 

Dengan polyomrphism objek akan dianggap memiliki banyak bentuk sehingga hal ini akan 

memudahkan programmer dalam membuat referensi pemanggilan objek dari satu method. 

Perluasan dari teknik polymorphism adalah Dynamic Binding. Dynamic Binding 

memungkinkan programmer untuk melakukan polymorphism disepanjang hierarki turunan 

dari suatu objek-objek dari sistem yang dikembangkan. 

 108 

 

8.4 Kuis dan Latihan Soal 

1. Jelaskan apa yang dimaksud dengan polymorphism? 

2. Mengapa programmer membutuhkan polymorphism? 

3. Apakah polymorphism selalu terkait dengan inheritance? 

8.5 Praktikum 

Buat class Kendaraan, Mobil, Truk, SepedaMotor, Bus, MobilBerat. Pehatikan bahwa 

Kendaraan merupakan super-class dari Mobil, SepedaMotor, dan MobilBerat. Kemudian, 

MobilBerat merupakan super-class dari Truk dan Bus. Buat method yang dapat 

mengimplementasikan Dynamic Binding! Member class (property atau method) pada setiap 

Class boleh dibuat sesuka hati. 

 109 

 

BAB 9 ABSTRACT CLASS DAN INTERFACE 

9.1 Abstract Class 

Pada konsep pewarisan, super-class biasanya memiliki struktur yang umum dan sub-class 

lebih spesifik. Seharusnya pada super-class memiliki fitur-fitur umum yang akan diwariskan 

kepada sub-class. Bisa jadi, programmer membutuhkan super-class yang hanya menyajikan 

fitur-fitur umum yang harus dijelaskan lebih spesifik didalam sub-class tanpa harus membuat 

objek dari super-class itu . Suatu class yang hanya menyajikan fitur-fitur umum dan 

tidak dapat dibuat objek disebut dengan class abstract. Kita dapat menyebut class abstract ini 

sebagai class yang akan digunakan sebagai acuan pada desain sub-class yang akan diwarisi 

oleh abstract class ini. Suatu abstract class juga dapat memiliki abstract method. Abstract 

method harus di implementasikan secara konkret didalam sub-class. Misalnya pada Kode 9.1 

mencoba untuk membuat abstract class untuk Hewan dan Kode 9.2 membuat sub-class 

Ayam.  

Kode 9.1 Hewan.java 

10 

11 

12 

13 

14 

15 

16 

public abstract class Hewan 

 public boolean terbang = false; 

  

 public void bisaTerbang(boolean terbang) 

 { 

  this.terbang = terbang; 

 } 

  

 public boolean isTerbang() 

 { 

  return this.terbang; 

 } 

  

 public abstract void bernapas(); 

 

 110 

 

Kode 9.2 Ayam.java 

10 

11 

12 

 

13 

14 

15 

public class Ayam extends Hewan 

 public void bernapas() 

 { 

  System.out.println("aku bernapas"); 

 } 

 

 public static void main(String[] args) 

 { 

  Ayam kutuk = new Ayam(); 

  kutuk.bisaTerbang(true); 

  System.out.println("Apakah bisa terbang: 

"+kutuk.isTerbang()); 

  kutuk.bernapas(); 

 } 

 

Setiap sub-class yang menerapkan abstract class sebagai super-class harus dengan 

menambahkan kata kunci “extends” seperti halnya menerapkan pewarisan biasa. Perhatikan 

bahwa jika didalam abstract class memiliki abstract method, abstract method itu  harus 

dijelaskan secara konkret di dalam sub-class seperti pada method bernapas(). Kita juga 

tidak dapat membuat objek Hewan sebab   merupakan abstract class. 

Hewan 

+terbang: boolean = false  

+bisaTerbang(terbang: boolean): void 

+isTerbang(): boolean 

+bernapas(): void 

 

Ayam 

 

+main(args: String[]): void 

Gambar 9.1 UML class diagram abstract class Hewan 

Abstract class 

dan abstract 

method 

ditandai 

dengan huruf 

miring 

 111 

 

Gambar 9.1 menjelaskan tentang UML class diagram abstract Hewan yang mewariskan 

atribut dan methodnya ke class Ayam. Untuk menandakan jika class Hewan termaksud class 

abstract, maka harus ditulis dengan huruf miring, begitu pula untuk method dan atribut. 

Method bernafas() pada class Ayam tidak perlu ditulis kembali, sebab   default harus 

dijelaskan secara konkret dalam artian wajib dikoding di kelas Ayam. 

9.2 Interface 

Mirip dengan abstract, interface hanya berfokus pada konstruksi operasi umum pada suatu 

object. Kita dapat menganggap interface ini sebagai kerangka dari suatu class. Secara struktu 

interface bukan merupakan class. Sehingga dalam membuat kode program interface tidak lagi 

menggunakan kata “class”. Kode 9.3 merupakan contoh interface MahlukHidup. 

Kode 9.3 MahlukHidup.java 

public interface MahlukHidup 

 public abstract void bernapas(); 

 public boolean isHidup(); 

 

Interface hanya berisi abstract method baik yang menggunakan kata abstract maupun tidak. 

Disini ditandai dengan definisi method yang langsung ditutup dengan tanda titik koma bukan 

kurung kurawal buka dan tutup. Interface dapat diterapkan kepada class biasa maupun 

abstract class. Untuk mengimplementasikan interface dibutuhkan tambahan sintak 

implements seperti Kode 9.4 Hewan.java yang telah dimodifikasi ini. 

Kode 9.4 Hewan.java 

public abstract class Hewan implements MahlukHidup 

 public boolean terbang = false; 

  

 public void bisaTerbang(boolean terbang) 

 { 

  this.terbang = terbang; 

 112 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

 } 

  

 public boolean isTerbang() 

 { 

  return this.terbang; 

 } 

  

 public abstract void bernapas(); 

  

 public boolean isHidup() 

 { 

  return true; 

 } 

 

Semua method yang sudah didefinisikan didalam interface WAJIB di implementasikan 

didalam class yang sudah menerapkan interface itu  (kecuali jika diterapkan pada 

abstract method).  Kode 9.5 merupakan class Ayam yang sudah dimodifikasi dengan 

memanggil method isHidup(). 

Kode 9.5 Ayam.java 

10 

11 

public class Ayam extends Hewan 

 public void bernapas() 

 { 

  System.out.println("aku bernapas"); 

 } 

 

 public static void main(String[] args) 

 { 

  Ayam kutuk = new Ayam(); 

  kutuk.bisaTerbang(true); 

 113 

 

12 

 

13 

14 

 

15 

16 

  System.out.println("Apakah bisa terbang:  

"+kutuk.isTerbang()); 

  kutuk.bernapas(); 

  System.out.println("Apakah benda hidup:  

"+kutuk.isHidup()); 

 } 

 

Pada contoh kode sebelumnya interface diterapkan pada abstract method. Bagaimana jika 

diterapkan pada class biasa. Kode 9.6 merupakan contoh penerapan interface MahlukHidup 

pada class biasa.  

Kode 9.6 Tumbuhan.java 

10 

11 

12 

13 

14 

15 

 

16 

17 

public class Tumbuhan implements MahlukHidup 

 public void bernapas() 

 { 

  System.out.println("aku tidak bernapas"); 

 }  

 public boolean isHidup() 

 { 

  return true; 

 } 

 public static void main(String[] args) 

 { 

  Tumbuhan cemara = new Tumbuhan(); 

  cemara.bernapas(); 

  System.out.println("Apakah benda hidup:  

"+cemara.isHidup()); 

 } 

 

 114 

 

<<interface>> 

MahlukHidup 

 

+bernapas(): void 

+isHidup(): boolean 

 

Hewan 

+terbang:boolean = false 

+bisaTerbang(terbang: boolean): void 

+isTerbang():boolean 

 

Ayam 

 

+main(args: String[]): void 

Gambar 9.2 UML class diagram interface class MahlukHidup 

Gambar 9.2 menjelaskan tentang UML class diagram interface MahlukHidup. Class interface 

dapat diwariskan dengan keyword implements, dalam UML class diagram digambarkan 

dengan garis panah putus-putus. Class interface dituliskan dengan huruf miring dan 

dijelaskan lagi dengan keterangan kata <<interface>>. Secara implisit atribut di class 

interface bersifat public static dan final. Sedangkan untuk method, secara implisit bersifat 

public dan abstrak sehingga ditulis dengan huruf miring. Method bernafas() dan 

isHidup() pada class Hewan dan Tumbuhan tidak perlu ditulis kembali, sebab   method 

itu  bersifat abstract dan wajib dikoding. 

 

 9.3 Implementasi Kombinasi Abstract Class dan Interface 

Dalam mendesain class diagram, terkadang desainer membuat desain yang mengharuskan 

programmer untuk menerapkan abstract class dan interface secara langsung pada class biasa. 

Apakah itu memungkinkan? Tentu saja bisa. Misalnya kita membuat abstract class Dedaunan 

seperti pada Kode 9.7. 

Kode 9.7 Dedaunan.java 

public abstract class Dedaunan 

 public void daunBergerak() 

Tumbuhan 

 

+main(args: String[]): void  

 115 

 

 { 

  System.out.println("daun melambai-lambai"); 

 } 

 

Kita akan memodifikasi Kode 9.6 tidak hanya menerapkan interface MahlukHidup, tetapi 

juga menerapkan abstract class Dedaunan. Kode 9.8 merupakan class Tumbuhan yang telah 

dimodifikasi. UML class diagram dapat dilihat pada GAMBAR 9. 

Kode 9.8 Tumbuhan.java 

10 

11 

12 

13 

14 

15 

16 

17 

 

18 

19 

20 

public class Tumbuhan extends Dedaunan implements MahlukHidup 

 public void bernapas() 

 { 

  System.out.println("aku tidak bernapas"); 

 } 

  

 public boolean isHidup() 

 { 

  return true; 

 } 

 

 public static void main(String[] args) 

 { 

  Tumbuhan cemara = new Tumbuhan(); 

  cemara.bernapas(); 

  System.out.println("Apakah benda hidup:  

"+cemara.isHidup()); 

  cemara.daunBergerak(); 

 } 

 

 116 

 

<<interface>> 

MahlukHidup 

 

+bernapas(): void 

+isHidup(): boolean 

 

Hewan 

+terbang:boolean = false 

+bisaTerbang(terbang: boolean): void 

+isTerbang():boolean 

 

Ayam 

 

+main(args: String[]): void 

Gambar 9.3 UML class diagram kombinasi abstract interface 

9.4 Kesimpulan 

Seorang desainer sistem, dalam mendesain suatu class terkadang membutuhkan bentuk class 

yang abstrak atau kerangka dari sebuah class sebelum diimplementasikan. Hal ini digunakan 

untuk memudahkan programmer dalam menerjemahkan “bahasa bisnis” kedalam kode 

program. Abstract class merupakan class yang hanya menyajikan fitur-fitur umum dan tidak 

dapat dibuat objek. Sedangkan interface merupakan bentuk kerangka suatu class yang juga 

berisi fitur-fitur umum yang berbentuk abstrak. 

9.5 Kuis dan Latihan Soal 

1. Jelaskan apa perbedaan abstrak dan interface? 

2. Yang mana dari gambar berikut yang benar? 

 

3. Dapatkah suatu abstract class mengimplementasikan interface? 

Dedaunan 

 

+daunBergerak(); void 

Tumbuhan 

 

+main(args: String[]): void  

 117 

 

9.6 Praktikum 

Perusahaan “Harpindo Kita” membutuhkan sebuah sistem informasi jual beli mobil. Sistem 

mampu mendaftarkan biodata karyawan dan pembeli. Pembeli dibagi dalam 2 jenis yaitu: 

pembeli individu dan pembeli borongan. Mobil yang dijual ada tiga tipe yaitu: Mobil sedan, 

Mobil minibus, dan mobil bus. Karyawan dapat menambahkan harga setiap mobil yang ada. 

Pembeli hanya dapat membeli satu tipe mobil saja (berarti dalam hal ini berarti dapat 

membeli mobil banyak dengan tipe yang sama). Karyawan dapat melihat data pembeli yang 

sudah membeli mobil. Karyawan mendapatkan keuntungan 10% dari total jumlah harga 

terbayar oleh setiap pembeli dalam setiap waktu. 

PETUNJUK: 

1. Minimal terdapat 7 kelas (terserah boleh subclass, superclass, abstract class, atau 

interface) 

2. Method dan property bebas yang sesuai dengan ilustrasi kasus diatas. 

3. Keterangan setiap property dan method yang ada pada class diagram dijelaskan 

beserta potongan kode programnya. 

4. Boleh dikembangkan. Dan beri keterangan pengembangan dari kasus diatas. 

 118 

 

BAB 10 EXCEPTION, PEMROGRAMAN GENERIK, DAN 

DESIGN PATTERN 

10.1 Exception 

Pada dasarnya ada tiga jenis error didalam pemrograman dengan Java, yaitu: syntax error, 

logic error, dan runtime error. Syntax error merupakan kesalahan yang terjadi saat 

programmer salah menuliskan kode program. Misalnya, saat programmer kurang 

memberikan titik koma di akhir dari statement. Biasanya error ini akan muncul saat progam 

di-compile. Logic error berkaitan dengan kesalahan yang dilakukan programmer saat 

programmer membuat kode sehingga akan menghasilkan output kode yang tidak sesuai 

dengan yang diinginkan. Kesalahan logic error seringkali disebut sebagai bug/kutu. Untuk 

menangani bug dilakukan proses debugging. Proses debugging adalah mencari satu persatu 

baris perbaris kode yang mana yang membuat output yang dihasilkan tidak sesuai.  

Runtime error adalah kesalahan program yang terjadi saat program sudah berjalan dimana 

jika lingkungan pemrograman mendeteksi operasi yang tidak mungkin dapat ditangani. 

Contoh nyata dari error runtime ini adalah misalnya saat kita menjalankan aplikasi berbasis 

java yang membutuhkan koneksi internet, tiba-tiba internet mati dan menyebabkan aplikasi 

tadi berhenti/terminate secara mendadak. Error runtime disebabkan oleh exception. Exception 

adalah objek yang mewakili error atau kondisi yang mencegah eksekusi dari proses yang 

tidak berjalan normal. 

Ada banyak sekali objek atau tipe exception, misalnya: input mismatch exception, aritmethic 

exception, null pointer exception, index of out bound exception, illegal argument exception, 

dll. Berikut adalah contoh kode yang berpotensi menghasilkan input mismatch exception: 

import java.util.Scanner; 

public class TestException 

 public static void main(String[] args) 

 { 

  // Buat objek Scanner 

  Scanner input = new Scanner(System.in); 

  // Kabari user untuk memasukkan angka sisi persegi 

 119 

 

  System.out.print("Masukkan sisi persegi: "); 

  double sisi = input.nextDouble(); 

  System.out.print("Sisi: "+sisi); 

 } 

Perhatikan bahwa output dari program itu  adalah  “Masukkan sisi persegi: ”. Jika user 

memberikan inputan berupa string misalnya “as”. Maka akan muncul error exception 

Exception in thread "main" java.util.InputMismatchException“. Kita sebagai programmer 

terkadang tidak memerhatikan user dalam hal inputan sederhana ini. Tetapi hal ini bisa saja 

terjadi. Maka dari itu perlu penanganan exception.  

10.2 Mekanisme Try-Catch 

Menangani exception pada dasarnya merupakan cara untuk mencegah terjadinya runtime 

errors. Terdapat mekanisme untuk menangani exception yaitu dengan Try-Catch. Try-Catch 

memiliki dua blok yaitu blok kode untuk try dan blok kode untuk catch. Pada blok Try 

programmer akan mencoba menuliskan kode yang mungkin dapat menyebabkan exception. 

Ketika terjadi exception saat aplikasi berjalan (runtime) blok Catch akan menangkap pesan 

error exception yang terjadi dan akan mengeksekusi yang ditulis oleh programmer pada blok 

itu . Misalnya ketika user memberikan inputan string padahal semestinya user 

memberikan input integer. Program tidak akan langsung terminate (berhenti) tetapi akan 

memunculkan pesan kesalahan input. Pesan kesalahan itu  berasal dari blok catch.Kode 

10.1 merupakan contoh implementasi dari permisalan sebelumnya. 

Kode 10.1 AngkaError.java 

import java.util.Scanner; 

public class AngkaError 

 public static void main(String[] args) 

 { 

  // Buat objek Scanner 

  System.out.print("Masukkan sembarang angka: "); 

  Scanner input = new Scanner(System.in); 

  int angka; 

 120 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

   

  try{ 

   angka = input.nextInt(); 

   System.out.print("Angka yang dimasukkan: "+angka); 

  } 

  catch(Exception e) 

  { 

   System.out.print("Inputan salah!"); 

  } 

 } 

Output: 

Masukkan sembarang angka: 12 

Angka yang dimasukkan: 12 

 

Suatu program yang dapat mendeteksi error dapat dibuat dari instance dari tipe exception 

yang sesuai dan lemparkan (throw it). Sebagai contoh, terdapat program meneruskan nilai 

dari suatu method dan argument harus berupa argument non-negative, tetapi malah argument 

negative. Program dapat dibuat dari instance IllegalArgumentException dan kemudian di 

throw seperti berikut: 

IllegalArgumentException ex = new IllegalArgumentException(“Argumen 

salah!”); 

Throw ex; 

atau 

throw new IllegalArgumentException(“Argumen salah!”); 

Block catch dapat lebih dari satu dan terdapat tambahan blok untuk finally. Jika ingin 

beberapa kode dieksekusi terlepas dari apakah exception itu  terjadi atau tertangkap kita 

dapat menggunakan finally. Finally juga dapat digunakan tanpa catch. Dari Kode 10.1 kita 

dapat menambahkan finnaly setelah block catch. 

 

 

 121 

 

finally 

 System.out.print("Terima kasih."); 

10.3 Pemrograman Generik 

Secara sederhana, pemrograman generik dalam hal ini Generic Type/ Tipe Generik 

merupakan class atau interface generik yang memperbolehkan semua jenis tipe data sebagai 

suatu parameter. Sebelumnya sudah di implementasi pada ArrayList dan Vector dengan 

simbol “<....>”. Berikut adalah contoh sederhana dari perbandian class biasa dengan class 

generik: 

Tabel 10.1 Perbandingan class biasa dengan generik 

Biasa Generik 

public class Box { 

    private int object; 

    public void set(int object) {  

 this.object = object;  

 } 

    public int get() {  

  return object;  

 } 

public class Box<T> { 

    private T t; 

    public void set(T t) {  

  this.t = t;  

 } 

    public T get() {  

  return t;  

 } 

 

Pada versi non-generic clas Box jika seandainya instance dari Box adalah Kotak dan 

Kotak.set(“50”), maka akan menghasilkan error. Error disebabkan hanya boleh diset oleh 

nilai integer saja. Pada versi generic dapat di set oleh berbagai tipe data, baik primitive 

maupun tipe data bentukan, dan bahkan array/list. Format class generic: 

class name<T1, T2, ..., Tn> { /* ... */ } 

Untuk instance dari class box versi generik, berikut caranya: 

Box<Integer> integerBox = new Box<Integer>(); 

Meskipun tipe data atau objek yang digenerik-kan dapat diberi nama dengan bebas, beberapa 

programmer memberikan standar sebagai berikut: 

 E - Elemen (sering digunakan di Java Collections Framework) 

 K - Kunci 

 122 

 

 N – Angka (number) 

 T - Tipe 

 V – Nilai (value) 

 S,U,V, dll 

Timbul pertanyaan, dalam satu class terkadang programmer menginginkan tidak hanya satu 

variabel atau properti yang akan di-generik-kan. Kode 10.2 memberikan contoh satu class 

memiliki dua tipe generik. 

Kode 10.2 OrderedPair.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

 

22 

23 

public class OrderedPair<K, V> { 

    private K key; 

    private String value; 

    public OrderedPair(K key, V value) { 

  this.key = key; 

  this.value = (String)value; 

    } 

    public K getKey() {  

  return key;  

 } 

 public String getValue() 

 { 

  if(this.key == "aaa") 

   return this.value; 

  else 

   return "salah"; 

 } 

  

 public static void main(String[] args) 

 { 

  OrderedPair<String, String>  p2 = new OrderedPair<String, 

String>("aaa", "2"); 

  System.out.println(p2.getValue()); 

 

 123 

 

24 

25 

 } 

Output:  

 

Contoh lain dari generik tidak hanya pada class tetapi juga dapat diterapkan pada method 

secara langsung. Berikut adalah contoh method generic untuk menampilkan elemen array: 

public static < E > void printArray( E[] inputArray ) { 

      // Display array elements 

      for(E element : inputArray) { 

         System.out.printf(element+” ”); 

      } 

      System.out.println(); 

10.4 Design Pattern 

Design pattern merupakan istilah untuk merepresentasikan paktik penggunaan terbaik yang 

digunakan oleh programmer/pengembang software yang berpengalaman dalam pemrograman 

berorientasi objek. Menyediakan solusi untuk perproblem an umum dari 

programmer/pengembang software selama mengembangkan software. Solusi ini diperoleh 

dari trial & error yang dilakukan oleh programmer/pengembang perangkat lunak yang 

berpengalaman.  

10.5 Singleton Pattern 

Merupakan Design Pattern  paling sederhana yang memungkinkan untuk dapat diprogram 

dengan Java. Pola ini melibatkan satu Class tunggal yang bertanggung jawab untuk membuat 

sebuah objek tunggal yang akan tercipta. Class ini menyediakan cara untuk mengakses 

objeknya yang secara langsung dapat diakses tanpa harus melakukan instance objek dari 

Class. Class diagram untuk class singleton ini seperti pada Gambar 10.1. 

 124 

 

 

 

 

 

 

 

 

 

 

Gambar 10.1 Class Diagram Singleton 

Kode 10.3 merupakan contoh implementasi singleton patten untuk class SingleObject. 

Kode 10.3 SingleObject.java 

10 

11 

12 

13 

14 

15 

16 

public class SingleObject { 

  

 //buat static instance objek ini 

 private static SingleObject instance = new SingleObject(); 

 

 //buat konstruktor secara private sehingga  

 //tidak akan bisa di instance dengan cara biasa 

 private SingleObject(){} 

 

 //dapatkan instance 

 public static SingleObject getInstance(){ 

   return instance; 

 } 

  

 //tampilkan pesan 

 public void showMessage(){ 

 125 

 

17 

18 

19 

20 

21 

22 

23 

24 

   System.out.println("Hello World!"); 

 } 

 

 public static void main(String[] args) { 

  SingleObject object = SingleObject.getInstance(); 

  object.showMessage(); 

 } 

 

Pada main method tidak ada keyword untuk melakukan instance atau “new”. Objek langsung 

dibuat dan langsung dapat digunakan ketika memanggil method getInstance(). Dua baris 

kode didalam main dapat digantikan dengan kode dibawah ini: 

SingleObject.getInstance().showMessage(); 

Eksekusi dari kode itu  akan menghasilkan output yang sama dengan dua baris kode 

sebelumnya. 

10.6 Model-View-Controller Pattern 

Model-View-Controller atau MVC adalah sebuah metode untuk membuat sebuah aplikasi 

dengan memisahkan data (Model) dari tampilan (View) dan cara bagaimana memprosesnya 

(Controller). Dalam implementasinya kebanyakan framework dalam aplikasi website adalah 

berbasis arsitektur MVC. MVC memisahkan pengembangan aplikasi berdasarkan komponen 

utama yang membangun sebuah aplikasi seperti manipulasi data, antarmuka pengguna, dan 

bagian yang menjadi kontrol dalam sebuah aplikasi. 

 126 

 

 

Gambar 10.2 Model View Controller (MVC) 

Pola MVC memiliki layer yang disebut dengan Model yang merepresentasikan data yang 

digunakan oleh aplikasi sebagaimana proses bisnis yang diasosiasikan terhadapnya. Dengan 

memilahnya sebagai bagian terpisah, seperti penampungan data, persistence, serta proses 

manipulasi, terpisah dari bagian lain aplikasi. Terdapat beberapa kelebihan dalam pendekatan 

ini. Pertama, membuat detail dari data dan operasinya dapat ditempatkan pada area yang 

ditentukan (Model) dibanding tersebar dalam keseluruhan lingkup aplikasi. Hal ini 

memberikan keuntungan dalam proses pemeliharaan aplikasi. Kedua, dengan pemisahan total 

antara data dengan implementasi interface, komponen model dapat digunakan kembali oleh 

aplikasi lain yang memiliki kegunaan yang hampir sama. 

Layer view mengandung keseluruhan detail dari implementasi user interface. Disini, 

komponen grafis menyediakan representasi proses internal aplikasi dan menuntun alur 

interaksi user terhadap aplikasi. Tidak ada layer lain yang berinteraksi dengan pengguna, 

hanya View. Penggunaan layer View memiliki beberapa kelebihan: memudahkan 

pengabungan divisi desain dalam development team. Divisi desain dapat berkonsentrasi pada 

style, look and feel, dan sebagainya, dalam aplikasi tanpa harus memperhatikan lebih pada 

detail yang lain. Dengan memiliki layer View yang terpisah memungkinkan ketersediaan 

multiple interface dalam aplikasi. Jika inti dari aplikasi terletak pada bagian lain (dalam 

 127 

 

Model), multiple interfaces dapat dibuat (Swing, Web, Console), secara keseluruhan 

memiliki tampilan yang berbeda namun mengeksekusi komponen Model sesuai 

fungsionalitas yang diharapkan. 

Terakhir, arsitektur MVC memiliki layer Controller. Layer ini menyediakan detail alur 

program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang 

dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan 

data yang dimasukkan oleh user. Kelebihan dalam penggunaan layer Controller secara 

terpisah adalah dengan menggunakan komponen terpisah untuk menampung detail dari 

transisi layer, komponen view dapat didesain tanpa harus memperhatikan bagian lain secara 

berlebih. Hal ini memudahkan team pengembang multiple interface bekerja secara terpisah 

dari yang lain secara simultan. Interaksi antar komponen View terabstraksi dalam Controller. 

Data Access Object (DAO) merupakan sebuah object yang menyediakan sebuah abstract 

interface terhadap beberapa database atau mekanisme persistence, menyediakan beberapa 

operasi tertentu tanpa mengekspos detail database. Penerapan konsep ini sering disebut 

dengan separation of concern dimana setiap kode dipisahkan berdasarkan fungsinya sehingga 

kode diatasnya hanya perlu mengetahui secara abstrak cara mengakses data tanpa perlu 

mengetahui bagai