Pertemuan 13 PBO A - Implementasi Abstraction
Implementasi Abstraction
Nama : Dapunta Adyapaksi Ratyanasja
NRP : 5025231187
Tugas : Pertemuan 13
Latihan 1
Tuliskan implementasi dari program kecil Abstract Class Makhluk hidup yang diwariskan kepada manusia, hewan, dan tumbuhan
class livingBeing {
public void bernapas() {
System.out.println("Makhluk hidup bernapas.");
}
public void bergerak() {
System.out.println("Makhluk hidup bergerak.");
}
}
Class livingBeing adalah kelas induk yang akan diwarisi oleh kelas lain.
Terdapat 2 metode, yaitu :
- bernapas() : Metode default untuk mencetak "Makhluk hidup bernapas."
- bergerak() : Metode default untuk mencetak "Makhluk hidup bergerak."
class Human extends livingBeing {
@Override
public void bernapas() {
System.out.println("Manusia bernapas menggunakan paru-paru.");
}
@Override
public void bergerak() {
System.out.println("Manusia bergerak dengan berjalan atau berlari.");
}
}
Subclass Human mewakili manusia. Ketika metode bernapas() atau bergerak() dipanggil pada objek Human, versi yang didefinisikan dalam Human yang akan dijalankan.
class Animal extends livingBeing {
@Override
public void bernapas() {
System.out.println("Hewan bernapas menggunakan paru-paru atau insang.");
}
@Override
public void bergerak() {
System.out.println("Hewan bergerak dengan berjalan, berenang, atau terbang.");
}
}
Subclass Animal mewakili hewan. Ketika metode bernapas() atau bergerak() dipanggil pada objek Animal, versi yang didefinisikan dalam Animal yang akan dijalankan.
class Plant extends livingBeing {
@Override
public void bernapas() {
System.out.println("Tumbuhan bernapas melalui stomata.");
}
@Override
public void bergerak() {
System.out.println("Tumbuhan bergerak dengan tumbuh ke arah cahaya.");
}
}
Subclass Plant mewakili tumbuhan. Ketika metode bernapas() atau bergerak() dipanggil pada objek Plant, versi yang didefinisikan dalam Plant yang akan dijalankan.
public class Main {
public static void main(String[] args) {
// Membuat objek dari masing-masing subclass
livingBeing manusia = new Human();
livingBeing hewan = new Animal();
livingBeing tumbuhan = new Plant();
// Memanggil metode yang dioverride
System.out.println("Manusia:");
manusia.bernapas();
manusia.bergerak();
System.out.println("\nHewan:");
hewan.bernapas();
hewan.bergerak();
System.out.println("\nTumbuhan:");
tumbuhan.bernapas();
tumbuhan.bergerak();
}
}
Membuat Object
- livingBeing manusia = new Human();
- livingBeing hewan = new Animal();
- livingBeing tumbuhan = new Plant();
Objek dibuat, tetapi ditampung dalam variabel bertipe livingBeing untuk menunjukkan polimorfisme.
Print Output
Metode dipanggil untuk masing-masing objek
Screenshot
Latihan 2
Pelajari dan baca simulasi Foxes and Rabbit yang ada di buku. Kemudian buat program perubahan dari struktur class umum menjadi bentuk Abstract Class.
A. Import Library
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
B. Class Animal
abstract class Animal {
private boolean alive;
private Field field;
private Location location;
public Animal(Field field, Location location) {
this.alive = true;
this.field = field;
setLocation(location);
}
public boolean isAlive() {
return alive;
}
public void setDead() {
alive = false;
field.clear(location);
}
public Location getLocation() {
return location;
}
public void setLocation(Location newLocation) {
if (location != null) {
field.clear(location);
}
location = newLocation;
field.place(this, newLocation);
}
public abstract void act(List<Animal> animals);
protected Field getField() {
return field;
}
}
class Animal adalah kelas abstrak yang mendefinisikan perilaku dasar semua hewan. Di dalamnya terdapat beberapa property seperti :
private boolean alive; // Menyimpan status hidup/mati hewan
private Field field; // Merujuk ke tempat atau lapangan tempat hewan berada
private Location location; // Lokasi hewan di lapangan
public Animal(Field field, Location location) {
this.alive = true;
this.field = field;
setLocation(location);
}
Konstruktor Animal menginisialisasi objek hewan dengan status hidup, menetapkan lapangan dan lokasi.
public boolean isAlive() {
return alive;
}
Mengecek apakah hewan masih hidup.
public void setDead() {
alive = false;
field.clear(location);
}
Mengubah status hewan menjadi mati dan membersihkan lokasi di lapangan.
public Location getLocation() {
return location;
}
public void setLocation(Location newLocation) {
if (location != null) {
field.clear(location);
}
location = newLocation;
field.place(this, newLocation);
}
Mendapatkan dan menetapkan lokasi hewan di lapangan.
public abstract void act(List<Animal> animals);
Metode abstrak yang harus diimplementasikan oleh kelas turunan untuk mendefinisikan tindakan hewan.
protected Field getField() {
return field;
}
Mengakses lapangan tempat hewan berada.
C. Class Rabbit
class Rabbit extends Animal {
public Rabbit(Field field, Location location) {
super(field, location);
}
@Override
public void act(List<Animal> animals) {
if (isAlive()) {
Location newLocation = getField().freeAdjacentLocation(getLocation());
if (newLocation != null) {
setLocation(newLocation);
}
}
}
}
Class Rabbit adalah kelas turunan dari Animal, yang menggambarkan kelinci. Di dalamnya memuat beberapa property :
public Rabbit(Field field, Location location) {
super(field, location);
}
Konstruktor Rabbit memanggil konstruktor induk Animal untuk mengatur lapangan dan lokasi.
@Override
public void act(List<Animal> animals) {
if (isAlive()) {
Location newLocation = getField().freeAdjacentLocation(getLocation());
if (newLocation != null) {
setLocation(newLocation);
}
}
}
Jika kelinci masih hidup, kelinci akan bergerak ke lokasi bebas yang ada di sekitarnya (menggunakan metode freeAdjacentLocation() pada kelas Field).
D. Class Fox
class Fox extends Animal {
public Fox(Field field, Location location) {
super(field, location);
}
@Override
public void act(List<Animal> animals) {
if (isAlive()) {
Location preyLocation = getField().findPrey(getLocation(), Rabbit.class);
if (preyLocation != null) {
Animal prey = getField().getAnimalAt(preyLocation);
if (prey != null && prey instanceof Rabbit) {
prey.setDead();
animals.remove(prey);
System.out.println("Moment fox menangkap rabbit pada titik: " + preyLocation);
}
setLocation(preyLocation);
} else {
Location newLocation = getField().freeAdjacentLocation(getLocation());
if (newLocation != null) {
setLocation(newLocation);
}
}
}
}
}
Class Fox adalah kelas turunan dari Animal, yang menggambarkan rubah. Di dalamnya memuat beberapa property :
public Fox(Field field, Location location) {
super(field, location);
}
Konstruktor Fox memanggil konstruktor induk Animal untuk mengatur lapangan dan lokasi.
@Override
public void act(List<Animal> animals) {
if (isAlive()) {
Location preyLocation = getField().findPrey(getLocation(), Rabbit.class);
if (preyLocation != null) {
Animal prey = getField().getAnimalAt(preyLocation);
if (prey != null && prey instanceof Rabbit) {
prey.setDead();
animals.remove(prey);
System.out.println("Moment fox menangkap rabbit pada titik: " + preyLocation);
}
setLocation(preyLocation);
} else {
Location newLocation = getField().freeAdjacentLocation(getLocation());
if (newLocation != null) {
setLocation(newLocation);
}
}
}
}
- Jika rubah masih hidup, rubah akan mencari kelinci di sekitarnya menggunakan metode findPrey().
- Jika ditemukan kelinci, rubah akan membunuhnya (mengubah status kelinci menjadi mati dan menghapusnya dari daftar animals).
- Rubah akan berpindah ke lokasi kelinci yang ditangkap atau bergerak ke lokasi kosong di sekitarnya jika tidak menemukan kelinci.
E. Class Location
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;
}
@Override
public String toString() {
return "(" + row + ", " + col + ")";
}
}
Class Location menggambarkan lokasi tertentu di dalam lapangan menggunakan koordinat row dan col.
F. Class Field
class Field {
private Animal[][] field;
private int rows;
private int cols;
public Field(int rows, int cols) {
this.rows = rows;
this.cols = cols;
field = new Animal[rows][cols];
}
public void clear(Location location) {
field[location.getRow()][location.getCol()] = null;
}
public void place(Animal animal, Location location) {
field[location.getRow()][location.getCol()] = animal;
}
public Animal getAnimalAt(Location location) {
return field[location.getRow()][location.getCol()];
}
public Location freeAdjacentLocation(Location location) {
List<Location> free = new ArrayList<>();
for (int dr = -1; dr <= 1; dr++) {
for (int dc = -1; dc <= 1; dc++) {
int newRow = location.getRow() + dr;
int newCol = location.getCol() + dc;
if (isValidLocation(newRow, newCol) && field[newRow][newCol] == null) {
free.add(new Location(newRow, newCol));
}
}
}
if (!free.isEmpty()) {
return free.get(new Random().nextInt(free.size()));
}
return null;
}
public Location findPrey(Location location, Class<?> preyClass) {
for (int dr = -1; dr <= 1; dr++) {
for (int dc = -1; dc <= 1; dc++) {
int newRow = location.getRow() + dr;
int newCol = location.getCol() + dc;
if (isValidLocation(newRow, newCol)) {
Animal animal = field[newRow][newCol];
if (animal != null && preyClass.isInstance(animal)) {
return new Location(newRow, newCol);
}
}
}
}
return null;
}
private boolean isValidLocation(int row, int col) {
return row >= 0 && row < rows && col >= 0 && col < cols;
}
}
Class Field menggambarkan lapangan tempat hewan berada. Ini adalah matriks dua dimensi (field), di mana setiap elemen menyimpan referensi ke objek Animal.
G. Class Main
public class Main {
public static void main(String[] args) {
int steps = 10; // Inisialisasi jumlah langkah
int initialRabbitCount = 5; // Inisialisasi jumlah kelinci
Field field = new Field(10, 10);
List<Animal> animals = new ArrayList<>();
// Tambahkan kelinci ke dalam simulasi
for (int i = 0; i < initialRabbitCount; i++) {
animals.add(new Rabbit(field, new Location(i, i)));
}
// Tambahkan rubah ke dalam simulasi
animals.add(new Fox(field, new Location(7, 7)));
animals.add(new Fox(field, new Location(9, 9)));
// Menampilkan informasi awal
System.out.println("Step: " + steps);
System.out.println("Jumlah Awal Rabbit: " + initialRabbitCount);
// Simulasi langkah
for (int step = 0; step < steps; step++) {
System.out.println("\nStep : " + (step + 1));
List<Animal> newAnimals = new ArrayList<>();
for (Animal animal : animals) {
if (animal.isAlive()) {
animal.act(animals);
}
}
// Menampilkan jumlah sisa kelinci
long remainingRabbits = animals.stream().filter(a -> a instanceof Rabbit && a.isAlive()).count();
System.out.println("Sisa rabbit: " + remainingRabbits);
System.out.println("------------------------------");
}
}
}
- Pada bagian Main, simulasi dimulai dengan mendefinisikan lapangan (10x10), dan jumlah langkah yang akan dijalankan.
- Kelinci dan rubah ditambahkan ke dalam daftar animals.
- Setiap langkah (loop) akan memperbarui posisi dan status setiap hewan berdasarkan aksi mereka.
- Setelah setiap langkah, jumlah kelinci yang masih hidup akan dihitung dan ditampilkan.
H. Output



Komentar
Posting Komentar