Belajar Pemrograman Java Dari Dasar

Memahami Casting Pada Objek Dan Penggunaan Operator instanceof

Hallo Gan, kali ini kita akan mendiskusikan mengenai casting pada objek dan penggunaan instanceof. Bagi yang sedang belajar pemrograman Java mungkin sering dipusingkan dengan istilah ini, namun sebenarnya tidak serumit itu.

Baca juga:

Numerik casting
Casting char dengan tipe numerik

Apa Itu Casting Objek Pada Java?

Casting objek artinya adalah satu tipe referensi objek dapat menjadi tipe casting pada referensi objek lainnya.

Casting objek ini terdiri dari:

  • Upcasting
  • Downcasting
casting objek dan operator instanceof

Upcasting objek


Upcasting objek adalah casting dari subtype ke supertype atau dari suatu objek subclass ke superclass. Atau bisa dikatakan menuju ke arah atas dari rantai inheritance.

Untuk memahami dengan mudah, perhatikan contoh berikut ini:

public abstract class Handphone {
 
 void panggilanMasuk(){
  System.out.println("Berdering!");
 }
 
 void start(){
  System.out.println("Layar aktif!");
 }

}


public class Samsung extends Handphone {
 
 
 void panggilanMasuk(){
  System.out.println("Hp samsung Berdering!");
 }
 
 void start(){
  System.out.println("Layar Hp samsung aktif!");
 }

}


public class TestUpcasting {
 
 public static void main(String[] args) {
                
  //membuat objek Samsung
  Samsung samsung = new Samsung();
          
  //menetapkan objek Samsung pada variabel referensi Handphone
  Handphone hp = (Handphone) samsung;
                
  //memanggil method panggilanMasuk() dari class Samsung
  hp.panggilanMasuk();
                
  //memanggil method start() dari class Samsung
  hp.start();
  
  /*
  Atau bisa juga di tulis lebih singkat dengan:
  
  Handphone hp = new Samsung();
  hp.panggilanMasuk();
  hp.start();
  */
  
 }
 
}



Apa yang terjadi pada kode dia atas adalah anda melakukan casting tipe Samsung ke tipe Handphone, naik ke atas rantai inheritance. Ini di kenal dengan upcasting.

Kalau begitu mengapa method dari class Samsung yang dipanggil?

Jawabannya adalah casting objek tidak mengubah objek aktual dari suatu class. Oleh karena itu, "samsung" tetaplah objek dari class Samsung, hanya variabel referensinya saja yang berubah.

Dikarenakan upcasting itu selalu mengarah dari class yang lebih spesifik menuju ke class yang lebih umum, maka selalu aman dilakukan.

Jadi hal yang perlu anda lakukan untuk upcasting ini adalah menetapkan objek pada variabel referensi dari superclass.

Mengapa upcasting dilakukan?
Upcasting dilakukan bila ingin menulis kode yang berhubungan dengan supertype, seperti contoh di bawah ini:

public abstract class Handphone {
 
 void panggilanMasuk(){
  System.out.println("Berdering!");
 }
 
 void start(){
  System.out.println("Layar aktif!");
 }

}

public class Samsung extends Handphone {
 
 
 void panggilanMasuk(){
  System.out.println("Hp samsung Berdering!");
 }
 
 void start(){
  System.out.println("Layar Hp samsung aktif!");
 }

}


public class Apple extends Handphone {
 
 void panggilanMasuk(){
  System.out.println("Hp Apple Berdering!");
 }
 
 void start(){
  System.out.println("Layar Hp Apple aktif!");
 }

}


public class User {
 
  public void pakaiHp(Handphone hp){
      hp.start();
      hp.panggilanMasuk();
  }

}


public class TestUpcasting {
 
 public static void main(String[] args) {
  
  Samsung samsung = new Samsung();
  Apple apple = new Apple();
  
  User user = new User();
  
  user.pakaiHp(samsung);
  user.pakaiHp(apple);
 }

}

Output:
Layar Hp samsung aktif!
Hp samsung Berdering!
Layar Hp Apple aktif!
Hp Apple Berdering!

Method pakaiHp() dari class user dapat menerima objek apapun yang merupakan subtype dari Handphone. Karena samsung merupakan subtype dari Handphone, maka objek tersebut di upcasting ke type Handphone dan bisa dipassed-kan ke dalam parameter dari method pakaiHp().

Downcasting

Kebalikan dari upcasting, downcasting merupakan casting ke subtype, ke arah bawah dari rantai inheritance.

Perhatikan kode di bawah ini:

public abstract class Handphone {
 
 void panggilanMasuk(){
  System.out.println("Berdering!");
 }
 
 void start(){
  System.out.println("Layar aktif!");
 }

}


public class Samsung extends Handphone {
 
 
 void panggilanMasuk(){
  System.out.println("Hp samsung Berdering!");
 }
 
 void start(){
  System.out.println("Layar Hp samsung aktif!");
 }

}


public class Apple extends Handphone {
 
 void panggilanMasuk(){
  System.out.println("Hp Apple Berdering!");
 }
 
 void start(){
  System.out.println("Layar Hp Apple aktif!");
 }

}


public class TestDowncasting {
 
 public static void main(String[] args) {
  
  
  Handphone hp = new Samsung();
  
  //Downcasting
  Samsung samsung = (Samsung) hp;
  
  samsung.panggilanMasuk();
  samsung.start();
 }
 
}

Di sini anda melakukan casting dari tipe Handphone ke tipe Samsung. Namun, downcasting bisa salah jika objek aktual bukanlah merupakan objek target.

Misal dari kode di atas:

public class TestDowncasting {
 
 public static void main(String[] args) {
  
  
  Handphone hp = new Samsung();
  
  //Downcasting yang salah
  Apple apple = (Apple) hp;
  
 }
 
}

Maka akan muncul ClassCastException, misalkan seperti berikut ini:

Exception in thread "main" java.lang.ClassCastException: Samsung cannot be cast to Apple
at TestDowncasting.main(TestDowncasting.java:9)

Kenapa harus melakukan downcasting?
Downcasting lebih sering di lakukan di bandingkan dengan upcasting. Downcasting bertujuan untuk mengakses perilaku dari suatu objek yang spesifik.

Untuk memastikan downcasting di lakukan pada objek aktual yang tepat, maka bisa di uji dengan operator instanceof.

Menggunakan Operator instanceof


Operator ini berfungsi untuk menguji apakah suatu objek merupakan instance tipe spesifik dari class, subclass atau interface. Dikenal juga sebagai operator perbandingan karena bekerja dengan cara membandingkan instance dengan tipe dan akan mengembalikan nilai true atau false.

Jika anda mengaplikasikan instanceof pada variabel dengan nilai null, maka akan mengembalikan nilai false.

Untuk lebih jelasnya perhatikan kode di bawah ini:

Contoh 1

public class Kendaraan {
 
 public static void main(String[] args) {
  
  Kendaraan mobil = new Kendaraan();
  System.out.println("Apakah mobil adalah instance dari Kendaraan?");
  System.out.println(mobil instanceof Kendaraan);
 }

}


Output:
Apakah mobil adalah instance dari Kendaraan?
true



Contoh 2

Bila motor IS A  kendaraan (ingat konsep IS A pada inheritance), maka tipe objek Motor juga merupakan instance dari Kendaraan. Dengan kata lain, tipe objek dari subclass juga merupakan tipe dari superclass. Di bawah ini objek motor dapat direferensikan oleh class Motor ataupun class Kendaraan.

public class Kendaraan {

}


public class Motor extends Kendaraan {
 
 public static void main(String[] args) {
  
  Motor motor = new Motor();
  System.out.println("Apakah motor adalah tipe Kendaraan?");
  System.out.println(motor instanceof Kendaraan);
  
 }

}

Output:
Apakah motor adalah instance tipe Kendaraan?
true

Contoh 3

Berikut ini adalah contoh bila menggunakan instanceof pada variabel yang memiliki nilai null, maka akan mengembalikan nilai false.

public class Motor {
 
 public static void main(String[] args) {
  
  Motor motor = null;
  System.out.println("Apakah motor adalah instance dari Motor?");
  System.out.println(motor instanceof Motor);
  
 }

}

Output:
Apakah motor adalah instance dari Motor?
false

Contoh 4


public class Lingkaran{
 
 private double radius = 7.88;
 
 double hitungLuasLingkaran (){
  double luas = 3.14 * (getRadius() * getRadius());
  return luas;
 }

 public double getRadius() {
  return radius;
 }

 
}


public class PersegiPanjang {
 
 private double panjang = 5.48;
 private double lebar = 3.75;
 
 double hitungLuasPersegi(){
  double luasPersegiPanjang = getPanjang() * getLebar();
  return luasPersegiPanjang;
 }

 public double getPanjang() {
  return panjang;
 }


 public double getLebar() {
  return lebar;
 }
 
}


public class Casting_dan_instanceof {
 
 public static void main(String[] args) {
  //upcasting secara implisit
  Object obj1 = new Lingkaran();
  Object obj2 = new PersegiPanjang();
  
  tampilkanObjek(obj1);
  tampilkanObjek(obj2);
 }
 
 static void tampilkanObjek(Object obj){
  
  //jika obj adalah instance dari Lingkaran
  if (obj instanceof Lingkaran){
   double x,y;
   //downcasting secara eksplisit
   x = ((Lingkaran)obj).getRadius();
   y = ((Lingkaran)obj).hitungLuasLingkaran();
   
   System.out.println("Panjang jari-jari lingkaran adalah " + x );
   
   System.out.printf("Luas lingkaran adalah %5.2f", y);
   
   System.out.println();
  }
  
  //jika obj adalah instance dari PersegiPanjang
  else if (obj instanceof PersegiPanjang){
   
   double x,y,z;
   //downcasting secara eksplisit
   x = ((PersegiPanjang)obj).getPanjang();
   y = ((PersegiPanjang)obj).getLebar();
   z = ((PersegiPanjang)obj).hitungLuasPersegi();
   
   System.out.println("Panjang persegi panjang adalah " + x);
   
   System.out.println("Lebar persegi panjang adalah " + y);
   
   System.out.printf("Luas persegi panjang adalah %5.2f", z );
  }
 }

}


Output:
Panjang jari-jari lingkaran adalah 7.88
Luas lingkaran adalah 194.98
Panjang persegi panjang adalah 5.48
Lebar persegi panjang adalah 3.75
Luas persegi panjang adalah 20.55

Casting hanya dapat di lakukan jika suatu objek merupakan instance dari class target. Jadi operator instanceof akan memastikan apakah suatu objek merupakan instance dari class yang ditargetkan sebelum casting dilakukan.

Eksplisit casting pada PersegiPanjang dan Lingkaran perlu dilakukan karena method-method seperti getPanjang(), getLebar(), hitungLuasPersegi(), getRadius(), dan hitungLuasLingkaran() tidak dimiliki oleh class Object.

Share on Facebook
Share on Twitter
Share on Google+

Artikel Menarik Lainnya :