1. Warisan

Untuk bekerja dengan mesin game CodeGym, Anda harus menggunakan warisan . Tetapi bagaimana jika Anda tidak tahu apa itu? Di satu sisi, Anda memang perlu memahami dan mempelajari topik ini. Di sisi lain, mesinnya dirancang khusus agar sangat sederhana, sehingga Anda bisa bertahan dengan pengetahuan warisan yang dangkal.

Jadi apa itu warisan? Secara sederhana, pewarisan adalah hubungan antara dua kelas. Salah satunya bertindak sebagai kelas induk, dan yang lainnya menjadi kelas anak (keturunan). Terlebih lagi, kelas induk bahkan mungkin tidak tahu bahwa ia memiliki kelas keturunan. Dengan kata lain, orang tua tidak mendapatkan banyak manfaat dari memiliki kelas keturunan.

Tetapi pewarisan memberikan banyak keuntungan bagi kelas anak. Yang paling penting adalah bahwa semua variabel dan metode kelas induk muncul di kelas anak, seolah-olah kode kelas induk disalin langsung ke kelas anak. Ini tidak sepenuhnya akurat, tetapi cukup untuk pemahaman dasar tentang pewarisan.

Berikut adalah beberapa contoh untuk membantu Anda lebih memahami warisan.

Contoh 1 — inilah contoh paling sederhana

public class Parent
{
}
Kelas Childmewarisi Parentkelas dengan bantuan kata extendskunci.
public class Child extends Parent
{
}

Contoh 2 — menggunakan variabel kelas induk

public class Parent
{
  public int age;
  public String name;
}
Kelas Childdapat menggunakan bidang agedan namedari kelas Parentseolah-olah dideklarasikan di Childkelas itu sendiri.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Contoh 3 — menggunakan metode kelas induk

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
Kelas Childdapat menggunakan variabel dan metode dari kelas Induk seolah-olah dideklarasikan di kelas Child. Dalam contoh ini, kami menggunakan getName()metode.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Menghilangkan beberapa detail, kita dapat mengatakan bahwa dari perspektif kompiler Java, kita cukup menyalin kode kelas induk ke dalam kode kelas anak:

public class Child extends Parent
{
   public int age;        // An inherited variable
   public String name;    // An inherited variable
   public getName() {     // An inherited method
      return name;
   }

   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}
Beginilah Childtampilan kelas dari sudut pandang kompiler


2. Penggantian metode

Terkadang ada situasi di mana kita membuat Childkelas kita mewarisi kelas yang sangat berguna Parent, menyebabkan anak mewarisi semua variabel dan metode induknya. Tetapi beberapa dari metode itu mungkin tidak bekerja seperti yang kita inginkan atau tidak sama sekali seperti yang kita inginkan.

Apa yang Anda lakukan dalam kasus ini? Kita dapat mengganti metode yang implementasinya tidak kita sukai . Ini adalah hal yang sederhana untuk dilakukan: di Childkelas kami, kami cukup mendeklarasikan metode dengan tanda tangan yang sama dengan metode di kelas Parentdan kemudian menulis kode kami sendiri di dalamnya.

Contoh 1 — penggantian metode

public class Parent
{
   public String name;
   public void setName(String nameNew) {
      name = nameNew;
   }

   public getName() {
      return name;
   }
}
Metode ini printInfo()akan menampilkan frasa berikut:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Menyederhanakan situasi, pewarisan menyebabkan kode kelas induk disalin ke kelas anak. Namun jika kelas turunan sudah menjadi metode yang ada di kelas leluhur, maka metode tersebut tidak disalin dari kelas leluhur. Di sini kita mengatakan bahwa metode di kelas anak menggantikan metode di kelas induk. Lihatlah contoh di bawah ini. Mungkin itu akan membantu membuat segalanya menjadi lebih jelas:

Beginilah tampilan kelas Anak dari sudut pandang kompiler:
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Contoh 2 - sedikit sihir pewarisan (dan penggantian metode)

public class Parent
{
   public getName() {
      return "Luke";
   }

   public void printInfo()
   {
      System.out.println( getName() );
   }
}
public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }
}

Jika printInfo()metode ini dipanggil pada sebuah Parenttipe, maka metode tersebut akan memanggil getName()metode dari Parentkelas tersebut.

Jika printInfo()metode ini dipanggil pada suatu Childobjek, metode tersebut pada gilirannya akan memanggil getName()metode kelas tersebut Child.

Dengan kata lain, printInfo()metode ini hanya dideklarasikan di kelas, tetapi metode kelas Parentakan dipanggil jika metode tersebut dipanggil pada objek.getName()ChildprintInfo()Child

Contoh:

Parent parent = new Parent();
parent.printnInfo();
Kode ini menampilkan teks berikut di layar:
Luke
Child child = new Child();
child.printnInfo();
Kode ini menampilkan teks berikut di layar:
Luke, I am your father

Dan semua karena dari sudut pandang kompiler (versi yang sangat disederhanakan), kode kelas Childterlihat seperti ini:

public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Beginilah Childtampilan kelas dari sudut pandang kompiler


3. Daftar

Berikut pengingat singkat tentang daftar ( List). Daftar memiliki banyak kesamaan dengan array:

  • Mereka dapat menyimpan banyak data dari jenis tertentu.
  • Mereka membiarkan Anda mendapatkan elemen berdasarkan indeks mereka.
  • Indeks elemen dimulai dari 0.

Keuntungan daftar:

Tidak seperti array, daftar dapat mengubah ukuran secara dinamis. Segera setelah pembuatan, ukuran daftar adalah 0. Saat item ditambahkan ke daftar, ukurannya bertambah. Contoh membuat daftar:

ArrayList<String> myList = new ArrayList<String>();
Menciptakan yang baruArrayList

Nilai yang ditunjukkan dalam kurung sudut adalah tipe data yang dapat disimpan oleh daftar.

Berikut adalah beberapa metode untuk bekerja dengan daftar:

Kode Deskripsi singkat
ArrayList<String> list = new ArrayList<String>();
Membuat daftar string baru
list.add("name");
Tambahkan elemen ke akhir daftar
list.add(0, "name");
Tambahkan elemen ke awal daftar
String name = list.get(5);
Dapatkan elemen dengan indeksnya
list.set(5, "new name");
Ubah elemen dengan indeksnya
int count = list.size();
Dapatkan jumlah elemen dalam daftar
list.remove(4);
Hapus elemen dari daftar

Untuk informasi lebih lanjut tentang daftar, Anda dapat membaca artikel berikut:



4. Angka acak

Mesin game CodeGym memiliki dua metode yang dapat digunakan untuk menghasilkan angka acak. Metode-metode ini adalah:

int getRandomNumber(int max)
int getRandomNumber(int min, int max)

Metode pertama — getRandomNumber(int max)— mengembalikan nomor acak dalam rentang 0, 1, 2, ... max-1. Di balik layar, ia menggunakan Randomkelas dari java.utilpaket, tetapi itu tidak mengubah cara Anda menggunakan nomor acak.

getRandomNumber(int)menerima bilangan bulat sebagai argumen. Angka ini akan menjadi batas atas angka yang dapat dikembalikan oleh generator angka acak. Batas bawah adalah 0. Perhatian! Generator angka acak TIDAK AKAN PERNAH mengembalikan nilai batas atas. Misalnya, jika Anda memanggil getRandomNumber(3), itu akan secara acak mengembalikan 0, 1, atau 2. Seperti yang Anda lihat, itu tidak akan mengembalikan 3. Menggunakan generator angka acak dengan cara ini agak sederhana, tetapi cocok untuk banyak kasus.

Metode kedua — getRandomNumber(int min, int max)— mengembalikan bilangan bulat acak dalam rentang [min, max-1]. Itu tidak akan pernah mengembalikan angka yang kurang dari min, dan tidak akan pernah mengembalikan angka yang lebih besar dari max-1.

Bagaimana metode ini dapat digunakan dalam praktik?

1. Dadu

Misalkan Anda ingin mensimulasikan lemparan dadu dan mendapatkan angka acak dalam rentang tersebut 1-6. Bagaimana Anda akan melakukannya? Ini dapat dilakukan dengan kode seperti ini:

int dice = getRandomNumber(1, 7);

Metode ini akan mengembalikan bilangan bulat acak dalam range 1-6.

2. Latihan sasaran

Misalkan Anda ingin mensimulasikan pemotretan pada target, dan keakuratan bidikan menyertakan komponen acak yang bervariasi dalam rentang dari -10hingga +10inklusif. Ini dapat dilakukan dengan kode seperti ini:

int dx = getRandomNumber(-10, 11);

Metode ini akan mengembalikan bilangan bulat acak dalam kisaran -10ke +10.

Ada banyak cara untuk menggunakan angka acak dalam permainan. Anda hanya dibatasi oleh imajinasi Anda. Tulis game Anda sendiri, sempurnakan, dan nikmati prosesnya.

Semua orang bisa bermain game, tapi hanya pemrogram yang bisa membuatnya.