JavaRush /Blog Java /Random-MS /Pengenalan kepada kelas: menulis kelas anda sendiri, pemb...

Pengenalan kepada kelas: menulis kelas anda sendiri, pembina

Diterbitkan dalam kumpulan
hello! Hari ini kita akan bercakap tentang kelas di Jawa. Kelas boleh dikatakan sebagai teras pengaturcaraan Java. Apabila anda menjadi seorang pengaturcara, tugas utama anda ialah menulis kelas anda sendiri dengan fungsi yang berbeza. Pengenalan kepada kelas: menulis kelas anda sendiri, pembina - 1Mari kita fikirkan apakah perkara ini dan bagaimana ia berfungsi :) Seperti yang anda sedia maklum, Java ialah bahasa pengaturcaraan berorientasikan objek. Semua program terdiri daripada objek yang entah bagaimana bersambung antara satu sama lain. Kelas pada asasnya adalah templat untuk objek. Ia menentukan bagaimana objek akan kelihatan dan apakah fungsi yang akan ada. Setiap objek ialah objek bagi sesetengah kelas . Mari lihat contoh paling mudah:
public class Cat {

    String name;
    int age;

}
Katakan kita sedang menulis program, dan dalam program ini kita memerlukan kucing untuk sesuatu (contohnya, kita mempunyai klinik veterinar dengan keupayaan untuk membuat temu janji dalam talian). Kami mencipta kelas Catdan menetapkan dua pembolehubah untuknya - rentetan namedan nombor age. Pembolehubah kelas sedemikian dipanggil medan . Pada asasnya, ini adalah templat untuk semua kucing yang akan kami buat pada masa hadapan. Setiap kucing (objek kelas Cat) akan mempunyai dua pembolehubah - nama dan umur.
public class Cat {

    String name;
    int age;

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

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
Itulah cara ia berfungsi! Kami mencipta kucing, memberikannya nama dan umur, dan mengeluarkan semuanya kepada konsol. Tiada apa-apa yang rumit :) Kelas paling kerap menerangkan objek dan fenomena dunia sekeliling. Kucing, meja, orang, kilat, halaman buku, roda - semua ini akan dibuat dalam program anda menggunakan kelas berasingan. Sekarang mari kita lihat pembolehubah yang kita buat dalam kelas Cat. Ini dipanggil medan, atau pembolehubah contoh . Nama itu, sebenarnya, mendedahkan keseluruhan intipati mereka. Setiap contoh (objek) kelas akan mempunyai pembolehubah ini Cat. Setiap kucing yang kita cipta akan mempunyai pembolehubahnya sendiri namedan sendiri age. Ia logik, secara umum: dengan kucing sebenar semuanya adalah sama :) Selain pembolehubah contoh, terdapat yang lain - pembolehubah kelas atau yang statik. Mari tambah kepada contoh kami:
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
Output konsol:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Sekarang kita mempunyai pembolehubah baru dalam kelas kita - count(kuantiti). Dia bertanggungjawab mengira kucing yang dicipta. Setiap kali kami mencipta kucing dalam kaedah utama, kami menambah pembolehubah ini sebanyak 1. Pembolehubah ini ditetapkan oleh kata kunci statik . Ini bermakna ia tergolong dalam kelas , dan bukan objek khusus kelas. Yang, sudah tentu, adalah logik: jika setiap kucing harus mempunyai namanya sendiri, maka kita memerlukan satu kaunter kucing untuk semua. Ini betul-betul apa yang boleh anda capai oleh perkataan statik - countpembolehubah yang sama untuk semua kucing. Sila ambil perhatian: apabila kami mencetaknya ke konsol, kami tidak menulis barsik.countatau vasia.count. Dia bukan ahli Barsik atau Vasya - dia tergolong dalam seluruh kelas Cat. Oleh itu, ia adalah mudah count. Anda juga boleh menulis Cat.count- itu juga betul. nameIni tidak akan berfungsi dengan mengeluarkan pembolehubah ke konsol :
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
Ralat! nameSetiap kucing ada sendiri. Di sinilah pengkompil menjadi keliru. "Keluarkan nama ke konsol? Nama siapa itu? :/"

Kaedah

Sebagai tambahan kepada pembolehubah, setiap kelas mempunyai kaedah. Kami akan membincangkannya dalam kuliah berasingan dengan lebih terperinci, tetapi perkara umum agak mudah. Kaedah ialah kefungsian kelas anda; apakah objek kelas ini boleh lakukan. Anda sudah biasa dengan salah satu kaedah - ini ialah main(). Tetapi kaedah main, seperti yang anda ingat, adalah statik - iaitu, ia tergolong dalam keseluruhan kelas (logiknya sama dengan pembolehubah). Dan kaedah biasa, bukan statik hanya boleh dipanggil pada objek tertentu yang telah kami buat. Sebagai contoh, jika kita ingin menulis kelas untuk kucing, kita perlu memahami fungsi yang sepatutnya ada pada kucing dalam program kita. Berdasarkan ini, mari kita tulis beberapa kaedah untuknya:
public class Cat {

    String name;
    int age;

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

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

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

        barsik.sayMeow();
        barsik.jump();

    }
}
Nah, sekarang kelas kami lebih seperti penerangan tentang kucing sebenar! Kini kami bukan sahaja mempunyai kucing bernama Barsik dengan nama dan umur. Dia juga boleh mengeong dan melompat! Apakah jenis kucing yang ada tanpa "fungsi" sedemikian :) Kami mengambil objek tertentu - barsik, dan memanggil kaedahnya sayMeow()dan jump(). Kami melihat konsol:

Мяу!
Прыг-скок!
Kucing sebenar! :)

Membuat kelas anda sendiri. Abstraksi

Pada masa hadapan anda perlu menulis kelas anda sendiri. Apakah yang perlu anda perhatikan semasa menulisnya? Jika kita bercakap tentang pembolehubah, anda perlu menggunakan sesuatu yang dipanggil abstraction . Abstraksi adalah salah satu daripada empat prinsip asas pengaturcaraan berorientasikan objek. Ia melibatkan menyerlahkan ciri utama yang paling ketara bagi sesuatu objek , dan begitu juga sebaliknya - membuang yang sekunder, yang tidak penting. Sebagai contoh, kami sedang mencipta fail pekerja syarikat. Untuk mencipta objek pekerja, kami menulis kelas Employee. Apakah ciri yang penting untuk menggambarkan pekerja dalam fail syarikat? Nama penuh, tarikh lahir, nombor keselamatan sosial, nombor pengenalan cukai. Tetapi tidak mungkin kita memerlukan ketinggian, mata dan warna rambutnya dalam kad pekerja syarikat. Syarikat tidak memerlukan maklumat ini. Oleh itu, untuk kelas Employeekami akan menetapkan pembolehubah String name, int age, int socialInsuranceNumberdan int taxNumber, dan kami akan meninggalkan maklumat yang tidak diperlukan untuk kami (seperti warna mata) dan mengabstrakkannya . Tetapi jika kita mencipta katalog model foto untuk agensi model, keadaan berubah secara mendadak. Untuk menerangkan model fesyen, ketinggian, warna mata dan warna rambut adalah sangat penting bagi kami, tetapi nombor TIN sama sekali tidak penting bagi kami. Oleh itu, dalam kelas Modelkita perlu mencipta pembolehubah int height, String hair, String eyes. Beginilah cara abstraksi berfungsi, ia mudah! :)

Pembina

Mari kita kembali kepada contoh kucing kita.
public class Cat {

    String name;
    int age;

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

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
Lihat kod ini dan cuba teka apa yang salah dengan program kami. Selama dua jam dalam program kami terdapat seekor kucing tanpa nama atau umur! Sudah tentu, ini adalah salah sama sekali. Seharusnya tiada kucing dalam pangkalan data klinik veterinar tanpa maklumat tentang mereka. Sekarang kita serahkan kepada pengaturcara. Jika dia tidak lupa menyatakan nama dan umurnya, semuanya akan baik-baik saja. Jika dia terlupa, akan ada ralat dalam pangkalan data, kucing yang tidak dikenali. Bagaimana kita boleh menyelesaikan masalah ini? Ia adalah perlu untuk melarang penciptaan kucing tanpa nama dan umur. Di sinilah fungsi pembina membantu kami . Berikut ialah contoh:
public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
Pembina pada asasnya adalah templat untuk objek kelas. Dalam kes ini, kami menentukan bahawa untuk setiap objek catdua argumen mesti ditentukan - rentetan dan nombor. Jika sekarang kita cuba mencipta kucing tanpa nama, kita tidak akan berjaya.
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 barsik = new Cat(); //error!
    }
}
Sekarang bahawa kelas mempunyai pembina, pengkompil Java mengetahui rupa objek itu dan tidak akan membenarkan objek dibuat tanpa hujah yang dinyatakan di dalamnya. Sekarang mari kita lihat kata kunci thisyang anda lihat di dalam pembina. Semuanya mudah dengan dia juga. "ini" dalam bahasa Inggeris bermaksud "ini, ini". Iaitu, perkataan ini menunjukkan objek tertentu. Kod dalam pembina
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
boleh diterjemahkan hampir secara literal: " nama untuk kucing ini (yang kami cipta) = argumen nama yang dinyatakan dalam pembina. umur untuk kucing ini (yang kami cipta) = hujah umur yang dinyatakan dalam pembina." Selepas pembina menyala, anda boleh menyemak sama ada kucing kami telah diberikan semua nilai yang diperlukan:
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 barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
Output konsol:

Барсик
5
Apabila pembina telah selesai:
Cat barsik = new Cat("Barsik", 5);
Perkara berikut sebenarnya berlaku di dalam:
this.name = "Barsik";
this.age = 5;
Dan objek barsik(ia this) telah diberikan nilai daripada hujah pembina. Malah, jika anda tidak menentukan pembina dalam kelas, ia masih akan memecat pembina ! Tetapi bagaimana ini mungkin? O_O Faktanya ialah dalam Java semua kelas mempunyai apa yang dipanggil pembina lalai . Ia tidak mempunyai sebarang hujah, tetapi ia menyala setiap kali sebarang objek dari mana-mana kelas dicipta.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Pada pandangan pertama ini tidak ketara. Nah, kami mencipta objek dan menciptanya, di manakah kerja pereka bentuk? Untuk melihat ini, mari kita tulis Catpembina kosong untuk kelas dengan tangan kita sendiri, dan di dalamnya kita akan mengeluarkan beberapa frasa ke konsol. Jika ia dipaparkan, maka pembina telah berfungsi.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Output konsol:

Создали кота!
Berikut adalah pengesahannya. Pembina lalai sentiasa tidak kelihatan dalam kelas anda. Tetapi anda perlu mengetahui satu lagi cirinya. Pembina lalai hilang daripada kelas apabila anda mencipta beberapa pembina dengan hujah. Buktinya, sebenarnya, kita sudah lihat di atas. Di sini 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 barsik = new Cat(); //error!
    }
}
Kami tidak boleh mencipta kucing tanpa nama dan umur kerana kami menentukan pembina untuk Cat: rentetan + nombor. Pembina lalai hilang dari kelas sejurus selepas ini. Oleh itu, pastikan anda ingat: jika anda memerlukan beberapa pembina dalam kelas anda, termasuk yang kosong, anda perlu menciptanya secara berasingan . Sebagai contoh, klinik veterinar kami ingin beramal dan membantu kucing gelandangan, yang namanya dan umurnya tidak kami ketahui. Kemudian kod kami sepatutnya kelihatan seperti ini:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
Memandangkan kita telah menetapkan pembina lalai secara eksplisit, kita boleh mencipta kedua-dua jenis kucing. Dalam pembina, anda boleh menetapkan nilai secara eksplisit, dan bukan hanya mengambilnya dari hujah. Sebagai contoh, kita boleh merekodkan semua kucing jalanan dalam pangkalan data di bawah nama "Nombor kucing jalanan...":
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + 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 countiaitu kaunter kucing jalanan. Setiap kali kami melaksanakan pembina lalai, kami menambahnya sebanyak 1 dan menetapkan nombor itu sebagai nama kucing. Bagi pembina, susunan hujah adalah sangat penting. Mari kita tukar nama dan hujah umur dalam 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 barsik = new Cat("Barsik", 10); //error!
    }
}
Ralat! Pembina menerangkan dengan jelas: apabila mencipta objek, Catia mesti diluluskan nombor dan rentetan, dalam susunan itu . Itulah sebabnya kod kami tidak berfungsi. Pastikan anda mengingati perkara ini dan ingat perkara ini semasa membuat 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 pereka yang sama sekali berbeza! Sekarang selesaikan beberapa masalah untuk menyatukan bahan :)
  • Muzium Antikuiti.
Tugas anda adalah untuk mereka bentuk kelas Artifact. Artifak yang disimpan di dalam muzium ada tiga jenis. Yang pertama ialah yang tidak diketahui kecuali nombor siri yang diberikan oleh muzium (contohnya: 212121). Yang kedua ialah nombor siri dan budaya yang digunakan untuk mencipta nombor itu diketahui (contohnya: 212121, "Aztec"). Jenis ketiga ialah tentang nombor siri yang diketahui, budaya yang digunakan untuk menciptanya dan umur sebenar penciptaannya (contohnya: 212121, “Aztecs”, 12). Buat kelas Artifactyang menerangkan barang antik yang disimpan di muzium, dan tulis bilangan pembina yang diperlukan untuknya. Dalam kaedah main(), cipta satu artifak bagi setiap jenis.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • Laman web mesyuarat
Anda sedang mencipta pangkalan data pengguna untuk tapak temu janji. Tetapi masalahnya ialah anda terlupa dalam susunan yang mereka perlu dinyatakan, dan anda tidak mempunyai spesifikasi teknikal di tangan. Reka kelas Useryang akan mempunyai medan - nama ( String), umur ( short) dan ketinggian ( int). Cipta bilangan pembina yang diperlukan untuknya supaya nama, umur dan ketinggian boleh ditentukan dalam sebarang susunan.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION