Casting Objek Pada Java : Upcasting, Downcasting dan Konversi Tipe Primitif

Seperti halnya casting pada tipe numerik, maka objek dari suatu class dapat juga dicasting pada objek dari class lainnya. Casting objek pada Java artinya mengambil objek dari suatu tipe dan menetapkannya sebagai variabel referensi  dari tipe lainnya. Untuk bisa melakukannya, maka ada persyaratan yang harus dipenuhi yaitu class dari objek yang akan dicasting harus terkait dengan inheritance.

Dengan kata lain, anda dapat melakukan casting objek ini hanya pada suatu instance dari superclass ataupun subclass, dan bukan dari class lain secara acak.

Casting ini di bagi menjadi 2 bagian yaitu upcasting dan downcasting.


casting_objek_Java_upcasting_downcasting


Sebelum memasuki bahasan yang lebih detail, misalkan kita memiliki hirarki class sebagai berikut:

Binatang > Kambing, Sapi

Binatang adalah class abstract :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.upcastingDowncasting;

public abstract class Binatang {
 
 
 public void makan(){
  System.out.println("Makan");
 }
 
 public void bergerak(){
  System.out.println("Bergerak");
 }
 
 public void tidur(){
  System.out.println("Tidur");
 }
 
}

Class Kambing extends Binatang:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.bahasaJava.upcastingDowncasting;

public class Kambing extends Binatang {
 
 public void kambingBersuara(){
  System.out.println("Mbeeek!");
 }
 
 public void makan(){
  System.out.println("Kambing makan");
 }

}

Class Sapi extends Binatang:

1
2
3
4
5
6
7
8
9
package com.bahasaJava.upcastingDowncasting;

public class Sapi extends Binatang {
 
 public void sapiBersuara(){
  System.out.println("Mooooo!");
 }

}

Upcasting

Upcasting adalah casting dari subtype ke supertype, menuju ke atas pada hirarki inheritance. Class Test berikut ini untuk mendemonstrasikan upcasting dari hirarki inheritance di atas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package com.bahasaJava.upcastingDowncasting;

public class Test {

 public static void main (String args []){
  
  Kambing kambing = new Kambing();
  Binatang binatang = (Binatang) kambing;
  binatang.makan();
  
 }
}

Di sini kita melakukan cast dari tipe Kambing ke tipe Binatang. Dikarenakan class Kambing merupakan subclass dari Binatang, maka casting ini disebut dengan upcasting.

Tipe objek aktual tidak berubah karena casting. Maka objek Kambing tetaplah objek Kambing, hanya referensinya saja yang berubah.

Upcasting ini selalu 'aman', karena anda memperlakukan suatu tipe menjadi tipe yang lebih umum. Pada contoh di atas, Kambing memiliki semua tingkah laku yang dimiliki oleh Binatang.

Mengapa upcasting dilakukan?

Pada umumnya upcasting ini tidak perlu dilakukan.

Bagaimanapun, anda memerlukan upcasting ketika anda ingin menulis kode yang hanya berhubungan dengan superclass.

Perhatikan contoh berikut:

Class abstract Binatang:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.upcastingDowncasting;

public abstract class Binatang {
 
 
 public void makan(){
  System.out.println("Makan");
 }
 
 public void bergerak(){
  System.out.println("Bergerak");
 }
 
 public void tidur(){
  System.out.println("Tidur");
 }
 
}


Class Kambing extends Binatang:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.upcastingDowncasting;

public class Kambing extends Binatang {
 
 public void kambingBersuara(){
  System.out.println("Mbeeek!");
 }
 
 public void makan(){
  System.out.println("Kambing makan");
 }
 
 public void bergerak(){
  System.out.println("Kambing bergerak");

 }

}

Class Sapi extends Binatang:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.upcastingDowncasting;

public class Sapi extends Binatang {
 
 public void sapiBersuara(){
  System.out.println("Mooooo!");
 }
 
 public void makan(){
  System.out.println("Sapi makan");
 }
 
 public void bergerak(){
  System.out.println("Sapi bergerak");

 }

}

Class Peternak:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package com.bahasaJava.upcastingDowncasting;

public class Peternak {
 
 public void memberiMakan(Binatang a){
  a.bergerak();
  a.makan();
 }

}


Class Test untuk mendemonstrasikan:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package com.bahasaJava.upcastingDowncasting;

public class Test {

 public static void main (String args []){
  
  Kambing kambing = new Kambing();
  Sapi sapi = new Sapi();
  Peternak peternak = new Peternak();
  
  peternak.memberiMakan(kambing);
  peternak.memberiMakan(sapi);
  
 }
}

Output:
Kambing bergerak
Kambing makan
Sapi bergerak
Sapi makan

Method memberiMakan() dari class Peternak dapat menerima objek apapun dari tipe Binatang. Jadi tipe Kambing dan Sapi akan di-upcast ke tipe Binatang, ketika objek tersebut di-pass-kan ke method memberiMakan().

Downcasting

Downcasting merupakan casting ke subtype, menuju ke arah bawah dari hirarki inheritance. Downcasting ini harus dilakukan secara eksplisit.

Perhatikan contoh berikut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.bahasaJava.upcastingDowncasting;

public class Test {

 public static void main (String args []){
  
  Binatang binatang1 = new Kambing();
  Kambing kambing = (Kambing) binatang1;
  kambing.bergerak();
  kambing.makan();
  
  Binatang binatang2 = new Sapi();
  Sapi sapi = (Sapi) binatang2;
  sapi.bergerak();
  sapi.makan();
  
 }
}


Ouput:
Kambing bergerak
Kambing makan
Sapi bergerak
Sapi makan

Dari kode di atas kita melakukan cast dari tipe Binatang ke tipe Kambing dan tipe Sapi. Karena Kambing dan Sapi merupakan subclass dari class Binatang, maka ini disebut dengan downcasting.

Tidak seperti upcasting, maka downcasting bisa saja gagal dilakukan jika tipe objek aktual bukanlah merupakan tipe objek target.

Contoh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package com.bahasaJava.upcastingDowncasting;

public class Test {

 public static void main (String args []){
  
  Binatang binatang1 = new Kambing();
  Sapi sapi = (Sapi) binatang1;
  
 }
}


Kode diatas akan memberikan ClassCastExecption karena tipe aktual objek adalah tipe Kambing, dan Kambing bukanlah Sapi, jadi kita tidak dapat meng-cast-nya ke tipe Sapi.

Contoh ClassCastException:
Exception in thread "main" java.lang.ClassCastException: com.bahasaJava.upcastingDowncasting.Kambing cannot be cast to com.bahasaJava.upcastingDowncasting.Sapi
    at com.bahasaJava.upcastingDowncasting.Test.main(Test.java:8)

Mengapa downcasting dilakukan?

Downcasting ini lebih sering dilakukan daripada upcasting. Anda dapat menggunakan downcasting untuk mengakses behaviour spesifik dari suatu subtype.

Perhatikan contoh berikut ini, pada Class Peternak


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package com.bahasaJava.upcastingDowncasting;

public class Peternak {
 
 public void memberiMakan(Binatang a){
  a.bergerak();
  a.makan();
 
 if (a instanceof Kambing){
  Kambing kambing = (Kambing) a;
  kambing.makan();
  }
 }
}


Di sini, pada method memberiMakan(), kita dapat memeriksa apakah ada objek Kambing yang di-pass-kan pada method tersebut dengan menggunakan operator instanceof di line 9, yang akan mengecek tipe tertentu, kemudian dilakukan downcasting objek tersebut pada tipe Kambing dan memanggil method spesifiknya yaitu makan().

Apakah Tipe Primitif Dapat Dikonversi Menjadi Objek Dan Juga Sebaliknya?

Mungkinkah tipe primitif dapat dikonversi menjadi tipe objek?

Jawabannya adalah  ini tidak dapat dilakukan. Tipe primitif dan objek adalah dua hal yang sangat berbeda dalam Java, sehingga anda juga tidak bisa melakukan casting di antara keduanya.

Walapun demikian, package java.lang memiliki beberapa class istimewa yang berkorespondensi dengan tipe data primitif tersebut. Seperti class Integer untuk int, class Floats untuk float, class Boolean untuk boolean dan sebagainya.

Hal yang perlu diperhatikan adalah nama class menggunakan awalan huruf besar, sedangkan tipe primitif menggunakan awalan huruf kecil. Java memperlakukan kedua hal ini dengan sangat berbeda, jadi jangan dipusingkan oleh keduanya. Karena bisa saja method dan variabel yang sudah anda tetapkan tidak berjalan sesuai dengan keinginan anda.

Dengan menggunakan method yang sudah terdapat pada class-class tersebut, maka anda dapat membuat objek yang equivalen dengan semua tipe-tipe primitif dengan menggunakan keyword new.

Contoh berikut ini adalah baris kode untuk membuat instance dari class Integer dengan nilai 10 :

Integer myInteger = new Integer(10);

Dari kode tersebut anda telah membuat objek aktual dari class Integer, maka anda dapat memperlakukan nilai tersebut sebagai objek.

Kemudian jika misalnya anda ingin mendapatkan nilai primitif tersebut, anda dapat menggunakan method yang terdapat pada class Integer yaitu intValue(), yang akan mengembalikan nilai primitif int dari suatu objek Integer.

Perhatikan contoh di bawah ini:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.bahasaJava;

public class Test {
 
 public static void main(String args []){
  
  Integer myInteger = new Integer(10);
  int x = myInteger.intValue();
  System.out.println("Nilai int x adalah " + x);
  
  Float myFloat = new Float(12.73);
  float y = myFloat.floatValue();
  System.out.println("Nilai float y adalah " + y);
  
  Boolean myBoolean = new Boolean(x > y);
  boolean z = myBoolean;
  System.out.println("Nilai boolean z adalah " + z);


 }

}

Output:
Nilai int x adalah 10
Nilai float y adalah 12.73
Nilai boolean z adalah false

Untuk lebih jelasnya anda dapat melihat dokumentasi Java API tentang class-class istimewa ini serta mengenai method-method yang spesifik untuk mengkonversi tipe-tipe primitif ke objek dan sebaliknya.
Casting Objek Pada Java : Upcasting, Downcasting dan Konversi Tipe Primitif Casting Objek Pada Java : Upcasting, Downcasting dan Konversi Tipe Primitif Reviewed by Bahasa Java on 19.19.00 Rating: 5

Tidak ada komentar:

Diberdayakan oleh Blogger.