Senin, 10 November 2025

Pertemuan 13 - Abstract Class

 Nama        : Safa Mashita

 NRP          : 5025241022

Pertemuan 13 - Abstract Class

1. Tuliskan implementasi dari program kecil Abstract Class Makhluk hidup yang diwariskan kepada manusia, hewan, dan tumbuhan!

Jawab

Output Program


Penjelasan


1. Class MakhlukHidup

public abstract class MakhlukHidup {
    protected String nama;

    public MakhlukHidup(String nama) {
        this.nama = nama;
    }

    public abstract void bernapas();
    public abstract void tumbuh();
}

Kegunaan:

Menjadi kelas dasar (abstract class) yang mendefinisikan perilaku umum semua makhluk hidup seperti bernapas dan tumbuh.

Atribut:

  • nama : menyimpan nama dari makhluk hidup (misalnya “Rafi”, “Serigala”, atau “Melati”).

Method:

  • MakhlukHidup(String nama) : konstruktor untuk memberi nama pada objek ketika dibuat.

  • bernapas() : method abstrak yang wajib diimplementasikan oleh semua subclass.

  • tumbuh() : method abstrak yang juga wajib diimplementasikan oleh subclass.

Hubungan:

Menjadi superclass (kelas induk) bagi:

  • Manusia

  • Hewan

  • Tumbuhan
    Semua kelas turunan harus mengimplementasikan method bernapas() dan tumbuh() sesuai perilaku masing-masing.


2. Class Manusia

public class Manusia extends MakhlukHidup {

    public Manusia(String nama) {
        super(nama);
    }

    @Override
    public void bernapas() {
        System.out.println(nama + " menarik napas panjang untuk menenangkan diri.");
    }

    @Override
    public void tumbuh() {
        System.out.println(nama + " tumbuh menjadi pribadi yang lebih bijak dan dewasa.");
    }

    public void berpikir() {
        System.out.println(nama + " merenung dan berkata: Hidup adalah perjalanan untuk belajar.");
    }
}

Kegunaan:

Mewakili makhluk hidup jenis manusia yang memiliki kemampuan bernapas, tumbuh, dan berpikir.

Atribut:

  • nama : diwarisi dari MakhlukHidup, menyimpan nama manusia.

Method:

  • Manusia(String nama) : konstruktor untuk membuat objek manusia dengan nama tertentu.
  • bernapas() : menampilkan cara manusia bernapas.

  • tumbuh() : menampilkan proses manusia tumbuh menjadi dewasa.

  • berpikir() : menampilkan kemampuan manusia untuk berpikir atau merenung.

Hubungan:

Merupakan subclass dari MakhlukHidup.
Mewarisi atribut nama serta mengimplementasikan method bernapas() dan tumbuh() dari superclass-nya.


3. Class Hewan

public class Hewan extends MakhlukHidup {

    public Hewan(String nama) {
        super(nama);
    }

    @Override
    public void bernapas() {
        System.out.println(nama + " bernapas perlahan sambil mengamati sekelilingnya.");
    }

    @Override
    public void tumbuh() {
        System.out.println(nama + " tumbuh menjadi hewan yang lincah dan tangguh.");
    }

    public void berburu() {
        System.out.println(nama + " berlari cepat saat mengejar mangsa di padang rumput.");
    }
}

Kegunaan:

Mewakili makhluk hidup jenis hewan yang bisa bernapas, tumbuh, dan bergerak untuk bertahan hidup.

Atribut:

  • nama : diwarisi dari MakhlukHidup, menyimpan nama hewan.

Method:

  • Hewan(String nama) : konstruktor untuk memberi nama hewan saat objek dibuat.

  • bernapas() : menampilkan aktivitas bernapas hewan.

  • tumbuh() : menampilkan proses pertumbuhan hewan.

  • berburu() : menggambarkan perilaku hewan dalam berburu atau bergerak aktif.

Hubungan:

Merupakan subclass dari MakhlukHidup.
Mengimplementasikan method abstrak dari superclass dan menambahkan perilaku spesifik berburu().


4. Class Tumbuhan

public class Tumbuhan extends MakhlukHidup {

    public Tumbuhan(String nama) {
        super(nama);
    }

    @Override
    public void bernapas() {
        System.out.println(nama + " menyerap udara pagi dan mengeluarkan oksigen segar.");
    }

    @Override
    public void tumbuh() {
        System.out.println(nama + " tumbuh perlahan menuju arah cahaya matahari.");
    }

    public void berfotosintesis() {
        System.out.println(nama + " melakukan fotosintesis sambil menari lembut ditiup angin.");
    }
}

Kegunaan:

Mewakili makhluk hidup jenis tumbuhan yang bisa bernapas, tumbuh, dan melakukan fotosintesis.

Atribut:

  • nama : diwarisi dari MakhlukHidup, menyimpan nama tumbuhan.

Method:

  • Tumbuhan(String nama) : konstruktor untuk memberi nama tumbuhan.

  • bernapas() : menampilkan proses tumbuhan bernapas.

  • tumbuh() : menampilkan proses tumbuhan berkembang menuju cahaya matahari.

  • berfotosintesis() : menunjukkan aktivitas khas tumbuhan dalam menghasilkan energi.

Hubungan:

Merupakan subclass dari MakhlukHidup.
Mengimplementasikan method abstrak dan menambahkan method unik berfotosintesis().


5. Class MainMakhluk

public class Tumbuhan extends MakhlukHidup {

    public Tumbuhan(String nama) {
        super(nama);
    }

    @Override
    public void bernapas() {
        System.out.println(nama + " menyerap udara pagi dan mengeluarkan oksigen segar.");
    }

    @Override
    public void tumbuh() {
        System.out.println(nama + " tumbuh perlahan menuju arah cahaya matahari.");
    }

    public void berfotosintesis() {
        System.out.println(nama + " melakukan fotosintesis sambil menari lembut ditiup angin.");
    }
}

Kegunaan:

Menjadi kelas utama (driver class) yang berfungsi untuk menjalankan program dan menguji hubungan antar kelas.

Atribut:

Tidak memiliki atribut khusus.

Method:

  • main(String[] args) : method utama yang membuat objek dari Manusia, Hewan, dan Tumbuhan, lalu memanggil method masing-masing untuk menampilkan perilaku.

Hubungan:

Berperan sebagai pengguna (client) dari semua kelas turunan MakhlukHidup.
Tidak mewarisi apa pun, tetapi membuat objek dari ketiga subclass dan mengakses fungsinya.


2. Pelajari dan baca simulasi Foxes and Rabbit yang ada di buku. Kemudian buat program perubahan dari struktur class umum menjadi bentuk Abstract Class.

Jawab

Output Program


Penjelasan



1. Class Animal

import java.util.List;  
 import java.util.Random;  
 public abstract class Animal {  
   protected int age;  
   protected boolean alive;  
   protected Location location;  
   protected Field field;  
   protected static final Random rand = new Random();  
   public Animal(boolean randomAge,Field field, Location location) {  
     if (randomAge) {  
       this.age = rand.nextInt(getMaxAge());  
     } else {  
       this.age = 0;  
     }  
     this.field = field;  
     this.alive = true;  
     setLocation(location);  
   }  
   public int getAge() {  
     return age;  
   }  
   public boolean isAlive() {  
     return alive;  
   }  
   public Location getLocation() {  
     return location;  
   }  
   public void setLocation(Location newLocation) {  
     if (location != null) {  
       field.clear(location);  
     }  
     location = newLocation;  
     field.place(this, newLocation);  
   }  
   public void setDead() {  
     alive = false;  
     if (location != null) {  
       field.clear(location);  
       location = null;  
     }  
     field = null;  
   }  
   public boolean canBreed() {  
     return age >= getBreedingAge();  
   }  
   protected void incrementAge() {  
     age++;  
     if (age > getMaxAge()) {  
       setDead();  
     }  
   }  
   protected void giveBirth(List<Animal> newAnimals) {  
     if (location == null) {  
       return;  
     }  
     List<Location> free = field.getAllFreeAdjacentLocations(location);  
     int totalOffspring = breed();  
     for (int b = 0; b < totalOffspring && free.size() > 0; b++) {  
       Location loc = free.remove(0);  
       Animal young = createYoung(field, loc);  
       newAnimals.add(young);  
     }  
   }  
   protected int breed() {  
     int totalOffspring = 0;  
     if (canBreed() && rand.nextDouble() <= getBreedingProbability()) {  
       totalOffspring = rand.nextInt(getMaxLitterSize()) + 1;  
     }  
     return totalOffspring;  
   }  
   public String printLocation(Location location) {  
     return String.format("(" + (location.getRow()+1) + "," + (location.getCol()+1) + ")");  
   }  
   public abstract void act(List<Animal> newAnimals);  
   protected abstract int getMaxAge();  
   protected abstract int getBreedingAge();  
   protected abstract double getBreedingProbability();  
   protected abstract int getMaxLitterSize();  
   protected abstract Animal createYoung(Field field, Location location);  
 }

Kegunaan:

Menjadi kelas abstrak dasar untuk semua jenis hewan dalam simulasi (seperti Rabbit dan Fox). Kelas ini mengatur perilaku umum seperti umur, status hidup, lokasi, dan mekanisme reproduksi.

Atribut:

  • age : menyimpan umur hewan.

  • alive : menunjukkan apakah hewan masih hidup (true) atau sudah mati (false).

  • location : posisi hewan di area simulasi.

  • field : area tempat hewan berada (objek dari class Field).

  • rand : objek Random untuk menghasilkan nilai acak (misalnya umur awal, kemungkinan berkembang biak).

Method:

  • Animal(boolean randomAge, Field field, Location location) : konstruktor untuk inisialisasi hewan baru.

  • getAge() : mengembalikan umur hewan.

  • isAlive() : memeriksa apakah hewan masih hidup.

  • getLocation() : mengembalikan lokasi saat ini.

  • setLocation(Location newLocation) : memindahkan hewan ke lokasi baru.

  • setDead() : menandai hewan mati dan menghapus dari field.

  • canBreed() : menentukan apakah hewan sudah cukup umur untuk berkembang biak.

  • incrementAge() : menambah umur dan mematikan hewan bila melewati umur maksimum.

  • giveBirth(List<Animal> newAnimals) : menghasilkan anak baru jika memenuhi syarat.

  • breed() : menghitung jumlah anak berdasarkan probabilitas dan ukuran maksimum litter.

  • printLocation(Location location) : menampilkan lokasi dalam format koordinat.

  • act(List<Animal> newAnimals) : method abstrak untuk perilaku tiap hewan di setiap langkah simulasi.

  • getMaxAge(), getBreedingAge(), getBreedingProbability(), getMaxLitterSize(), createYoung() : method abstrak yang harus diimplementasikan subclass.

Hubungan:

Superclass dari Rabbit dan Fox.
Berelasi dengan Field dan Location untuk mengatur posisi dan lingkungan hewan.


2. Class Rabbit

 import java.util.List;  
 public class Rabbit extends Animal {  
   public Rabbit(boolean randomAge, Field field, Location location) {  
     super(randomAge, field, location);  
   }  
   @Override  
   public void act(List<Animal> newAnimals) {  
     incrementAge();  
     if (isAlive()) {  
       giveBirth(newAnimals);  
       Location newLocation = field.getFreeAdjacentLocations(location);  
       if (newLocation != null) {  
         setLocation(newLocation);  
       } else {  
         setDead();  
       }  
     }  
   }  
   public void setDead() {  
     alive = false;  
     if (location != null) {  
       field.clear(location);  
       location = null;  
       field = null;  
     }  
   }  
   public void setLocation(Location newLocation) {  
     if (location != null) {  
       field.clear(location);  
       location = newLocation;  
     }  
   }  
   @Override  
   protected int getMaxAge() {  
     return 5;  
   }  
   @Override  
   protected int getBreedingAge() {  
     return 1;  
   }  
   @Override  
   protected double getBreedingProbability() {  
     return 0.12;  
   }  
   @Override  
   protected int getMaxLitterSize() {  
     return 4;  
   }  
   @Override  
   protected Animal createYoung(Field field, Location location) {  
     return new Rabbit(false,field, location);  
   }  
 }  

Kegunaan:

Mewakili hewan jenis kelinci yang hidup di dalam simulasi.
Kelas ini mengatur perilaku kelinci seperti bergerak, tumbuh, mati, dan berkembang biak.

Atribut:

  • Mewarisi semua atribut dari Animal (age, alive, field, location, dll).

Method:

  • Rabbit(boolean randomAge, Field field, Location location) : konstruktor untuk membuat kelinci baru.
  • act(List<Animal> newAnimals) : menentukan tindakan kelinci di setiap langkah (bertambah umur, melahirkan, pindah tempat, atau mati).

  • setDead() : menandai kelinci mati dan membersihkan dari field.

  • setLocation(Location newLocation) : memindahkan posisi kelinci.

  • getMaxAge() : umur maksimum kelinci (5 langkah).

  • getBreedingAge() : umur minimum agar bisa berkembang biak (1 langkah).

  • getBreedingProbability() : peluang berkembang biak (12%).

  • getMaxLitterSize() : jumlah maksimum anak per kelahiran (4 ekor).

  • createYoung() : membuat objek Rabbit baru di lokasi tertentu.

Hubungan:

Subclass dari Animal.
Berinteraksi dengan Field untuk mencari lokasi kosong dan dengan Simulator untuk direkam per langkah.



4. Class Field

 import java.util.ArrayList;  
 import java.util.List;  
 public class Field {  
   private Object[][] field;  
   public Field(int row, int col) {  
     field = new Object[row][col];  
   }  
   public void clear(Location location) {  
     field[location.getRow()][location.getCol()] = null;  
   }  
   public void place(Object object, Location location) {  
     field[location.getRow()][location.getCol()] = object;  
   }  
   public void clearAll() {  
     for (int row = 0; row < getRow(); row++) {  
       for (int col = 0; col < field[row].length; col++) {  
         field[row][col] = null;  
       }  
     }  
   }  
   public Object getObjectAt(Location location) {  
     if (location.getRow() >= 0 && location.getRow() < getRow() && location.getCol() >= 0  
         && location.getCol() < getCol()) {  
       return field[location.getRow()][location.getCol()];  
     } else {  
       return null;  
     }  
   }  
   public List<Location> getAllFreeAdjacentLocations(Location location) {  
     List<Location> free = new ArrayList<>();  
     List<Location> adjacent = adjacentLocations(location);  
     for (Location loc : adjacent) {  
       if (getObjectAt(loc) == null) {  
         free.add(loc);  
       }  
     }  
     return free;  
   }  
   public Location getFreeAdjacentLocations(Location location) {  
     List<Location> free = getAllFreeAdjacentLocations(location);  
     if (free.size() > 0) {  
       return free.get(0);  
     }  
     return null;  
   }  
   public List<Location> adjacentLocations(Location location) {  
     List<Location> locations = new ArrayList<>();  
     if (location==null) {  
       return locations;  
     }  
     int row = location.getRow();  
     int col = location.getCol();  
     if (row > 0) {  
       locations.add(new Location(row - 1, col));  
     }  
     if (row < getRow() - 1) {  
       locations.add(new Location(row + 1, col));  
     }  
     if (col > 0) {  
       locations.add(new Location(row, col - 1));  
     }  
     if (col < getCol() - 1) {  
       locations.add(new Location(row, col + 1));  
     }  
     return locations;  
   }  
   public int getRow() {  
     return field.length;  
   }  
   public int getCol() {  
     return field[0].length;  
   }  
 }  

Kegunaan:

Menjadi representasi peta atau area tempat semua hewan berada.
Mengatur penempatan, penghapusan, dan pencarian posisi kosong di dalam grid.

Atribut:

  • Object[][] field : matriks dua dimensi yang menyimpan semua objek (hewan) dalam simulasi.

Method:

  • Field(int row, int col) : membuat field baru dengan ukuran tertentu.

  • clear(Location location) : menghapus isi suatu lokasi.

  • place(Object object, Location location) : menempatkan objek di lokasi tertentu.

  • clearAll() : menghapus seluruh isi field.

  • getObjectAt(Location location) : mengambil objek di posisi tertentu.

  • getAllFreeAdjacentLocations(Location location) : mencari semua lokasi kosong di sekitar.

  • getFreeAdjacentLocations(Location location) : mengambil satu lokasi kosong di sekitar.

  • adjacentLocations(Location location) : mengembalikan daftar lokasi yang berdekatan.

  • getRow(), getCol() : mengembalikan jumlah baris dan kolom field.

Hubungan:

Berelasi dengan Animal, Fox, dan Rabbit karena semua hewan hidup di dalam Field.
Digunakan juga oleh Simulator untuk menampilkan posisi hewan di peta.


5. Class Location

 public class Location {  
   private int row;  
   private int col;  
   public Location(int row, int col) {  
     this.row = row;  
     this.col = col;  
   }  
   public int getRow() {  
     return row;  
   }  
   public int getCol() {  
     return col;  
   }  
 }  

Kegunaan:

Mewakili koordinat posisi (baris dan kolom) di dalam Field.
Digunakan untuk menentukan dan memanipulasi lokasi hewan.

Atribut:

  • row : posisi baris.

  • col : posisi kolom.

Method:

  • Location(int row, int col) : konstruktor untuk membuat posisi baru.

  • getRow() : mengembalikan nilai baris.

  • getCol() : mengembalikan nilai kolom.

Hubungan:

Digunakan oleh Field, Animal, Rabbit, dan Fox untuk menentukan posisi di dalam simulasi.


5. Class Simulator

 import java.util.ArrayList;  
 import java.util.List;  
 import java.util.Random;  
 import java.util.Iterator;  
 public class Simulator {  
   private List<Animal> animals;  
   private Field field;  
   private int step;  
   private SimulatorView view;  
   public Simulator(int row, int col){  
     if (row <= 0 || col <= 0){  
       System.out.println("The number of rows and columns must be greater than zero.");  
       System.out.println("Using default values.");  
       row = 10;  
       col = 10;  
     }  
     animals = new ArrayList<Animal>();  
     field = new Field(row, col);  
     view = new SimulatorView(row, col);  
     view.setView(Rabbit.class, 'R');  
     view.setView(Fox.class, 'F');  
     reset();  
   }  
   public void simulate(int maxSteps){  
     for (int step = 1; step <= maxSteps; step++){  
       simulateOneStep();  
     }  
   }  
   public void reset(){  
     step = 0;  
     animals.clear();  
     field.clearAll();  
     populate();  
     view.showField(step, field);  
   }  
   public void simulateOneStep(){  
     step++;  
     List<Animal> newAnimals = new ArrayList<Animal>();  
     for (Iterator<Animal> it = animals.iterator(); it.hasNext();){  
       Animal animal = it.next();  
       animal.act(newAnimals);  
     }  
     view.showField(step, field);  
   }  
   private void populate(){  
     field.clearAll();  
     double foxPopulation = 0.05;  
     double rabbitPopulation = 0.15;  
     Random rand = new Random();  
     for (int r = 0; r < field.getRow(); r++){  
       for (int c = 0; c < field.getCol(); c++){  
         Location location = new Location(r, c);  
         if (rand.nextDouble() <= foxPopulation){  
           Fox fox = new Fox(false, field, location);  
           animals.add(fox);  
           field.place(fox, location);  
         } else if (rand.nextDouble() <= rabbitPopulation){  
           Rabbit rabbit = new Rabbit(true, field, location);  
           animals.add(rabbit);  
           field.place(rabbit, location);  
         }  
       }  
     }  
   }  
 }  

Kegunaan:

Mengatur keseluruhan proses simulasi.
Mengontrol langkah-langkah waktu, pergerakan hewan, kelahiran, kematian, dan tampilan peta.

Atribut:

  • List<Animal> animals : daftar semua hewan aktif di dalam simulasi.

  • Field field : peta simulasi tempat hewan hidup.

  • int step : menghitung langkah simulasi saat ini.

  • SimulatorView view : objek tampilan yang menampilkan kondisi field di setiap langkah.

Method:

  • Simulator(int row, int col) : konstruktor, membuat simulasi dengan ukuran peta tertentu.

  • simulate(int maxSteps) : menjalankan simulasi selama jumlah langkah tertentu.

  • reset() : mengatur ulang simulasi dan mengisi peta kembali dengan hewan baru.

  • simulateOneStep() : menjalankan satu langkah simulasi (setiap hewan bertindak sekali).

  • populate() : menambahkan hewan awal ke dalam peta secara acak.

Hubungan:

Mengontrol objek Field, Animal, Fox, Rabbit, dan SimulatorView.

Memiliki asosiasi langsung dengan semua kelas lain dalam sistem.


6. Class Location


 public class Location {  
   private int row;  
   private int col;  
   public Location(int row, int col) {  
     this.row = row;  
     this.col = col;  
   }  
   public int getRow() {  
     return row;  
   }  
   public int getCol() {  
     return col;  
   }  
 }  

Kegunaan:

Mewakili koordinat posisi (baris dan kolom) di dalam Field.
Digunakan untuk menentukan dan memanipulasi lokasi hewan.

Atribut:

  • row : posisi baris.

  • col : posisi kolom.

Method:

  • Location(int row, int col) : konstruktor untuk membuat posisi baru.

  • getRow() : mengembalikan nilai baris.

  • getCol() : mengembalikan nilai kolom.

Hubungan:

Digunakan oleh FieldAnimalRabbit, dan Fox untuk menentukan posisi di dalam simulasi.


7. Class SimulatorView


 import java.util.HashMap;  
 import java.util.Map;  
 public class SimulatorView {  
   private int row;  
   private int col;  
   private Map<Class<?>, Character> fieldView;  
   public SimulatorView(int row, int col) {  
     this.row = row;  
     this.col = col;  
     fieldView = new HashMap<Class<?>, Character>();  
   }  
   public void setView(Class<?> animalClass, Character viewChar) {  
     fieldView.put(animalClass, viewChar);  
   }  
   public void showField(int step, Field field){  
     System.out.println("Step: " + step);  
     for (int r =0; r<row; r++){  
       for (int c = 0; c<col; c++){  
         Object animal = field.getObjectAt(new Location(r, c));  
         if (animal == null){  
           System.out.print('.');  
         } else {  
           Character viewChar = fieldView.get(animal.getClass());  
           if (viewChar != null){  
             System.out.print(viewChar);  
           } else {  
             System.out.print("?");  
           }  
 //          System.out.print(' ');  
         }  
       }  
       System.out.println();  
     }  
     System.out.println();  
   }  
 }  
 

Kegunaan:

Menampilkan kondisi Field ke layar dalam bentuk teks.
Menandai setiap jenis hewan dengan karakter tertentu (misal 'R' untuk kelinci, 'F' untuk rubah).

Atribut:

  • row, col : ukuran peta simulasi.

  • Map<Class<?>, Character> fieldView : peta karakter tampilan untuk setiap jenis hewan.

Method:

  • SimulatorView(int row, int col) : konstruktor untuk membuat tampilan peta.

  • setView(Class<?> animalClass, Character viewChar) : menentukan karakter simbol untuk setiap hewan.

  • showField(int step, Field field) : mencetak keadaan peta di setiap langkah simulasi.

Hubungan:

Berelasi dengan Simulator (dipanggil oleh Simulator setiap langkah).
Juga menggunakan Field dan Location untuk menampilkan isi peta.


8. Class Main

 public class Main {  
   public static void main(String[] args) {  
     Simulator simulator = new Simulator(10, 10);  
     simulator.simulate(5);  
   }  
 }  
 
Kegunaan:

Sebagai entry point (titik awal) dari program.
Menjalankan simulasi dengan membuat objek Simulator dan menjalankan metode simulate().

Atribut:

Tidak memiliki atribut.

Method:

  • main(String[] args) : method utama untuk menjalankan program.

Hubungan:

Hanya berhubungan dengan Simulator, yang kemudian mengatur seluruh alur simulasi.


Tidak ada komentar:

Posting Komentar

Pertemuan 16 - Membuat Aplikasi CRUD Java

 Nama          : Safa Mashita  NRP            : 5025241022 Membuat Aplikasi CRUD Java - Manajemen Buku Perpustakaan Pada pertemuan ini, saya...