CodeGym /Java Blog /Acak /Kelas Java: menulis kelas Anda sendiri, konstruktor
John Squirrels
Level 41
San Francisco

Kelas Java: menulis kelas Anda sendiri, konstruktor

Dipublikasikan di grup Acak
Hai! Hari ini kita akan berbicara tentang kelas di Jawa. Anda bisa mengatakan bahwa kelas membentuk landasan pemrograman Java. Ketika Anda menjadi seorang programmer, hampir seluruh pekerjaan Anda adalah menulis kelas Anda sendiri yang memiliki berbagai fungsi. Mari kita lihat apa artinya dan bagaimana cara kerjanya. :) Seperti yang Anda ketahui, Java adalah bahasa pemrograman berorientasi objek. Semua program terdiri dari objek yang dalam satu atau lain cara terkait satu sama lain. Kelas pada dasarnya adalah templat untuk suatu objek. Ini menentukan seperti apa objek itu nantinya dan fungsi apa yang akan dimilikinya. Setiap objek adalah objek dari beberapa kelas. Pertimbangkan contoh yang sangat sederhana ini:

public class Cat {

    String name;
    int age;

}
Katakanlah kita sedang menulis program yang melibatkan kucing karena suatu alasan (misalnya, kita memiliki klinik hewan yang menawarkan akses ke akun online). Kami telah membuat kelas Cat , dan mendeklarasikan dua variabel di dalamnya: String name dan int age . Variabel anggota ini disebut field. Intinya, ini adalah template untuk semua kucing yang akan kita buat di masa mendatang. Setiap objek Cat akan memiliki dua variabel: nama dan usia.

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 kerjanya! Kami membuat kucing, memberinya nama dan umur, dan menampilkan semuanya di konsol. Sepotong kue. :) Lebih sering daripada tidak, kelas menggambarkan hal-hal dan fenomena di dunia nyata. Seekor kucing, meja, seseorang, petir, halaman buku, roda—Anda akan membuat semua hal ini dalam program Anda menggunakan kelas individual. Untuk saat ini, mari fokus pada variabel yang kita deklarasikan di kelas Cat . Mereka disebut bidang, atau variabel instan. Nama mereka benar-benar mengatakan itu semua. Setiap instance (atau objek) dari kelas Cat akan memiliki variabel-variabel ini. Setiap kucing yang kita buat akan memiliki variabel nama dan umurnya sendirivariabel. Ini masuk akal — pada dasarnya seperti halnya dengan kucing sungguhan. :) Selain variabel instan, ada juga variabel kelas (variabel statis). Mari 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);
    }
}
Keluaran konsol: Kami membuat kucing bernama Smudge. Usianya 3 tahun. Kami menciptakan seekor kucing bernama Fluffy. Umurnya 5 Jumlah total kucing = 2 Sekarang kelas kita memiliki variabel baru yang disebut count. Ini bertanggung jawab untuk menghitung kucing yang dibuat. Setiap kali kami membuat kucing di mainmetode, kami meningkatkan variabel ini dengan 1. Variabel ini dideklarasikan menggunakan kata kunci statis. Itu berarti itu milik kelas, bukan objek kelas tertentu. Yang, tentu saja, masuk akal: setiap nama kucing adalah milik kucing tertentu, tetapi kita membutuhkan satu penghitung kucing yang berlaku untuk semuanya. Inilah yang dicapai oleh kata kunci statis: ini menjadikan variabel hitungan sebagai variabel tunggal untuk semua kucing. Catatan: saat kita menampilkan variabel, kita tidak menggunakan smudge.count atau fluffy.count. Itu bukan milik Smudge atau Fluffy; itu milik seluruh kelas Cat . Itu sebabnya itu hanya menghitung. Anda juga bisa menulis Cat.count. Itu juga benar. Saat menampilkan variabel nama, kami tidak akan melakukan hal 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 kesalahan! Setiap kucing memiliki namanya sendiri. Kompiler menjadi bingung di sini. "Keluarkan nama ke konsol? Nama siapa?" :/"

Metode

Selain variabel, setiap kelas memiliki metode. Kami akan membicarakannya secara lebih rinci dalam pelajaran terpisah, tetapi prinsip umumnya cukup sederhana. Metode menentukan fungsionalitas kelas Anda, yaitu apa yang dapat dilakukan objek kelas Anda. Anda sudah familiar dengan salah satu metode ini: metode main() . Tapi, seperti yang mungkin Anda ingat, metode utama adalah statis, yang artinya milik seluruh kelas (logikanya sama dengan variabel). Namun, metode standar dan non-statis hanya dapat dipanggil pada objek tertentu yang telah kita buat. Misalnya, jika kita ingin menulis kelas kucing, kita perlu mengetahui fungsi apa yang harus dimiliki kucing dalam program kita. Atas dasar itu, mari tulis beberapa metode 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();

    }
}
Coba lihat! Sekarang kelas kami jauh lebih mirip dengan kucing! Sekarang kami tidak hanya memiliki kucing dengan nama ("Smudge") dan usia (3). Dia juga bisa mengatakan mengeong dan melompat! Kucing seperti apa jadinya tanpa "fungsi" itu? :) Kami mengambil objek tertentu (noda) dan memanggil metode sayMeow() dan jump() . Mari kita lihat konsolnya: Meong! Menerkam! Seekor kucing sungguhan! :)

Membuat kelas Anda sendiri. Abstraksi

Di masa mendatang, Anda harus menulis kelas Anda sendiri. Apa yang perlu Anda perhatikan saat menulisnya? Jika kita berbicara tentang variabel, maka Anda harus menggunakan sesuatu yang disebut abstraksi. Abstraksi adalah salah satu dari empat prinsip dasar pemrograman berorientasi objek. Itu berarti mengekstraksi karakteristik yang paling penting dan signifikan dari suatu item, dan sebaliknya, mengesampingkan yang minor atau tidak signifikan. Misalnya, mari buat lemari arsip untuk karyawan perusahaan. Untuk membuat objek karyawan, kami telah menulis sebuah Karyawankelas. Karakteristik apa yang menjadi deskriptor penting dari seorang karyawan untuk lemari arsip perusahaan kita? Nama, tanggal lahir, SSN, dan ID karyawan. Tapi sepertinya kita tidak membutuhkan tinggi badan, warna mata, atau warna rambut karyawan untuk catatan karyawan perusahaan. Perusahaan tidak membutuhkan informasi ini. Jadi, di kelas Karyawan , kami mendeklarasikan variabel berikut: Nama string , int usia , int socialSecurityNumber , dan int employeeId. Dan kami mengabaikan informasi yang tidak perlu (seperti warna mata). Dengan kata lain, kami membuat abstraksi. Namun, jika kita membuat lemari arsip untuk agensi model, situasinya berubah drastis. Tinggi model, warna mata, dan warna rambut adalah karakteristik penting, tetapi SSN-nya sama sekali tidak relevan bagi kami. Jadi, di kelas Model , kita perlu membuat variabel berikut: Tinggi string , Rambut string , Mata string . Begitulah cara kerja abstraksi—mudah! :)

Konstruktor

Mari kembali ke 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 kode ini dan coba cari tahu apa yang salah dengan program kita. Program kami memiliki kucing tanpa nama atau usia selama 2 jam! Tentu saja, ini pada dasarnya salah. Database klinik hewan tidak boleh menyertakan kucing tanpa informasi. Saat ini, kucing kita berada di tangan programmer. Kami percaya bahwa dia tidak akan lupa menyebutkan nama dan usia, dan semuanya akan baik-baik saja. Jika dia lupa, database akan bermasalah: kucing tidak disebutkan namanya. Bagaimana kita bisa memecahkan masalah ini? Entah bagaimana kita harus mencegah kucing diciptakan tanpa nama dan usia. Di sinilah konstruktor datang untuk menyelamatkan. Mari kita beri 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 dasarnya, konstruktor adalah templat untuk objek kelas. Dalam hal ini, kami menunjukkan bahwa dua argumen, sebuah String dan sebuah int , harus ditentukan untuk setiap objek cat . Jika kami mencoba membuat kucing tanpa nama sekarang, itu tidak akan berhasil.

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!
    }
}
Sekarang kelas memiliki konstruktor, kompiler Java tahu seperti apa objek seharusnya, dan tidak mengizinkan objek dibuat tanpa menentukan argumen. Sekarang, mari selidiki kata kunci this, yang Anda lihat di dalam konstruktor. Sederhana juga. Kata kunci ini untuk menunjukkan objek tertentu. Kode di konstruktor

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
dapat ditafsirkan hampir secara verbatim: "Nama kucing ini (yang kita buat) = argumen yang diteruskan untuk parameter nama konstruktor. Usia kucing ini (yang kita buat) = argumen yang diteruskan untuk konstruktor parameter usia." Setelah konstruktor berjalan, Anda dapat memverifikasi bahwa semua nilai yang diperlukan telah ditetapkan ke 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);
    }
}
Keluaran konsol: Noda 5 Saat konstruktor dipanggil:

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

this.name = "Smudge";
this.age = 5;
Dan nilai argumen yang diteruskan ke konstruktor ditugaskan ke objek noda (itulah yang dimaksud dalam kasus ini). Faktanya, bahkan jika Anda tidak mendeklarasikan konstruktor apa pun di dalam sebuah kelas, ia tetap akan memanggil konstruktor! Tapi bagaimana itu mungkin? О_О Karena, semua kelas Java memiliki apa yang disebut konstruktor default. Tidak membutuhkan argumen apa pun, tetapi dipanggil setiap kali Anda membuat objek apa pun dari kelas apa pun.

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Sekilas, ini mungkin tidak terlihat jelas. Kami membuat objek, jadi apa? Di mana konstruktor melakukan sesuatu di sini? Untuk melihatnya, mari kita tulis konstruktor kosong untuk kelas Cat secara eksplisit . Di dalamnya, kami akan mengeluarkan beberapa frase ke konsol. Jika frase ditampilkan, maka konstruktor 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: Seekor kucing telah dibuat! Ada konfirmasi. Konstruktor default selalu hadir secara tidak terlihat di kelas Anda. Tetapi Anda perlu tahu satu hal lagi tentang itu. Konstruktor default dihilangkan dari kelas setelah Anda membuat konstruktor dengan argumen. Faktanya, kami telah melihat buktinya di atas. Itu ada dalam kode 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 dapat membuat Cat tanpa nama dan usia, karena kami mendeklarasikan konstruktor Cat dengan parameter string dan int. Ini menyebabkan konstruktor default segera menghilang dari kelas. Jadi pastikan untuk mengingat bahwa jika Anda memerlukan beberapa konstruktor di kelas Anda, termasuk konstruktor tanpa argumen, Anda harus mendeklarasikannya secara terpisah. Klinik kami ingin melakukan perbuatan baik dan membantu anak kucing tunawisma yang nama dan usianya tidak diketahui. Maka kode kita akan terlihat 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();
    }
}
Sekarang kami telah menentukan konstruktor default yang eksplisit, kami dapat membuat kedua jenis kucing. Di konstruktor, Anda dapat menetapkan nilai secara langsung. Anda tidak harus selalu mengambilnya dari argumen. Misalnya, kita dapat melabeli semua kucing jalanan di database menggunakan "Kucing jalanan No. <hitungan>" 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 memiliki variabel hitungan , yang menghitung kucing jalanan kami. Setiap kali konstruktor default dijalankan, kami menambah hitungan dengan 1 dan melampirkan nomor ini ke nama kucing. Urutan argumen sangat penting untuk konstruktor. Mari kita tukar argumen name dan age yang diteruskan ke konstruktor kita.

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 kesalahan! Konstruktor dengan jelas menetapkan bahwa saat objek Cat dibuat, objek tersebut harus diberi nomor dan string, dalam urutan ini. Jadi, kode kita tidak berfungsi. Pastikan untuk mengingat dan menghormati aturan ini saat mendeklarasikan 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 konstruktor yang sama sekali berbeda! Sekarang, selesaikan beberapa tugas untuk memantapkan pemahaman Anda tentang materi. :)
  1. Museum Purbakala.

    Tugas Anda adalah merancang kelas Artifact .
    Ada tiga jenis artefak yang disimpan di museum.
    Kami tidak tahu apa-apa tentang tipe pertama kecuali nomor seri yang diberikan oleh museum (misalnya: 212121).
    Untuk tipe kedua, kita mengetahui nomor seri dan budaya yang membuatnya (misalnya: 212121, "Aztec").
    Untuk tipe ketiga, kita mengetahui nomor seri, budaya yang membuatnya, dan abad pembuatannya (misalnya: 212121, "Aztec", 12).

    Buat kelas Artifact yang mendeskripsikan barang antik yang disimpan di museum, dan tulis kumpulan konstruktor yang diperlukan untuk kelas tersebut. Kemudian, dalam metode main() , buat satu artefak dari setiap jenis.

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

    Mari buat database pengguna untuk situs web kencan.
    Tapi inilah masalahnya: Anda lupa urutan argumen yang diperlukan, dan tidak ada dokumentasi teknis yang tersedia.
    Rancang kelas Pengguna , yang akan memiliki bidang-bidang berikut: nama ( String ), umur ( pendek ), dan tinggi ( int ).
    Buat jumlah konstruktor yang sesuai, sehingga nama, usia, dan tinggi dapat ditentukan dalam urutan apa pun.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
Untuk memperkuat apa yang Anda pelajari, kami sarankan Anda menonton video pelajaran dari Kursus Java kami
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION