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