1. Gambaran keseluruhan
Ringkasnya, sebelum kita dapat bekerja dengan objek di JVM, ia harus diinisialisasi.
Dalam bahagian berikut, kita akan melihat pelbagai cara untuk menginisialisasi jenis dan objek primitif.
2. Pengisytiharan vs Permulaan
Mari mulakan dengan memastikan bahawa kita berada di halaman yang sama.
Deklarasi adalah proses menentukan pemboleh ubah berserta jenis dan namanya.
Di sini, kami menyatakan pemboleh ubah id :
int id;
Permulaan, sebaliknya, adalah mengenai menetapkan nilai; sebagai contoh:
id = 1;
Untuk menunjukkan, kami akan membuat kelas Pengguna dengan nama dan sifat id :
public class User { private String name; private int id; // standard constructor, getters, setters, }
Seterusnya, kita akan melihat bahawa inisialisasi berfungsi berbeza bergantung pada jenis bidang yang kita mulakan.
3. Objek vs Primitif
Java menyediakan dua jenis perwakilan data: jenis primitif dan jenis rujukan. Pada bahagian ini, kita akan membincangkan perbezaan antara keduanya berkaitan dengan inisialisasi.
Java memiliki lapan jenis data bawaan, disebut sebagai jenis primitif Java; pemboleh ubah jenis ini memegang nilai mereka secara langsung.
Jenis rujukan menyimpan rujukan ke objek (contoh kelas). Tidak seperti jenis primitif yang menyimpan nilainya dalam memori di mana pemboleh ubah diperuntukkan, rujukan tidak menyimpan nilai objek yang mereka rujuk.
Sebaliknya, rujukan menunjuk ke objek dengan menyimpan alamat memori di mana objek itu berada.
Perhatikan bahawa Java tidak membenarkan kita menemui apa alamat memori fizikal. Sebaliknya, kita hanya dapat menggunakan rujukan untuk merujuk pada objek.
Mari kita lihat contoh yang menyatakan dan memulakan jenis rujukan dari kelas Pengguna kami :
@Test public void whenIntializedWithNew_thenInstanceIsNotNull() { User user = new User(); assertThat(user).isNotNull(); }
Seperti yang kita lihat di sini, rujukan dapat diberikan kepada yang baru dengan menggunakan kata kunci baru, yang bertanggung jawab untuk membuat objek Pengguna baru .
Mari teruskan dengan mempelajari lebih lanjut mengenai penciptaan objek.
5. Membuat Objek
Tidak seperti primitif, penciptaan objek sedikit lebih kompleks. Ini kerana kami tidak hanya menambah nilai ke lapangan; sebaliknya, kami mencetuskan inisialisasi menggunakan kata kunci baru . Ini, sebagai balasan, memanggil konstruktor dan menginisialisasi objek dalam ingatan.
Mari kita bincangkan pembina dan kata kunci baru dengan lebih terperinci.
Kata kunci baru bertanggungjawab untuk memperuntukkan memori untuk objek baru melalui konstruktor.
Pembina biasanya digunakan untuk menginisialisasi pemboleh ubah contoh yang mewakili sifat utama objek yang dibuat .
Sekiranya kita tidak menyediakan konstruktor secara eksplisit, penyusun akan membuat konstruktor lalai yang tidak mempunyai argumen dan hanya memperuntukkan memori untuk objek tersebut.
Kelas boleh mempunyai banyak pembina selagi senarai parameternya berbeza ( kelebihan beban ) . Setiap konstruktor yang tidak memanggil konstruktor lain dalam kelas yang sama mempunyai panggilan kepada konstruktor induknya sama ada ia ditulis secara eksplisit atau dimasukkan oleh penyusun melalui super () .
Mari tambah konstruktor ke kelas Pengguna kami :
public User(String name, int id) { this.name = name; this.id = id; }
Sekarang kita boleh menggunakan konstruktor kita untuk membuat objek Pengguna dengan nilai awal untuk sifatnya:
User user = new User("Alice", 1);
6. Skop Pembolehubah
Pada bahagian berikut, kita akan melihat berbagai jenis ruang lingkup yang boleh ada pemboleh ubah dalam Java dan bagaimana ini mempengaruhi proses inisialisasi.
6.1. Pembolehubah Instance dan Class
Pemboleh ubah contoh dan kelas tidak memerlukan kita untuk menginisialisasi. Sebaik sahaja kami menyatakan pemboleh ubah ini, mereka diberi nilai lalai seperti berikut:

Sekarang, mari kita cuba menentukan beberapa pemboleh ubah yang berkaitan dengan kelas dan kelas dan menguji sama ada ia mempunyai nilai lalai atau tidak:
@Test public void whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault() { User user = new User(); assertThat(user.getName()).isNull(); assertThat(user.getId() == 0); }
6.2. Pemboleh ubah Tempatan
Pemboleh ubah tempatan mesti diinisialisasi sebelum digunakan , kerana mereka tidak mempunyai nilai lalai dan penyusun tidak akan membiarkan kami menggunakan nilai yang tidak diinisialisasi.
Contohnya, kod berikut menghasilkan ralat penyusun:
public void print(){ int i; System.out.println(i); }
7. Kata Kunci Akhir
Kata kunci terakhir yang diterapkan pada medan bermaksud bahawa nilai medan tidak lagi dapat diubah setelah inisialisasi. Dengan cara ini, kita dapat menentukan pemalar di Java.
Let's add a constant to our User class:
private static final int YEAR = 2000;
Constants must be initialized either when they're declared or in a constructor.
8. Initializers in Java
In Java, an initializer is a block of code that has no associated name or data type and is placed outside of any method, constructor, or another block of code.
Java offers two types of initializers, static and instance initializers. Let's see how we can use each of them.
8.1. Instance Initializers
We can use these to initialize instance variables.
To demonstrate, let’s provide a value for a user id using an instance initializer in our User class:
{ id = 0; }
8.2. Static Initialization Block
A static initializer or static block – is a block of code which is used to initialize static fields. In other words, it’s a simple initializer marked with the keyword static:
private static String forum; static { forum = "Java"; }
9. Order of Initialization
When writing code that initializes different types of fields, of course, we have to keep an eye on the order of initialization.
In Java, the order for initialization statements is as follows:
- static variables and static initializers in order
- instance variables and instance initializers in order
- constructors
10. Object Life Cycle
Now that we've learned how to declare and initialize objects, let's discover what happens to objects when they're not in use.
Unlike other languages where we have to worry about object destruction, Java takes care of obsolete objects through its garbage collector.
All objects in Java are stored in our program's heap memory. In fact, the heap represents a large pool of unused memory, allocated for our Java application.
On the other hand, the garbage collector is a Java program that takes care of automatic memory management by deleting objects that are no longer reachable.
For a Java object to become unreachable, it has to encounter one of the following situations:
- The object no longer has any references pointing to it
- All reference pointing to the object are out of scope
In conclusion, an object is first created from a class, usually using the keyword new. Then the object lives its life and provides us with access to its methods and fields.
Finally, when it's no longer needed, the garbage collector destroys it.
11. Other Methods for Creating Objects
In this section, we’ll take a brief look at methods other than new keyword to create objects and how to apply them, specifically reflection, cloning, and serialization.
Reflection is a mechanism we can use to inspect classes, fields, and methods at run-time. Here's an example of creating our User object using reflection:
@Test public void whenInitializedWithReflection_thenInstanceIsNotNull() throws Exception { User user = User.class.getConstructor(String.class, int.class) .newInstance("Alice", 2); assertThat(user).isNotNull(); }
In this case, we're using reflection to find and invoke a constructor of the User class.
The next method, cloning, is a way to create an exact copy of an object. For this, our User class must implement the Cloneable interface:
public class User implements Cloneable { //... }
Sekarang kita dapat menggunakan kaedah clone () untuk membuat objek clonedUser baru yang mempunyai nilai properti yang sama dengan objek pengguna :
@Test public void whenCopiedWithClone_thenExactMatchIsCreated() throws CloneNotSupportedException { User user = new User("Alice", 3); User clonedUser = (User) user.clone(); assertThat(clonedUser).isEqualTo(user); }
Kita juga boleh menggunakan kelas sun.misc.Unsafe untuk memperuntukkan memori untuk objek tanpa memanggil pembina:
User u = (User) unsafeInstance.allocateInstance(User.class);
12. Kesimpulannya
Dalam tutorial ini, kita membahas inisialisasi bidang di Java. Kami menemui pelbagai jenis data di Java dan cara menggunakannya. Kami juga membahas beberapa cara untuk membuat objek di Jawa.
Pelaksanaan penuh tutorial ini boleh didapati di Github.