JavaRush /Blog Java /Random-MS /Jenis Data Rujukan dalam Java

Jenis Data Rujukan dalam Java

Diterbitkan dalam kumpulan
Tanpa memahami sintaks Java, adalah mustahil untuk menjadi pembangun yang serius, jadi hari ini kami terus mempelajari sintaks. Dalam salah satu artikel sebelumnya kita bercakap tentang pembolehubah primitif, tetapi kerana terdapat dua jenis pembolehubah, hari ini kita akan bercakap tentang jenis kedua - jenis rujukan di Jawa. Jadi apa itu? Mengapakah jenis data rujukan diperlukan dalam Java? Jenis Data Rujukan dalam Java - 1Bayangkan kita mempunyai objek TV dengan beberapa ciri, seperti nombor saluran, kelantangan bunyi dan pada bendera:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
Bagaimanakah jenis mudah seperti , boleh intmenyimpan data ini? Mari kita ingat: satu pembolehubah intialah 4 bait. Tetapi di dalamnya terdapat dua pembolehubah (4 bait + 4 bait) daripada jenis yang sama, dan juga boolean(+1 bait)... Jumlah - 4 hingga 9, tetapi sebagai peraturan, lebih banyak maklumat disimpan dalam objek. Apa nak buat? Anda tidak boleh meletakkan objek ke dalam pembolehubah. Pada ketika ini dalam cerita kami, pembolehubah rujukan muncul. Pembolehubah rujukan menyimpan alamat lokasi memori di mana objek tertentu terletak. Iaitu, ini ialah "kad perniagaan" dengan alamat, yang dengannya kita boleh mencari objek kita dalam memori yang dikongsi dan melakukan beberapa manipulasi dengannya. Rujukan kepada mana-mana objek dalam Java ialah pembolehubah rujukan. Inilah rupanya dengan objek TV kami:
TV telly = new TV();
Kami menetapkan pembolehubah jenis TV dengan nama tellykepada pautan ke objek jenis TV yang dicipta. Iaitu, JVM memperuntukkan memori pada timbunan untuk objek TV, menciptanya dan alamat ke lokasinya dalam ingatan, meletakkannya dalam pembolehubah telly, yang disimpan pada timbunan. Anda boleh membaca lebih lanjut mengenai ingatan, iaitu timbunan dan banyak maklumat berguna lain, dalam kuliah ini . Pembolehubah jenis TV dan objek jenis TV, adakah anda perasan? Ini bukan tanpa sebab: objek jenis tertentu mesti mempunyai pembolehubah yang sepadan dengan jenis yang sama (tidak mengira warisan dan pelaksanaan antara muka, tetapi kini kami tidak mengambil kira perkara ini). Lagipun, kita tidak akan menuangkan sup ke dalam gelas, bukan? Ternyata objek kami ialah TV, dan pembolehubah rujukan untuknya adalah seperti panel kawalan. Menggunakan alat kawalan jauh ini kita boleh berinteraksi dengan objek kita dan datanya. Sebagai contoh, tetapkan ciri untuk TV kami:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Di sini kami menggunakan pengendali titik .untuk mengakses dan mula menggunakan elemen dalaman objek yang dirujuk oleh pembolehubah. Sebagai contoh, dalam baris pertama kami memberitahu pembolehubah telly: "Berikan kami pembolehubah dalaman isOnbagi objek yang anda rujuk dan tetapkannya kepada benar" (hidupkan TV untuk kami).

Mentakrifkan semula pembolehubah rujukan

Katakan kita mempunyai dua pembolehubah jenis rujukan dan objek yang dirujuk:
TV firstTV = new TV();
TV secondTV = new TV();
Jika kita menulis:
firstTV = secondTV;
ini bermakna kami memberikan pembolehubah pertama sebagai nilai salinan alamat (nilai bit alamat) kepada objek kedua, dan kini kedua-dua pembolehubah merujuk kepada objek kedua (dengan kata lain, dua alat kawalan jauh untuk yang sama TV). Pada masa yang sama, objek pertama dibiarkan tanpa pembolehubah yang merujuk kepadanya. Akibatnya, kita mempunyai objek yang tidak boleh diakses, kerana pembolehubah itu adalah benang bersyarat kepadanya, tanpanya ia bertukar menjadi sampah, hanya terletak dalam ingatan dan mengambil ruang. Objek ini kemudiannya akan dimusnahkan dari ingatan oleh pemungut sampah . Jenis Data Rujukan dalam Java - 2Anda boleh memutuskan benang penghubung dengan objek tanpa pautan lain:
secondTV = null;
Akibatnya, hanya akan ada satu pautan ke objek - firstTV, dan secondTVtidak lagi akan menunjuk kepada sesiapa (yang tidak menghalang kami daripada memberikannya pautan kepada beberapa objek seperti TV pada masa hadapan).

Kelas rentetan

Secara berasingan, saya ingin menyebut kelas String . Ini ialah kelas asas yang direka untuk menyimpan dan bekerja dengan data yang disimpan sebagai rentetan. Contoh:
String text = new String("This TV is very loud");
Di sini kita telah melepasi rentetan untuk disimpan dalam pembina objek. Tetapi tiada siapa yang berbuat demikian. Lagipun, rentetan boleh dibuat:
String text = "This TV is very loud";
Jauh lebih selesa, bukan? Dari segi populariti penggunaan, Stringia tidak kalah dengan jenis primitif, tetapi ia masih merupakan kelas, dan pembolehubah yang merujuk kepadanya bukanlah jenis primitif, tetapi jenis rujukan. Kami Stringmempunyai keupayaan hebat ini untuk menggabungkan rentetan:
String text = "This TV" + " is very loud";
Akibatnya, kita akan mendapat teks sekali lagi: This TV is very loud, memandangkan dua baris akan digabungkan menjadi satu keseluruhan, dan pembolehubah akan merujuk kepada teks penuh ini. Nuansa penting ialah Stringini adalah kelas yang tidak berubah. Apakah maksudnya? Mari kita ambil contoh ini:
String text = "This TV";
text = text + " is very loud";
Nampaknya semuanya mudah: kami mengisytiharkan pembolehubah, memberikannya nilai. Pada baris seterusnya kita mengubahnya. Tetapi kita tidak benar-benar berubah. Oleh kerana ini adalah kelas yang tidak berubah, pada baris kedua nilai awal tidak diubah, tetapi yang baru dicipta, yang seterusnya terdiri daripada yang pertama + " is very loud".

Pemalar rujukan

Dalam artikel tentang jenis primitif, kami menyentuh topik pemalar. Bagaimanakah pembolehubah rujukan akan bertindak apabila kami mengisytiharkannya muktamad ?
final TV telly = new TV();
Anda mungkin berfikir bahawa ini akan menjadikan objek tidak berubah. Tetapi tidak, itu tidak benar. Jenis Data Rujukan dalam Java - 3Pembolehubah rujukan dengan pengubah suai finalakan terikat pada objek tertentu tanpa keupayaan untuk menyahikatnya dalam apa jua cara (takrifkan semula atau samakannya dengan null). Iaitu, selepas menetapkan nilai pembolehubah sedemikian, kod seperti:
telly = new TV();
atau
telly = null;
akan menyebabkan ralat penyusunan. Iaitu, finalia hanya bertindak pada pautan, dan tidak mempunyai kesan pada objek itu sendiri. Jika pada mulanya kita boleh mengubahnya, kita boleh menukar keadaan dalamannya tanpa sebarang masalah:
telly.soundVolume = 30;
Kadangkala, pembolehubah ditetapkan sebagai muktamad walaupun dalam hujah kaedah!
public void enableTV (final TV telly){
   telly.isOn = true;
}
Ini dilakukan supaya semasa proses menulis kaedah, hujah-hujah ini tidak boleh ditindih dan, dengan itu, mengurangkan kekeliruan. Bagaimana jika kita menandakan finalpembolehubah rujukan yang merujuk kepada objek tidak berubah? Cth String:
final String PASSWORD = "password";
Akibatnya, kita akan mendapat pemalar, analog pemalar jenis primitif, kerana di sini kita tidak boleh mentakrifkan semula rujukan atau mengubah keadaan dalaman objek (data dalaman).

Mari kita ringkaskan

  1. Walaupun pembolehubah mudah menyimpan bit nilai, pembolehubah rujukan menyimpan bit yang mewakili cara objek diambil semula.
  2. Rujukan objek diisytiharkan untuk satu jenis objek sahaja.
  3. Mana-mana kelas dalam Java ialah jenis rujukan.
  4. Nilai lalai mana-mana pembolehubah rujukan dalam Java ialah null.
  5. Stringialah contoh standard jenis rujukan. Kelas ini juga tidak berubah.
  6. Pembolehubah rujukan dengan pengubah finaladalah terikat kepada hanya satu objek tanpa kemungkinan definisi semula.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION