CodeGym /Blog Java /rawak /Kelas Java: menulis kelas anda sendiri, pembina
John Squirrels
Tahap
San Francisco

Kelas Java: menulis kelas anda sendiri, pembina

Diterbitkan dalam kumpulan
Hai! Hari ini kita akan bercakap tentang kelas di Jawa. Anda boleh mengatakan bahawa kelas membentuk asas pengaturcaraan Java. Apabila anda menjadi seorang pengaturcara, hampir keseluruhan kerja anda akan menulis kelas anda sendiri yang mempunyai pelbagai fungsi. Mari lihat apa maksudnya dan cara ia berfungsi. :) Seperti yang anda tahu, Java ialah bahasa pengaturcaraan berorientasikan objek. Semua program terdiri daripada objek yang dalam satu cara atau yang lain berkaitan antara satu sama lain. Kelas adalah, pada asasnya, templat untuk objek. Ia menentukan rupa objek itu dan apakah fungsinya. Setiap objek ialah objek bagi sesetengah kelas. Pertimbangkan contoh yang sangat mudah ini:

public class Cat {

    String name;
    int age;

}
Katakan kami menulis program yang melibatkan kucing atas sebab tertentu (contohnya, kami mempunyai klinik veterinar yang menawarkan akses kepada akaun dalam talian). Kami telah mencipta kelas Cat dan mengisytiharkan dua pembolehubah di dalamnya: String name dan int age . Pembolehubah ahli ini dipanggil medan. Pada asasnya, ini adalah templat untuk semua kucing yang akan kami buat pada masa hadapan. Setiap objek Cat akan mempunyai dua pembolehubah: nama dan umur.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

}
Begini cara ia berfungsi! Kami mencipta kucing, memberikan nama dan umur, dan memaparkan semuanya pada konsol. Sangat mudah. :) Lebih kerap daripada tidak, kelas menerangkan perkara dan fenomena dalam dunia sebenar. Kucing, meja, seseorang, panah petir, halaman buku, roda—anda akan mencipta semua perkara ini dalam program anda menggunakan kelas individu. Buat masa ini, mari fokus pada pembolehubah yang kami isytiharkan dalam kelas Cat . Ia dipanggil medan, atau pembolehubah contoh. Nama mereka benar-benar mengatakan semuanya. Setiap contoh (atau objek) kelas Cat akan mempunyai pembolehubah ini. Setiap kucing yang kami cipta akan mempunyai pembolehubah namanya sendiri dan umurnya sendiripembolehubah. Ini masuk akal-ia pada dasarnya adalah bagaimana dengan kucing sebenar. :) Selain pembolehubah contoh, terdapat juga pembolehubah kelas (pembolehubah statik). Mari kita selesaikan contoh kita:

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
Output konsol: Kami mencipta kucing bernama Smudge. Umurnya 3 tahun Kami cipta seekor kucing bernama Fluffy. Umurnya 5 Jumlah bilangan kucing = 2 Sekarang kelas kami mempunyai pembolehubah baharu yang dipanggil kiraan. Ia bertanggungjawab untuk mengira kucing yang dicipta. Setiap kali kita mencipta kucing di utamakaedah, kita meningkatkan pembolehubah ini sebanyak 1. Pembolehubah ini diisytiharkan menggunakan kata kunci statik. Ini bermakna ia milik kelas, bukan objek tertentu kelas. Yang, sudah tentu, masuk akal: nama setiap kucing adalah milik kucing tertentu itu, tetapi kami memerlukan satu kaunter kucing yang terpakai kepada mereka semua. Inilah yang dicapai kata kunci statik: ia menjadikan pembolehubah kiraan sebagai pembolehubah tunggal untuk semua kucing. Nota: apabila kami memaparkan pembolehubah, kami tidak menggunakan smudge.count atau fluffy.count. Ia bukan milik sama ada Smudge atau Fluffy; ia tergolong dalam keseluruhan kelas Cat . Itulah sebabnya ia hanya dikira. Anda juga boleh menulis Cat.count. Itu juga betul. Apabila memaparkan pembolehubah nama, kami tidak akan melakukan perkara berikut:

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

        System.out.println("Total number of cats = " + count);
    }
}
Ini adalah satu kesilapan! Setiap kucing mempunyai nama sendiri. Pengkompil menjadi keliru di sini. "Keluarkan nama pada konsol? Nama siapa?" :/"

Kaedah

Sebagai tambahan kepada pembolehubah, setiap kelas mempunyai kaedah. Kami akan membincangkannya dengan lebih terperinci dalam pelajaran yang berasingan, tetapi prinsip umum agak mudah. Kaedah mentakrifkan kefungsian kelas anda, iaitu objek yang boleh dilakukan oleh kelas anda. Anda sudah biasa dengan salah satu kaedah ini: kaedah main() . Tetapi, seperti yang anda ingat, kaedah utama adalah statik, yang bermaksud ia tergolong dalam keseluruhan kelas (logiknya sama dengan pembolehubah). Walau bagaimanapun, kaedah standard dan bukan statik hanya boleh dipanggil pada objek tertentu yang telah kami buat. Sebagai contoh, jika kita ingin menulis kelas kucing, kita perlu tahu apakah fungsi kucing dalam program kita. Pada premis itu, mari kita tulis beberapa kaedah untuk kucing kita:

public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Pounce!");
    }

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        smudge.sayMeow();
        smudge.jump();

    }
}
Semak ia! Sekarang kelas kami lebih hampir menyerupai kucing! Kini kami bukan sahaja mempunyai kucing dengan nama ("Smudge") dan umur (3). Dia juga boleh berkata meow dan melompat! Apakah jenis kucing tanpa "fungsi" itu? :) Kami mengambil objek tertentu (smudge) dan memanggil kaedah sayMeow() dan jump() nya . Mari lihat konsol: Meow! menerkam! Kucing sebenar! :)

Membuat kelas anda sendiri. Abstraksi

Pada masa hadapan, anda perlu menulis kelas anda sendiri. Apakah yang perlu anda perhatikan apabila anda menulisnya? Jika kita bercakap tentang pembolehubah, maka anda perlu menggunakan sesuatu yang dipanggil abstraksi. Abstraksi adalah salah satu daripada empat prinsip asas pengaturcaraan berorientasikan objek. Ia bermaksud mengekstrak ciri yang paling penting dan penting bagi sesuatu item, dan sebaliknya, mengetepikan ciri-ciri yang kecil atau tidak penting. Sebagai contoh, mari kita buat kabinet pemfailan untuk pekerja syarikat. Untuk mencipta objek pekerja, kami telah menulis Pekerjakelas. Apakah ciri-ciri yang menjadi deskriptor penting bagi seorang pekerja untuk kabinet pemfailan syarikat kami? Nama, tarikh lahir, SSN dan ID pekerja. Tetapi tidak mungkin kita memerlukan ketinggian pekerja, warna mata atau warna rambut untuk rekod pekerja syarikat. Syarikat tidak memerlukan maklumat ini. Jadi, dalam kelas Pekerja , kami mengisytiharkan pembolehubah berikut: String name , int age , int socialSecurityNumber , dan int employeeId. Dan kami meninggalkan maklumat yang tidak perlu (seperti warna mata). Dengan kata lain, kita mencipta abstraksi. Walau bagaimanapun, jika kita membuat kabinet pemfailan untuk agensi model, keadaan berubah secara mendadak. Ketinggian, warna mata dan warna rambut model adalah ciri penting, tetapi SSNnya sama sekali tidak relevan kepada kami. Jadi, dalam kelas Model , kita perlu mencipta pembolehubah berikut: Ketinggian rentetan , Rambut rentetan , Mata rentetan . Begitulah cara abstraksi berfungsi—mudah! :)

Pembina

Mari kita kembali kepada contoh kucing kita.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

    }
}
Lihat kod ini dan cuba cari apa yang salah dengan program kami. Program kami mempunyai kucing tanpa nama atau umur selama 2 jam! Sudah tentu, ini sememangnya salah. Pangkalan data klinik veterinar tidak sepatutnya termasuk kucing tanpa maklumat. Pada masa ini, kucing kami berada di bawah rahmat pengaturcara. Kami percaya bahawa dia tidak akan lupa untuk menyatakan nama dan umur, dan semuanya akan baik-baik saja. Jika dia terlupa, pangkalan data akan menghadapi masalah: kucing yang tidak dinamakan. Bagaimana kita boleh menyelesaikan masalah ini? Kita mesti menghalang kucing daripada dicipta tanpa nama dan umur. Di sinilah pembina datang untuk menyelamatkan. Mari kita berikan contoh:

public class Cat {

    String name;
    int age;

    // Constructor for the Cat class
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
Pada asasnya, pembina ialah templat untuk objek kelas. Dalam kes ini, kami menunjukkan bahawa dua argumen, String dan int , mesti ditentukan untuk setiap objek kucing . Jika kita cuba mencipta kucing tanpa nama sekarang, ia tidak akan berfungsi.

public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
Memandangkan kelas itu mempunyai pembina, pengkompil Java mengetahui rupa objek itu dan tidak membenarkan objek dibuat tanpa menyatakan hujah. Sekarang, mari kita siasat kata kunci ini, yang anda lihat di dalam pembina. Mudah juga. Kata kunci ini adalah untuk menunjukkan objek tertentu. Kod dalam pembina

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
boleh ditafsirkan hampir secara verbatim: "Nama kucing ini (yang kita cipta) = hujah yang diluluskan untuk parameter nama pembina. Umur kucing ini (yang kita cipta) = hujah yang diluluskan untuk pembina parameter umur." Selepas pembina dijalankan, anda boleh mengesahkan bahawa semua nilai yang diperlukan telah diberikan kepada kucing kami:

public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
Output konsol: Smudge 5 Apabila pembina dipanggil:

Cat smudge = new Cat("Smudge", 5);
Inilah yang sebenarnya berlaku secara dalaman:

this.name = "Smudge";
this.age = 5;
Dan nilai hujah yang dihantar kepada pembina telah diberikan kepada objek smudge (itulah yang dirujuk dalam kes ini). Malah, walaupun anda tidak mengisytiharkan mana-mana pembina dalam kelas, ia masih akan memanggil pembina! Tetapi bagaimana mungkin? О_О Kerana, semua kelas Java mempunyai apa yang dipanggil pembina lalai. Ia tidak memerlukan sebarang hujah, tetapi ia digunakan setiap kali anda mencipta sebarang objek dari mana-mana kelas.

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Pada pandangan pertama, ini mungkin tidak jelas. Kami mencipta objek, jadi apa? Di manakah pembina melakukan apa-apa di sini? Untuk melihatnya, mari tulis pembina kosong untuk kelas Cat secara eksplisit . Di dalamnya, kami akan mengeluarkan beberapa frasa ke konsol. Jika frasa dipaparkan, maka pembina telah dipanggil.

public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Output konsol: Kucing telah dibuat! Ada pengesahan. Pembina lalai sentiasa tidak kelihatan dalam kelas anda. Tetapi anda perlu tahu satu lagi perkara mengenainya. Pembina lalai dihapuskan daripada kelas sebaik sahaja anda mencipta pembina dengan hujah. Malah, kita telah melihat bukti ini di atas. Ia berada dalam kod ini:

public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
Kami tidak boleh mencipta Cat tanpa nama dan umur, kerana kami mengisytiharkan pembina Cat dengan parameter rentetan dan int. Ini menyebabkan pembina lalai segera hilang dari kelas. Jadi pastikan anda ingat bahawa jika anda memerlukan beberapa pembina dalam kelas anda, termasuk pembina tanpa hujah, anda perlu mengisytiharkannya secara berasingan. Klinik kami ingin beramal dan membantu anak kucing gelandangan yang tidak diketahui namanya dan umur. Kemudian kod kami sepatutnya kelihatan seperti ini:

public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {
        
        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
Memandangkan kita telah menentukan pembina lalai yang jelas, kita boleh mencipta kedua-dua jenis kucing. Dalam pembina, anda boleh menetapkan nilai secara langsung. Anda tidak perlu selalu mengambilnya dari hujah. Sebagai contoh, kami boleh melabel semua kucing jalanan dalam pangkalan data menggunakan "Kucing jalanan No. <count>" sebagai templat. :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + count;
    }

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

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
Kami mempunyai pembolehubah kiraan , yang mengira kucing jalanan kami. Setiap kali pembina lalai dilaksanakan, kami meningkatkan kiraan sebanyak 1 dan melampirkan nombor ini pada nama kucing. Susunan hujah adalah sangat penting untuk pembina. Mari kita tukar nama dan hujah umur yang diserahkan kepada pembina kami.

public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 10); // Error!
    }
}
Kami mendapat ralat! Pembina dengan jelas menetapkan bahawa apabila objek Cat dicipta, ia mesti diluluskan nombor dan rentetan, dalam susunan ini. Jadi, kod kami tidak berfungsi. Pastikan anda mengingati dan menghormati peraturan ini apabila mengisytiharkan kelas anda sendiri:

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

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Ini adalah dua pembina yang sama sekali berbeza! Sekarang, selesaikan beberapa tugasan untuk mengukuhkan pemahaman anda tentang bahan tersebut. :)
  1. Muzium Antikuiti.

    Tugas anda ialah mereka bentuk kelas Artifak .
    Terdapat tiga jenis artifak yang disimpan di muzium.
    Kami tidak tahu apa-apa tentang jenis pertama kecuali nombor siri yang diberikan oleh muzium (contohnya: 212121).
    Untuk jenis kedua, kami mengetahui nombor siri dan budaya yang menciptanya (contohnya: 212121, "Aztec").
    Untuk jenis ketiga, kita tahu nombor siri, budaya yang menciptanya dan abad ia dicipta (contohnya: 212121, "Aztec", 12).

    Buat kelas Artifak yang menerangkan barang antik yang disimpan di muzium dan tulis set pembina yang diperlukan untuk kelas tersebut. Kemudian, dalam kaedah main() , buat satu artifak setiap jenis.

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
    
  2. Laman web dating

    Mari buat pangkalan data pengguna untuk tapak web temu janji.
    Tetapi inilah masalahnya: anda terlupa susunan hujah yang diperlukan, dan tiada dokumentasi teknikal tersedia.
    Reka kelas Pengguna , yang akan mempunyai medan berikut: nama ( String ), umur ( pendek ), dan ketinggian ( int ).
    Cipta bilangan pembina yang sesuai, supaya nama, umur dan ketinggian boleh ditentukan dalam sebarang susunan.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
Untuk mengukuhkan perkara yang anda pelajari, kami cadangkan anda menonton pelajaran video daripada Kursus Java kami
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION