Jumat, 14 November 2025

Pertemuan 12 : Abstract Class

Pertemuan 12 – Abstract Class

Tanggal: 10 November 2025
Nama: Hosea Felix Sanjaya
NRP: 5025241177


1. Contoh Abstrak Class: “Makhluk Hidup”

Kode Program


public abstract class MakhlukHidup {
    
    protected String nama;
    protected String jenisMakhluk;
    
    public MakhlukHidup(String nama, String jenisMakhluk) {
        this.nama = nama;
        this.jenisMakhluk = jenisMakhluk;
    }
    
    public void bernapas() {
        System.out.println(this.nama + " (" + this.jenisMakhluk + ") sedang bernapas.");
    }
    
    public abstract void bergerak();
    public abstract void berkembangBiak();
    
    public String getNama() {
        return nama;
    }
    public String getJenisMakhluk() {
        return jenisMakhluk;
    }
}




public class Manusia extends MakhlukHidup {
    
    public Manusia(String nama) {
        super(nama, "Manusia");
    }

    @Override
    public void bergerak() {
        System.out.println(this.nama + " bergerak dengan berjalan atau berlari.");
    }

    @Override
    public void berkembangBiak() {
        System.out.println(this.nama + " berkembang biak dengan melahirkan.");
    }
    
    public void berpikir() {
        System.out.println(this.nama + " sedang menggunakan akal untuk berpikir.");
    }
}




public class Hewan extends MakhlukHidup {
    
    private String caraGerak;
    
    public Hewan(String nama, String caraGerak) {
        super(nama, "Hewan");
        this.caraGerak = caraGerak;
    }

    @Override
    public void bergerak() {
        System.out.println(this.nama + " bergerak dengan cara " + this.caraGerak + ".");
    }

    @Override
    public void berkembangBiak() {
        System.out.println(this.nama + " berkembang biak dengan bertelur atau melahirkan.");
    }
}




public class Tumbuhan extends MakhlukHidup {
    
    public Tumbuhan(String nama) {
        super(nama, "Tumbuhan");
    }

    @Override
    public void bergerak() {
        System.out.println(this.nama + " bergerak secara pasif (tumbuh mengikuti cahaya/air).");
    }

    @Override
    public void berkembangBiak() {
        System.out.println(this.nama + " berkembang biak dengan biji atau tunas.");
    }
    
    public void berfotosintesis() {
        System.out.println(this.nama + " sedang melakukan fotosintesis.");
    }
}




public class Main {
    public static void main(String[] args) {
        System.out.println("--- DEMO ABSTRACT CLASS DAN INHERITANCE ---");
        
        Manusia andi = new Manusia("Andi");
        System.out.println("\n** Objek 1: " + andi.getNama() + " **");
        andi.bernapas();         
        andi.bergerak();         
        andi.berkembangBiak();   
        andi.berpikir();         
        
        Hewan kucing = new Hewan("Kucing", "merayap dan melompat");
        System.out.println("\n** Objek 2: " + kucing.getNama() + " **");
        kucing.bernapas();
        kucing.bergerak();
        kucing.berkembangBiak();
        
        Tumbuhan mawar = new Tumbuhan("Mawar");
        System.out.println("\n** Objek 3: " + mawar.getNama() + " **");
        mawar.bernapas();
        mawar.bergerak();
        mawar.berkembangBiak();
        mawar.berfotosintesis(); 

        System.out.println("\n--- DEMO POLIMORFISME ---");
        MakhlukHidup[] daftarMakhluk = new MakhlukHidup[3];
        daftarMakhluk[0] = andi;
        daftarMakhluk[1] = kucing;
        daftarMakhluk[2] = mawar;

        for (MakhlukHidup m : daftarMakhluk) {
            System.out.print(m.getNama() + " bertindak: ");
            m.bergerak();
        }
    }
}

Penjelasan Singkat

  • abstract class MakhlukHidup → berisi metode abstrak bernapas() yang wajib diimplementasikan kelas turunannya.
  • Class Manusia, Hewan, Tumbuhan → masing-masing memberikan implementasi berbeda.
  • Class Main → menggunakan polimorfisme untuk memanggil metode bernapas() pada objek berbeda.

2. Class Abstrak “Animal” + Program Simulasi Hewan

Kode Program


import java.util.List;
import java.util.Random;

public abstract class Animal {
    protected int age;
    protected boolean alive;
    protected Field field;
    protected Location location;
    protected static final Random rand = new Random();

    // Konstruktor
    public Animal(boolean randomAge, Field field, Location location) {
        this.alive = true;
        this.field = field;
        setLocation(location);

        if (randomAge) {
            this.age = rand.nextInt(getMaxAge());
        } else {
            this.age = 0;
        }
    }

    // Getter dan utilitas umum
    public int getAge() { return age; }
    public boolean isAlive() { return alive; }

    public void setDead() {
        alive = false;
        if (location != null) {
            field.clear(location);
            location = null;
            field = null;
        }
    }

    public Location getLocation() { return location; }

    public void setLocation(Location newLocation) {
        if (location != null) {
            field.clear(location);
        }
        location = newLocation;
        field.place(this, newLocation);
    }

    // Umur dan kelahiran
    protected void incrementAge() {
        age++;
        if (age > getMaxAge()) {
            setDead();
        }
    }

    protected void giveBirth(List newAnimals) {
        List free = field.allFreeAdjacentLocations(location);
        int births = breed();

        for (int b = 0; b < births && free.size() > 0; b++) {
            Location loc = free.remove(0);
            Animal young = createOffspring(false, field, loc);
            newAnimals.add(young);
        }
    }

    protected int breed() {
        int births = 0;
        if (canBreed() && rand.nextDouble() <= getBreedingProbability()) {
            births = rand.nextInt(getMaxLitterSize()) + 1;
        }
        return births;
    }

    public boolean canBreed() {
        return age >= getBreedingAge();
    }

    // Method abstrak — diimplementasi oleh subclass
    public abstract void act(List newAnimals);
    protected abstract int getBreedingAge();
    protected abstract int getMaxAge();
    protected abstract double getBreedingProbability();
    protected abstract int getMaxLitterSize();
    protected abstract Animal createOffspring(boolean randomAge, Field field, Location location);
}




import java.util.List;

public class Rabbit extends Animal {
    private static final int BREEDING_AGE = 5;
    private static final int MAX_AGE = 50;
    private static final double BREEDING_PROBABILITY = 0.15;
    private static final int MAX_LITTER_SIZE = 5;

    public Rabbit(boolean randomAge, Field field, Location location) {
        super(randomAge, field, location);
    }

    @Override
    public void act(List newRabbits) {
        incrementAge();
        if (isAlive()) {
            giveBirth(newRabbits);
            Location newLocation = field.freeAdjacentLocation(location);
            if (newLocation != null) {
                setLocation(newLocation);
            } else {
                setDead();
            }
        }
    }

    @Override
    protected int getBreedingAge() { return BREEDING_AGE; }

    @Override
    protected int getMaxAge() { return MAX_AGE; }

    @Override
    protected double getBreedingProbability() { return BREEDING_PROBABILITY; }

    @Override
    protected int getMaxLitterSize() { return MAX_LITTER_SIZE; }

    @Override
    protected Animal createOffspring(boolean randomAge, Field field, Location location) {
        return new Rabbit(randomAge, field, location);
    }
}




import java.util.List;
import java.util.Iterator;

public class Fox extends Animal {
    private static final int RABBIT_ENERGY_VALUE = 10;
    private static final int BREEDING_AGE = 10;
    private static final int MAX_AGE = 70;
    private static final double BREEDING_PROBABILITY = 0.15;
    private static final int MAX_LITTER_SIZE = 3;
    private static final int INITIAL_ENERGY = 20;

    private int energyLevel;

    public Fox(boolean randomAge, Field field, Location location) {
        super(randomAge, field, location);
        energyLevel = INITIAL_ENERGY;
    }

    @Override
    public void act(List newFoxes) {
        incrementAge();
        incrementHunger();

        if (isAlive()) {
            giveBirth(newFoxes);
            Location newLocation = findFood();

            if (newLocation == null) {
                newLocation = field.freeAdjacentLocation(location);
            }

            if (newLocation != null) {
                setLocation(newLocation);
            } else {
                setDead();
            }
        }
    }

    private void incrementHunger() {
        energyLevel--;
        if (energyLevel <= 0) {
            setDead();
        }
    }

    private Location findFood() {
        List adjacent = field.adjacentLocations(location);
        for (Location where : adjacent) {
            Object animal = field.getObjectAt(where);
            if (animal instanceof Rabbit) {
                Rabbit rabbit = (Rabbit) animal;
                if (rabbit.isAlive()) {
                    rabbit.setDead();
                    energyLevel += RABBIT_ENERGY_VALUE;
                    return where;
                }
            }
        }
        return null;
    }

    @Override
    protected int getBreedingAge() { return BREEDING_AGE; }

    @Override
    protected int getMaxAge() { return MAX_AGE; }

    @Override
    protected double getBreedingProbability() { return BREEDING_PROBABILITY; }

    @Override
    protected int getMaxLitterSize() { return MAX_LITTER_SIZE; }

    @Override
    protected Animal createOffspring(boolean randomAge, Field field, Location location) {
        return new Fox(randomAge, field, location);
    }
}




import java.util.List;
import java.util.ArrayList;

public class Field {
    private Object[][] field;

    public Field(int depth, int width) {
        field = new Object[depth][width];
    }

    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 Object getObjectAt(Location location) {
        if (location.getRow() >= 0 && location.getRow() < getRow() &&
            location.getCol() >= 0 && location.getCol() < getCol()) {
            return field[location.getRow()][location.getCol()];
        }
        return null;
    }

    public List adjacentLocations(Location location) {
        List locations = new ArrayList<>();

        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 List allFreeAdjacentLocations(Location location) {
        List free = new ArrayList<>();
        for (Location loc : adjacentLocations(location)) {
            if (getObjectAt(loc) == null) free.add(loc);
        }
        return free;
    }

    public Location freeAdjacentLocation(Location location) {
        List free = allFreeAdjacentLocations(location);
        return free.isEmpty() ? null : free.get(0);
    }

    public int getRow() { return field.length; }
    public int getCol() { return field[0].length; }

    public void clearAll() {
        for (int i = 0; i < field.length; i++) {
            for (int j = 0; j < field[i].length; j++) {
                field[i][j] = null;
            }
        }
    }
}




import java.util.*;

public class Simulator {
    private Field field;
    private List animals;
    private int step;
    private SimulatorView view;

    private static final int DEFAULT_ROW = 10;
    private static final int DEFAULT_COL = 10;

    public Simulator(int depth, int width) {
        if (width <= 0 || depth <= 0) {
            depth = DEFAULT_ROW;
            width = DEFAULT_COL;
        }

        animals = new ArrayList<>();
        field = new Field(depth, width);
        view = new SimulatorView(depth, width);
        view.setSymbol(Rabbit.class, 'R');
        view.setSymbol(Fox.class, 'F');

        populate();
    }

    public void simulate(int steps) {
        for (int i = 0; i < steps; i++) {
            simulateOneStep();
        }
    }

    private void simulateOneStep() {
        step++;
        List newAnimals = new ArrayList<>();

        for (Iterator it = animals.iterator(); it.hasNext();) {
            Animal animal = it.next();
            animal.act(newAnimals);
            if (!animal.isAlive()) it.remove();
        }

        animals.addAll(newAnimals);
        view.show(step, field);
    }

    private void populate() {
        field.clearAll();
        Random rand = new Random();
        double foxProb = 0.2;
        double rabbitProb = 0.3;

        for (int row = 0; row < field.getRow(); row++) {
            for (int col = 0; col < field.getCol(); col++) {
                Location loc = new Location(row, col);
                if (rand.nextDouble() <= foxProb) {
                    Fox fox = new Fox(false, field, loc);
                    animals.add(fox);
                    field.place(fox, loc);
                } else if (rand.nextDouble() <= rabbitProb) {
                    Rabbit rabbit = new Rabbit(true, field, loc);
                    animals.add(rabbit);
                    field.place(rabbit, loc);
                }
            }
        }
    }
}




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; }
}




import java.util.HashMap;
import java.util.Map;

public class SimulatorView {
    private int row;
    private int col;
    private Map, Character> symbols;

    public SimulatorView(int row, int col) {
        this.row = row;
        this.col = col;
        this.symbols = new HashMap<>();
    }

    public void setSymbol(Class /*isi ini dengan "< ? >" tanpa spasi, di mode html error soalnya*/ animal, char symbol) {
        symbols.put(animal, symbol);
    }

    public void show(int step, Field field) {
        System.out.println("Simulation step " + step + ": ");
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                Object animal = field.getObjectAt(new Location(i, j));
                if (animal == null) {
                    System.out.print(". ");
                } else {
                    Character symbol = symbols.get(animal.getClass());
                    System.out.print((symbol != null ? symbol : '?') + " ");
                }
            }
            System.out.println();
        }
        System.out.println();
    }
}




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


Penjelasan Singkat

  • Abstract class Animal → memiliki atribut dasar dan metode abstrak move() & eat().
  • Rabbit → melompat dan makan rumput.
  • Fox → berlari cepat dan berburu kelinci.
  • Simulation → menunjukkan penerapan polimorfisme dengan array objek.

Kesimpulan

  • Abstract class digunakan sebagai kerangka dasar bagi subclass.
  • Polimorfisme memungkinkan pemanggilan metode yang berbeda melalui referensi yang sama.
  • Contoh di atas memperlihatkan penerapan OOP dalam kehidupan nyata.

Tidak ada komentar:

Posting Komentar

Pertemuan 15 : Aplikasi CRUD JAVA

Pertemuan 15 - Java CRUD Database Tanggal: 9 Desember 2025 Nama: Hosea Felix Sanjaya NRP: 5025241177 a. Setup & Persiapan Envi...