Java ialah bahasa berorientasikan objek. Ini bermakna anda perlu menulis program Java menggunakan paradigma berorientasikan objek. Dan paradigma ini melibatkan penggunaan objek dan kelas dalam program anda. Mari cuba gunakan contoh untuk memahami apakah kelas dan objek, dan cara menggunakan prinsip OOP asas (abstraksi, pewarisan, polimorfisme dan enkapsulasi) dalam amalan.

Apakah objek?

Dunia yang kita diami terdiri daripada objek. Melihat sekeliling, kita dapat melihat bahawa kita dikelilingi oleh rumah, pokok, kereta, perabot, pinggan mangkuk dan komputer. Semua perkara ini adalah objek, dan setiap daripada mereka mempunyai satu set ciri, tingkah laku, dan tujuan tertentu. Kami terbiasa dengan objek, dan kami sentiasa menggunakannya untuk tujuan yang sangat khusus. Sebagai contoh, jika kita perlu ke tempat kerja, kita menggunakan kereta. Kalau nak makan, kita guna pinggan mangkuk. Dan jika kita ingin berehat, kita mencari sofa yang selesa. Manusia sudah biasa berfikir dari segi objek untuk menyelesaikan masalah dalam kehidupan seharian. Ini adalah salah satu sebab mengapa objek digunakan dalam pengaturcaraan. Pendekatan ini dipanggil pengaturcaraan berorientasikan objek. Mari kita beri contoh. Bayangkan anda telah membangunkan telefon baharu dan ingin memulakan pengeluaran besar-besaran. Sebagai pembangun telefon, anda tahu untuk kegunaannya, cara ia berfungsi, dan apakah bahagiannya (badan, mikrofon, pembesar suara, wayar, butang, dll.). Apatah lagi, hanya anda yang tahu cara menyambung bahagian ini. Tetapi anda tidak bercadang untuk membuat telefon secara peribadi — anda mempunyai sekumpulan pekerja untuk melakukan ini. Untuk menghapuskan keperluan untuk menerangkan berulang kali cara menyambungkan bahagian telefon, dan untuk memastikan semua telefon dibuat dengan cara yang sama, sebelum anda mula menghasilkannya, anda perlu membuat lukisan yang menerangkan cara telefon disusun. Dalam OOP, kami memanggil penerangan, lukisan, rajah atau templat sebegitu sebagai kelas. Ia membentuk asas untuk mencipta objek apabila program sedang berjalan. Kelas ialah perihalan objek jenis tertentu — seperti templat biasa yang terdiri daripada medan, kaedah dan pembina. Objek ialah contoh kelas.

Abstraksi

Sekarang mari kita fikirkan bagaimana kita boleh beralih daripada objek di dunia nyata kepada objek dalam program. Kami akan menggunakan telefon sebagai contoh. Alat komunikasi ini mempunyai sejarah yang menjangkau lebih daripada 100 tahun. Telefon moden adalah peranti yang jauh lebih kompleks daripada pendahulunya pada abad ke-19. Apabila menggunakan telefon, kami tidak memikirkan organisasinya dan proses yang berlaku di dalamnya. Kami hanya menggunakan fungsi yang disediakan oleh pembangun telefon: butang atau skrin sentuh untuk memasukkan nombor telefon dan membuat panggilan. Salah satu antara muka telefon pertama ialah engkol yang perlu diputar untuk membuat panggilan. Sudah tentu, ini tidak begitu mudah. Tetapi ia memenuhi fungsinya dengan sempurna. Jika anda membandingkan telefon yang paling moden dan yang pertama, anda boleh segera mengenal pasti fungsi yang paling penting untuk peranti akhir abad ke-19 dan untuk telefon pintar moden. Mereka adalah keupayaan untuk membuat panggilan dan keupayaan untuk menerima panggilan. Sebenarnya, inilah yang menjadikan telefon sebagai telefon, dan bukan sesuatu yang lain. Kini baru sahaja menggunakan prinsip OOP: kenal pasti ciri dan maklumat terpenting objek. Prinsip ini dipanggil abstraksi. Dalam OOP, abstraksi juga boleh ditakrifkan sebagai kaedah mewakili elemen tugas dunia sebenar sebagai objek dalam program. Abstraksi sentiasa dikaitkan dengan generalisasi sifat-sifat tertentu objek, jadi perkara utama adalah untuk memisahkan maklumat yang bermakna daripada yang tidak penting dalam konteks tugas yang sedang dijalankan. Selain itu, terdapat beberapa tahap abstraksi. jom' s cuba gunakan prinsip pengabstrakan pada telefon kami. Sebagai permulaan, kami akan mengenal pasti jenis telefon yang paling biasa — daripada telefon pertama hingga telefon masa kini. Sebagai contoh, kita boleh mewakilinya dalam bentuk rajah dalam Rajah 1. Prinsip OOP - 2Menggunakan abstraksi, kini kita boleh mengenal pasti maklumat umum dalam hierarki objek ini: objek abstrak umum (telefon), ciri umum telefon (cth tahun penciptaannya), dan antara muka biasa (semua telefon boleh menerima dan membuat panggilan). Begini rupanya di Jawa:

public abstract class AbstractPhone {
    private int year;

    public AbstractPhone(int year) {
        this.year = year;
    }
    public abstract void call(int outgoingNumber);
    public abstract void ring(int incomingNumber);
}
Dalam program, kami boleh mencipta jenis telefon baharu menggunakan kelas abstrak ini dan menggunakan prinsip asas OOP yang lain, yang akan kami terokai di bawah.

Enkapsulasi

Dengan abstraksi, kami mengenal pasti perkara biasa untuk semua objek. Tetapi setiap jenis telefon adalah unik, entah bagaimana berbeza daripada yang lain. Dalam program, bagaimanakah kita melukis sempadan dan mengenal pasti keperibadian ini? Bagaimanakah kita membuatnya supaya tiada sesiapa boleh secara tidak sengaja atau sengaja memecahkan telefon kita atau cuba menukar satu model kepada model lain? Di dunia nyata, jawapannya adalah jelas: anda perlu meletakkan semua bahagian dalam sarung telefon. Lagipun, jika anda tidak — sebaliknya meninggalkan semua bahagian dalaman telefon dan wayar penyambung di bahagian luar — sesetengah penguji yang ingin tahu pasti mahu "memperbaiki" telefon kami. Untuk mengelakkan penyimpangan sedemikian, prinsip enkapsulasi digunakan dalam reka bentuk dan operasi objek. Prinsip ini menyatakan bahawa atribut dan tingkah laku objek digabungkan dalam satu kelas, objek' pelaksanaan dalaman disembunyikan daripada pengguna, dan antara muka awam disediakan untuk bekerja dengan objek. Tugas pengaturcara adalah untuk menentukan atribut dan kaedah objek yang mana harus tersedia untuk akses awam, dan yang merupakan butiran pelaksanaan dalaman yang sepatutnya tidak boleh diakses.

Enkapsulasi dan kawalan akses

Katakan bahawa maklumat tentang telefon (tahun pengeluarannya atau logo pengeluar) diukir di belakangnya apabila ia dibuat. Maklumat (keadaannya) adalah khusus untuk model tertentu ini. Kita boleh katakan bahawa pengilang memastikan maklumat ini tidak berubah — tidak mungkin sesiapa akan berfikir untuk mengalih keluar ukiran itu. Dalam dunia Java, kelas menerangkan keadaan objek masa depan menggunakan medan, dan tingkah laku mereka diterangkan menggunakan kaedah. Akses kepada keadaan dan tingkah laku objek dikawal menggunakan pengubah suai yang digunakan pada medan dan kaedah: peribadi, dilindungi, awam dan lalai. Sebagai contoh, kami memutuskan bahawa tahun pengeluaran, nama pengilang dan salah satu kaedah ialah butiran pelaksanaan dalaman kelas dan tidak boleh diubah oleh objek lain dalam program. Dalam kod,

public class SomePhone {

    private int year;
    private String company;
    public SomePhone(int year, String company) {
        this.year = year;
        this.company = company;
    }
private void openConnection(){
    // findSwitch
    // openNewConnection...
}
public void call() {
    openConnection();
    System.out.println("Calling");
}

public void ring() {
    System.out.println("Ring-ring");
}

 }
Pengubah suai peribadi membenarkan medan dan kaedah kelas untuk diakses hanya dalam kelas ini. Ini bermakna mustahil untuk mengakses medan persendirian dari luar, kerana kaedah persendirian tidak boleh dipanggil. Mengehadkan akses kepada kaedah openConnection juga memberikan kami keupayaan untuk menukar pelaksanaan dalaman kaedah secara bebas, kerana kaedah itu dijamin tidak akan digunakan oleh atau mengganggu kerja objek lain. Untuk bekerja dengan objek kami, kami membiarkan kaedah panggilan dan deringan tersedia menggunakan pengubah suai awam. Menyediakan kaedah awam untuk bekerja dengan objek juga merupakan sebahagian daripada enkapsulasi, kerana jika akses ditolak sepenuhnya, ia akan menjadi sia-sia.

Warisan

Mari kita lihat sekali lagi gambarajah telefon. Anda boleh melihat bahawa ia adalah hierarki di mana model mempunyai semua ciri model yang terletak lebih tinggi di sepanjang cawangannya, dan menambah beberapa cirinya sendiri. Sebagai contoh, telefon pintar menggunakan rangkaian selular untuk komunikasi (mempunyai sifat telefon bimbit), wayarles dan mudah alih (mempunyai sifat telefon tanpa wayar), dan boleh menerima dan membuat panggilan (mempunyai sifat telefon). Apa yang kita ada di sini ialah pewarisan sifat objek. Dalam pengaturcaraan, pewarisan bermaksud menggunakan kelas sedia ada untuk menentukan kelas baharu. Mari kita pertimbangkan contoh menggunakan warisan untuk mencipta kelas telefon pintar. Semua telefon tanpa wayar dikuasakan oleh bateri boleh dicas semula, yang mempunyai hayat bateri tertentu. Sehubungan itu, kami menambah harta ini pada kelas telefon tanpa wayar:

public abstract class CordlessPhone extends AbstractPhone {

    private int hour;

    public CordlessPhone (int year, int hour) {
        super(year);
        this.hour = hour;
    }
    }
Telefon bimbit mewarisi sifat telefon tanpa wayar, dan kami melaksanakan kaedah panggilan dan deringan dalam kelas ini:

public class CellPhone extends CordlessPhone {
    public CellPhone(int year, int hour) {
        super(year, hour);
    }

    @Override
    public void call(int outgoingNumber) {
        System.out.println("Calling " + outgoingNumber);
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("Incoming call from " + incomingNumber);
    }
}
Dan akhirnya, kami mempunyai kelas telefon pintar, yang, tidak seperti telefon bimbit klasik, mempunyai sistem pengendalian yang lengkap. Anda boleh mengembangkan kefungsian telefon pintar anda dengan menambahkan program baharu yang boleh dijalankan pada sistem pengendaliannya. Dalam kod, kelas boleh diterangkan seperti berikut:

public class Smartphone extends CellPhone {
    
    private String operationSystem;

    public Smartphone(int year, int hour, String operationSystem) {
        super(year, hour);
        this.operationSystem = operationSystem;
    }
public void install(String program) {
    System.out.println("Installing " + program + " for " + operationSystem);
}

}
Seperti yang anda lihat, kami mencipta sedikit kod baharu untuk menerangkan kelas Telefon Pintar , tetapi kami mendapat kelas baharu dengan fungsi baharu. Prinsip OOP ini memungkinkan untuk mengurangkan dengan ketara jumlah kod Java yang diperlukan, sekali gus menjadikan kehidupan lebih mudah untuk pengaturcara.

Polimorfisme

Walaupun terdapat perbezaan dalam rupa dan reka bentuk pelbagai jenis telefon, kami boleh mengenal pasti beberapa gelagat biasa: mereka semua boleh menerima dan membuat panggilan dan semuanya mempunyai set kawalan yang agak jelas dan mudah. Dari segi pengaturcaraan, prinsip abstraksi (yang kita sudah biasa) membolehkan kita mengatakan bahawa objek telefon mempunyai antara muka yang sama. Itulah sebabnya orang ramai boleh dengan mudah menggunakan model telefon yang berbeza yang mempunyai kawalan yang sama (butang mekanikal atau skrin sentuh), tanpa menyelidiki butiran teknikal peranti. Oleh itu, anda menggunakan telefon bimbit sentiasa dan anda boleh membuat panggilan dengan mudah daripada talian tetap rakan anda. Prinsip OOP yang mengatakan bahawa program boleh menggunakan objek dengan antara muka biasa tanpa sebarang maklumat tentang struktur dalaman objek dipanggil polimorfisme. jom' bayangkan bahawa kami memerlukan program kami untuk menerangkan pengguna yang boleh menggunakan mana-mana telefon untuk menghubungi pengguna lain. Begini cara kita boleh melakukannya:

public class User {
    private String name;

    public User(String name) {
        this.name = name;
            }

    public void callAnotherUser(int number, AbstractPhone phone){
// And here's polymorphism: using the AbstractPhone type in the code!
        phone.call(number);
    }
}
 }
Sekarang kita akan menerangkan beberapa jenis telefon. Salah satu telefon pertama:

public class ThomasEdisonPhone extends AbstractPhone {

public ThomasEdisonPhone(int year) {
    super(year);
}
    @Override
    public void call(int outgoingNumber) {
        System.out.println("Crank the handle");
        System.out.println("What number would you like to connect to?");
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("The phone is ringing");
    }
}
Telefon talian tetap biasa:

public class Phone extends AbstractPhone {

    public Phone(int year) {
        super(year);
    }

    @Override
    public void call(int outgoingNumber) {
        System.out.println("Calling " + outgoingNumber);
    }

    @Override
    public void ring(int incomingNumber) {
        System.out.println("The phone is ringing");
    }
}
Dan akhirnya, telefon video yang menarik:

public class VideoPhone extends AbstractPhone {

    public VideoPhone(int year) {
        super(year);
    }
    @Override
    public void call(int outgoingNumber) {
        System.out.println("Connecting video call to " + outgoingNumber);
    }
    @Override
    public void ring(int incomingNumber) {
        System.out.println("Incoming video call from " + incomingNumber);
    }
  }
Kami akan mencipta objek dalam kaedah main() dan menguji kaedah callAnotherUser() :

AbstractPhone firstPhone = new ThomasEdisonPhone(1879);
AbstractPhone phone = new Phone(1984);
AbstractPhone videoPhone=new VideoPhone(2018);
User user = new User("Jason");
user.callAnotherUser(224466, firstPhone);
// Crank the handle
// What number would you like to connect to?
user.callAnotherUser(224466, phone);
// Calling 224466
user.callAnotherUser(224466, videoPhone);
// Connecting video call to 224466
Memanggil kaedah yang sama pada objek pengguna menghasilkan hasil yang berbeza. Pelaksanaan khusus kaedah panggilan dipilih secara dinamik di dalam kaedah callAnotherUser() berdasarkan jenis objek tertentu yang diluluskan semasa program berjalan. Ini adalah kelebihan utama polimorfisme – keupayaan untuk memilih pelaksanaan pada masa jalan. Dalam contoh kelas telefon yang diberikan di atas, kami menggunakan kaedah mengatasi — helah di mana kami menukar pelaksanaan kaedah yang ditakrifkan dalam kelas asas tanpa mengubah tandatangan kaedah. Ini pada dasarnya menggantikan kaedah: kaedah baru yang ditakrifkan dalam subkelas dipanggil apabila program dilaksanakan. Biasanya, apabila kita mengatasi kaedah, @Overrideanotasi digunakan. Ia memberitahu pengkompil untuk menyemak tandatangan kaedah yang ditindih dan ditindih. Akhir sekali, untuk memastikan program Java anda konsisten dengan prinsip OOP, ikuti petua ini:
  • mengenal pasti ciri utama objek;
  • mengenal pasti sifat dan tingkah laku biasa dan menggunakan warisan apabila membuat kelas;
  • gunakan jenis abstrak untuk menerangkan objek;
  • cuba untuk sentiasa menyembunyikan kaedah dan medan yang berkaitan dengan pelaksanaan dalaman kelas.