Source Code: https://github.com/rsthopaz/Abstract-Class-PBO.git
Makhluk Hidup
Explanation:1). Manusiapublic abstract class MakhlukHidup {
public abstract void berdiri ();
public void oksigen(){
System.out.println("- butuh Makanan");
System.out.println("- butuh oksigen");
System.out.println("- butuh air");
}
}
Kelas MakhlukHidup adalah kelas abstrak yang mendefinisikan ciri umum makhluk hidup
Metode Abstrak berdiri() : Harus diimplementasikan oleh kelas turunan (Manusia, Hewan, Tumbuhan).
Metode oksigen() : Mencetak kebutuhan dasar semua makhluk hidup: makanan, oksigen, dan air.
Kelas ini digunakan sebagai dasar untuk kelas turunan yang mewakili berbagai jenis makhluk hidup.
2). Manusia
public class Manusia extends MakhlukHidup {
private String duaKaki;
public Manusia(String duaKaki){
this.duaKaki = duaKaki;
}
public void berdiri (){
System.out.println("Manusia berdiri menggunakan : "+duaKaki);
}
}
Extends MakhlukHidup : Kelas Manusia adalah turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().
Atribut duaKaki : Atribut duaKaki adalah variabel bertipe String yang merepresentasikan cara berdiri manusia (menggunakan dua kaki).
Konstruktor : Konstruktor menerima parameter duaKaki untuk menginisialisasi atribut duaKaki.
Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dari kelas MakhlukHidup dengan mencetak cara berdiri manusia
3). Hewan
public class Hewan extends MakhlukHidup {
private String kakiEmpat, kakiDua ;
public Hewan(String kakiEmpat, String kakiDua){
this.kakiEmpat = kakiEmpat;
this.kakiDua = kakiDua;
}
public void berdiri (){
System.out.println("Kambing berdiri menggunakan : " +kakiEmpat);
System.out.println("Ayam berdiri menggunakan : " + kakiDua);
}
}
Extends MakhlukHidup : Kelas Hewan adalah turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().
Atribut kakiEmpat dan kakiDua : kakiEmpat dan kakiDua adalah atribut bertipe String yang digunakan untuk merepresentasikan jenis kaki hewan, misalnya hewan berkaki empat (kambing) dan berkaki dua (ayam).
Konstruktor : Konstruktor menerima dua parameter, yaitu kakiEmpat dan kakiDua, untuk menginisialisasi atribut tersebut.
Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dari kelas MakhlukHidup dengan mencetak cara berdiri dua jenis hewan
4). Tumbuhan
public class Tumbuhan extends MakhlukHidup {
private String Akar;
public Tumbuhan (String Akar){
this.Akar = Akar;
}
public void berdiri (){
System.out.println("Tumbuhan berdiri dengan : "+Akar);
}
}
Extends MakhlukHidup : Kelas Tumbuhan merupakan turunan dari kelas abstrak MakhlukHidup, sehingga wajib mengimplementasikan metode abstrak berdiri().
Atribut Akar : Atribut Akar adalah variabel bertipe String yang merepresentasikan cara tumbuhan berdiri (menggunakan akar).
Konstruktor : Konstruktor menerima parameter Akar untuk menginisialisasi atribut Akar.
Metode berdiri() : Mengimplementasikan metode abstrak berdiri() dengan mencetak cara tumbuhan berdiri, yaitu menggunakan akar
5). MainMakhlukHidup
public class MainMakhlukHidup {
public void cekMakhlukHidup (MakhlukHidup mHidup){
mHidup.berdiri();
mHidup.oksigen();
}
public static void main(String[] args) {
MainMakhlukHidup tMakhlukHidup = new MainMakhlukHidup();
tMakhlukHidup.cekMakhlukHidup(new Manusia("Dua Kaki"));
System.out.println("-----------------------------------------");
tMakhlukHidup.cekMakhlukHidup(new Hewan ("Empat Kaki","Dua Kaki"));
System.out.println("-----------------------------------------");
tMakhlukHidup.cekMakhlukHidup(new Tumbuhan ("Akar"));
}
}
Metode cekMakhlukHidup : Metode ini menerima parameter bertipe MakhlukHidup dan memanggil dua metode pada objek tersebut :
berdiri() : Menampilkan cara berdiri dari objek yang diberikan.
oksigen() : Menampilkan kebutuhan dasar makhluk hidup (makanan, oksigen, air).
Metode main : Membuat objek MainMakhlukHidup untuk memanggil metode cekMakhlukHidup. Menguji metode cekMakhlukHidup dengan tiga objek turunan dari MakhlukHidup :
Manusia : Menampilkan cara berdiri manusia (dua kaki) dan kebutuhan oksigen.
Hewan : Menampilkan cara berdiri hewan (kambing dengan empat kaki, ayam dengan dua kaki) dan kebutuhan oksigen.
Tumbuhan : Menampilkan cara berdiri tumbuhan (dengan akar) dan kebutuhan oksigen.
Diagram Class
Implementasi

Foxes and Rabbit
1). Animal
import java.util.List;
public abstract class Animal {
private int age;
private boolean alive;
private Field field;
private Location location;
public Animal(Field field, Location location) {
this.age = 0;
this.alive = true;
this.field = field;
setLocation(location);
}
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 Field getField() {
return field;
}
public void setLocation(Location newLocation) {
if (location != null) {
field.clear(location);
}
location = newLocation;
field.place(this, newLocation);
}
public abstract void act(List<Animal> newAnimals);
}
2). Field
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) {
return field[location.getRow()][location.getCol()];
}
public Location freeAdjacentLocation(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.isEmpty() ? null : free.get(0);
}
public List<Location> adjacentLocations(Location location) {
List<Location> locations = new ArrayList<>();
// Add logic to calculate adjacent locations
return locations;
}
// Menambahkan metode getDepth() dan getWidth()
public int getDepth() {
return field.length; // Mengembalikan jumlah baris
}
public int getWidth() {
return field[0].length; // Mengembalikan jumlah kolom
}
}
3). 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;
}
}
4). Rabbit
import java.util.List;
public class Rabbit extends Animal {
public Rabbit(Field field, Location location) {
super(field, location);
}
@Override
public void act(List<Animal> newAnimals) {
if (isAlive()) {
Location newLocation = getField().freeAdjacentLocation(getLocation());
if (newLocation != null) {
setLocation(newLocation);
} else {
setDead();
}
}
}
}
5). Fox
import java.util.List;
public class Fox extends Animal {
public Fox(Field field, Location location) {
super(field, location);
}
@Override
public void act(List<Animal> newAnimals) {
if (isAlive()) {
Location newLocation = findFood();
if (newLocation == null) {
newLocation = getField().freeAdjacentLocation(getLocation());
}
if (newLocation != null) {
setLocation(newLocation);
System.out.println("Fox moved to: " + newLocation.getRow() + ", " + newLocation.getCol());
} else {
setDead();
System.out.println("Fox died.");
}
}
}
private Location findFood() {
List<Location> adjacent = getField().adjacentLocations(getLocation());
for (Location loc : adjacent) {
Object animal = getField().getObjectAt(loc);
if (animal instanceof Rabbit) {
Rabbit rabbit = (Rabbit) animal;
rabbit.setDead();
return loc;
}
}
return null;
}
}
6). Simulatorimport java.util.ArrayList;
import java.util.List;
public class Simulator {
private Field field;
private List<Animal> animals;
public Simulator(int depth, int width) {
field = new Field(depth, width);
animals = new ArrayList<>();
populate();
}
public void simulate(int steps) {
for (int step = 0; step < steps; step++) {
System.out.println("Step " + step); // Menampilkan langkah simulasi
List<Animal> newAnimals = new ArrayList<>();
for (Animal animal : animals) {
animal.act(newAnimals);
}
animals.addAll(newAnimals);
// Tambahkan juga output untuk melihat keadaan hewan setelah setiap langkah
System.out.println("Jumlah hewan saat ini: " + animals.size());
}
}
private void populate() {
int numberOfFoxes = 5;
int numberOfRabbits = 10;
// Tambahkan foxes ke field
for (int i = 0; i < numberOfFoxes; i++) {
Location location = getRandomLocation();
Fox fox = new Fox(field, location);
animals.add(fox);
field.place(fox, location);
}
// Tambahkan rabbits ke field
for (int i = 0; i < numberOfRabbits; i++) {
Location location = getRandomLocation();
Rabbit rabbit = new Rabbit(field, location);
animals.add(rabbit);
field.place(rabbit, location);
}
// Cetak jumlah hewan yang ditambahkan
System.out.println("Jumlah foxes: " + numberOfFoxes);
System.out.println("Jumlah rabbits: " + numberOfRabbits);
}
private Location getRandomLocation() {
// Menghasilkan lokasi acak di dalam medan
int row = (int) (Math.random() * field.getDepth());
int col = (int) (Math.random() * field.getWidth());
Location location = new Location(row, col);
// Pastikan lokasi ini kosong
while (field.getObjectAt(location) != null) {
row = (int) (Math.random() * field.getDepth());
col = (int) (Math.random() * field.getWidth());
location = new Location(row, col);
}
return location;
}
}
Diagram Class
Komentar
Posting Komentar