/**
 * @(#)SimilarNo3.java
 *
 *
 * @author Jasiph A. Polela
 * @version 1.00 2008/5/1
 */


class Binatang {
	// buat satu instance variabel nama;
	// private membuat variabel hanya bisa diakses
	// oleh member class itu sendiri
	private String nama;
	
	// nama konstruktor selalu sama dengan nama class
	// konstruktor akan secara otomatis dilaksanakan
	// ketika object class dibuat	
	public Binatang() {
		// inisialisasi member variabel ke harga default
		aturData("");
	}
	
	public void aturData(String nm) {
		nama = nm;	
	}
	
	// cetak nama binatang	
	public void Print() {
		System.out.println("Nama Binatang: " + nama);
	}
}

// turunkan class Binatang menjadi 
// class BinatangAir
// semua metode public dari binatang
// akan secara otomatis dimiliki oleh
// kelas binatangair 
class BinatangAir extends Binatang {
	private int kebutuhanOksigen;
	private String warna;
	private int ukuran;
	
	// konstruktor
	// cara lain membentuk konstruktor
	// dengan konstuktor ini maka
	// Object bisa dibuat tanpa harus menyertakan data
	// contoh:
	// BinatangAir binAir = new BinatangAir();
	public BinatangAir() {
		// karena dipanggil tanpa data
		// maka seluruh instance variabel di set ke harga default
		aturData("",0,"",0);
	}
	
	// method untuk entry data
	// method ini memiliki nama yang sama dengan method
	// pada kelas induk (Binatang), namun jumlah parameter berbeda
	// ini yang di sebut polymorphism
	// method yang akan dilaksanakan adalah method yang sesuai
	// parameternya
	public void aturData(String nm, int o2, String wrn, int size) {
		// memanggil method dari class induk (Binatang)
		// untuk memberi nama bintang
		aturData(nm);
		// atur data untuk local variabel
		kebutuhanOksigen = o2;
		warna = wrn;
		ukuran = size;
	}
	
	// hitung kebutuhan oksigen
	// kebutuhanOksigen * ukuran
	public int hitungKebutuhanO2() {
		return kebutuhanOksigen * ukuran;
	}
		
	// metode untuk cetak data Binatang air
	// metode ini sama persis dengan metode yang terdapat di class induk
	// baik nama method maupun parameter
	// ini yang di sebut overide method.
	// jika yang dibuat kelas BinatangAir maka method yang tedapat 
	// di kelas induk akan di gantikan oleh metode dibawah.
	public void Print() {
		// karena metode Print sudah di overide
		// maka untk mencetak nama bintang harus dipanggil dengan
		// memakai super. Super menyatakan class induk 
		// dalam hal ini menunjuk kepada class Binatang
		super.Print();
		System.out.println("Warna: " + warna);
		System.out.println("Ukuran: " + ukuran);
		System.out.println("Kebutuhan oksigen: " + hitungKebutuhanO2());
	}
}

class BinatangAirDalam extends BinatangAir {
	private int kebutuhanOksigenTambahan;
	
	// construktor
	public BinatangAirDalam() {
		aturData("",0,"",0,0);
	}
	
	public void aturData(String nm, int o2, String wrn, int size, int o2extra) {
		// memanggil method dari class induk (Binatang)
		// untuk memberi nama bintang
		aturData(nm,o2,wrn,size);
		kebutuhanOksigenTambahan = o2extra;
	}
	
	// hitung kebutuhan oksigen
	// method induk dipanggil untuk menghitung kebutuhan o2 normal
	// sehingga kebutuhan o2 untuk BinatangAirDalam menjadi 
	// super.hitungKebutuhan02 + kebutuhan oksigen tambahan
	public int hitungKebutuhanO2() {
		return super.hitungKebutuhanO2() + kebutuhanOksigenTambahan;
	}
	
	// method Print tidak perlu di overide karena sudah sesuai
	// sehingga cukup memakai method Print kelas induk;
}



public class SimilarNo3 {        
    public static void main(String[] args) {
		BinatangAirDalam b = new BinatangAirDalam();
		b.aturData("Ikan Hiu",30,"Hitam abu-abu",50,20);
		b.Print();
    }
}		
		/* 
		 * Hasil program diatas menghasilkan tampilan sbb;
		 *
		 * Nama Binatang: Ikan Hiu
		 * Warna: Hitam abu-abu
		 * Ukuran: 50
		 * Kebutuhan oksigen: 1520
		 *
		 * Dari hasil tersebut bisa dilihat bahwa 
		 * nama binatang "Ikan Hiu" telah berhasil dikirim ke kelas Binatang.
		 * Sementara warna, ukuran, dan kebutuhan oksigen
		 * telah dikirim ke kelas BinatangAir dan yang terakhir oksigen tambahan
		 * ke kelas BinatangAirDalam
		 *
		 * Analogi binatang diatas telah disesuaikan dengan analogi 
		 * Orang, Karyawan, KaryawandngLembur
		 *
		 * perhitungan gaji dianalogikan perhitungan kebutuhan oksigen
		 * Yang tidak dimasukan dalam analogi binatang adalah statusMenikah.
		 * hal itu gampang saja anda lakukan dengan statement IF.
		 *
		 * Semoga membantu.
		 * 
		 */
