1. Mencipta objek

Nah, kami telah tiba di mencipta objek. Anda telah pun mengalami perkara ini sebelum ini, tetapi kini kami akan menganalisis topik ini dengan lebih terperinci. Ia sebenarnya sangat mudah untuk mencipta objek.

Untuk mencipta objek, anda perlu menggunakan operator baharu . Mencipta objek kelihatan lebih kurang seperti ini:

new Class(arguments)

Selepas mencipta objek, kami selalunya menyimpan rujukan kepadanya dengan segera dalam pembolehubah, yang selalunya berkongsi jenis yang sama dengan objek yang dicipta. Ini bermakna apabila membuat objek, anda biasanya melihat kod seperti ini:

Class name = new Class(arguments)

Di manakah penciptaan pembolehubah baru, dan kod di sebelah kanan tanda sama ialah penciptaan objek baru yang jenisnya ialah .Class nameClass

Contoh:

Kod Catatan
Object o = new Object();
Buat Objectobjek
Cat pet = new Cat();
Buat Catobjek
Scanner console = new Scanner(System.in)
Buat Scannerobjek

Pengaturcara sering menamakan pembolehubah selepas kelas mereka, tetapi dengan huruf kecil. Untuk pengaturcara baru, kod sedemikian boleh mengelirukan:

Kod
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Tidak ada yang salah dengan kod ini — ini adalah kod yang paling biasa, di mana pembolehubah dicipta dan kemudian segera dimulakan oleh objek jenis yang sama.

Di sebelah kiri tanda sama kita mempunyai penciptaan pembolehubah. Di sebelah kanan, penciptaan objek. Itu sahaja.

2. Pembina

Anda mungkin telah melihat bahawa beberapa hujah sering diluluskan semasa membuat objek. Lebih-lebih lagi, hujah diluluskan untuk beberapa objek, tetapi bukan yang lain. Bagaimanakah keseluruhan mekanisme dengan hujah ini berfungsi?

Semuanya mudah di sini juga: setiap kelas mempunyai kaedah (atau kaedah) khas yang bertanggungjawab untuk mengendalikan hujah yang diluluskan semasa mencipta objek. Kaedah ini dipanggil pembina . Atau apabila kita bercakap tentang hanya satu: the constructor .

Membezakan kaedah pembina daripada kaedah biasa adalah mudah. Kaedah ini mempunyai dua ciri yang membezakan:

  • nama pembina adalah sama dengan nama kelasnya (dan bermula dengan huruf besar)
  • pembina tidak mempunyai jenis pulangan.

Secara umum, inilah yang biasanya kelihatan seperti:

modifiers Class(arguments)
{
   Code
}

Contoh:

Kod Catatan
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point




Pointpembina kelas kelas
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Buat objek kelas Point. Pembina kelas akan dipanggil.

Perhatikan rupa pembina: ia tidak mempunyai jenis pulangan dan namanya sama dengan nama kelas.

Dan satu lagi perkara: lihat kod di dalam pembina. Parameter pembina mempunyai nama yang sama dengan medan kelas: x dan y. Ia adalah amalan standard untuk mengelakkan membuat nama parameter baru. Nama-nama adalah sama dengan medan kelas. Konflik nama diselesaikan menggunakan kata kunci ini.

3. Memanggil pembina

Apabila menggunakan pengendali baharu dan arahan seperti " Kelas baharu ( argumen )" untuk mencipta objek baharu, dua perkara berlaku:

  • Mesin Java mencipta objek yang jenisnya ialah Kelas
  • Mesin Java memanggil pembina objek dan menghantar hujah anda

Sebagai seorang pengaturcara, anda boleh memutuskan pembina yang sepatutnya ada pada kelas anda, dan parameter yang sepatutnya ada pada pembina ini.

Katakan anda memutuskan untuk membuat kelas untuk menjejaki kucing di tempat perlindungan haiwan. Kemudian Catkelas anda mungkin kelihatan seperti ini:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
Ini dibenarkan
Cat cat = new Cat("Whiskers");
Tetapi ini tidak dibenarkan Kod ini tidak akan disusun.
Cat cat = new Cat();
Dan ini tidak dibenarkan. Kod ini tidak akan disusun.

Kelas ini Cathanya mempunyai satu pembina dengan nama dan parameter umur. Oleh kerana tiada pembina lain, anda mesti memberikan nama kucing ( name) dan umur ( age) sebagai hujah semasa mencipta objek. Menghantar hujah kepada pembina bukan pilihan .

4. Pembina berbilang

Tetapi jika anda perlu, anda boleh menambah berbilang pembina ke kelas. Tiada had pada bilangan pembina atau parameter mereka. Apabila anda mencipta objek, pengkompil secara automatik memilih pembina yang sepadan dengan parameter

Kod Catatan
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Ini dibenarkan: pembina pertama akan dipanggil
Cat cat = new Cat("Whiskers");
Ini dibenarkan: pembina kedua akan dipanggil
Cat cat = new Cat();
Tetapi ini tidak dibenarkan Kod ini tidak akan disusun.

Kami memutuskan untuk mengambil kira hakikat bahawa umur kucing mungkin tidak diketahui. Untuk mengendalikan kes ini, kami menambah pemalar khas UNKNOWNbersama-sama dengan pembina yang mempunyai hanya satu parameter - nama kucing.

Ambil perhatian bahawa kami masih memulakan kedua-dua pembolehubah di dalam kedua-dua pembina. Kami menggantikan parameter yang tidak diketahui/hilang dengan pemalar UNKNOWN.

Jika tiada nilai diberikan kepada pembolehubah umur, maka ia akan mempunyai nilai lalai 0. Lagipun, anak kucing yang ditemui di jalanan mungkin 0 tahun penuh. Ini bermakna sifar dalam pembolehubah umur tidak semestinya bermaksud "umur tidak diketahui".

5. Pembina lalai

Jika anda mahu objek anda dijadikan instantiated tanpa sebarang parameter, kelas anda perlu mengisytiharkan pembina tanpa hujah.

Pembina tanpa parameter tidak semestinya pembina tanpa kod. Pembina sedemikian boleh mengandungi kod yang memulakan pembolehubah dengan nilai permulaan:

Kod Catatan
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Ini dibenarkan: pembina pertama akan dipanggil
Cat cat = new Cat();
Ini dibenarkan: pembina kedua akan dipanggil

Pembina lalai

Terdapat satu perkara yang sangat penting yang perlu anda ketahui dan ingat.

Jika kelas anda mengisytiharkan bukan satu constructor , pengkompil akan menambah pembina lalai, yang merupakan pembina tanpa hujah dengan pengubah suai awam.

Tetapi jika kelas anda mengisytiharkan walaupun satu constructor , maka tiada constructor lalai akan ditambah dan anda perlu menambahnya sendiri jika anda mahukannya.

Kod Catatan
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Ini dibenarkan: pembina lalai akan dipanggil