Rumah  >  Artikel  >  Java  >  Apakah perbezaan antara jenis rujukan dan jenis primitif di Jawa

Apakah perbezaan antara jenis rujukan dan jenis primitif di Jawa

王林
王林ke hadapan
2023-05-04 16:34:061582semak imbas

Jadual berikut menyenaraikan jenis primitif dan kelas pembalut objeknya.

Float
Jenis primitif Kelas pembungkusan
boolean Boolean
char Character
bait Bait
pendek Pendek
int Integer

panjang  

原始类型 封装类
boolean  Boolean
 char Character
byte  Byte
short  Short
int Integer

long  

Long
float Float
double  Double
Panjang
terapung
double Double

Jenis rujukan dan jenis primitif Tingkah laku adalah berbeza sama sekali, dan mereka mempunyai semantik yang berbeza. Sebagai contoh, katakan terdapat dua pembolehubah tempatan dalam kaedah, satu pembolehubah adalah jenis primitif int, dan pembolehubah lain ialah rujukan objek kepada objek Integer:

int i = 5; // 原始类型  Integer j = new Integer(10); // 对象引用

Kedua-dua pembolehubah disimpan dalam jadual pembolehubah tempatan , Dan mereka semua beroperasi pada timbunan operan Java, tetapi perwakilan mereka berbeza sama sekali. (Timbunan istilah generik akan digunakan dalam seluruh artikel ini dan bukannya tindanan operan atau jadual pembolehubah setempat.) Jenis primitif int dan rujukan objek masing-masing menduduki 32 bit tindanan. (Untuk mewakili int atau rujukan objek, pelaksanaan mesin maya Java memerlukan sekurang-kurangnya storan 32-bit.) Entri tindanan untuk objek Integer bukanlah objek itu sendiri, tetapi rujukan objek.

Semua objek dalam Java diakses melalui rujukan objek. Rujukan objek ialah penunjuk ke kawasan dalam timbunan tempat objek disimpan. Apabila anda mengisytiharkan jenis primitif, anda mengisytiharkan storan untuk jenis itu sendiri.

Jenis rujukan dan jenis primitif mempunyai ciri dan penggunaan yang berbeza, termasuk: isu saiz dan kelajuan, jenis struktur data jenis ini disimpan, apabila jenis rujukan dan jenis primitif digunakan sebagai rujukan untuk kelas tertentu Nilai lalai yang ditentukan apabila menggunakan data contoh. Nilai lalai untuk pembolehubah contoh rujukan objek adalah nol, manakala nilai lalai untuk pembolehubah contoh jenis primitif bergantung pada jenisnya.

Banyak kod program akan mengandungi kedua-dua jenis primitif dan pembungkus objeknya. Bekerja dengan kedua-dua jenis dan memahami cara ia berinteraksi dan wujud bersama dengan betul akan menjadi masalah apabila menyemak sama ada ia sama. Pengaturcara mesti memahami cara kedua-dua jenis ini berfungsi dan berinteraksi untuk mengelakkan ralat dalam kod mereka.

Sebagai contoh, kaedah tidak boleh dipanggil pada jenis primitif, tetapi kaedah boleh dipanggil pada objek:

int j = 5;  j.hashCode(); // 错误  //。..  Integer i = new Integer(5);  i.hashCode(); // 正确

Menggunakan jenis primitif tidak memerlukan panggilan baharu atau mencipta objek. Ini menjimatkan masa dan ruang. Mencampurkan jenis dan objek primitif juga boleh membawa kepada hasil yang tidak dijangka yang berkaitan dengan tugasan. Kod yang kelihatan bebas pepijat mungkin tidak melakukan kerja yang anda mahukan. Contohnya:

import java.awt.Point;  class Assign  {  public static void main(String args[])  {  int a = 1;  int b = 2;  Point x = new Point(0,0);  Point y = new Point(1,1); //1  System.out.println(“a is ” + a);  System.out.println(“b is ” + b);  System.out.println(“x is ” + x);  System.out.println(“y is ” + y);  System.out.println(“Performing assignment and ” +  “setLocation.。.”);  a = b;  a++;  x = y; //2  x.setLocation(5,5); //3  System.out.println(“a is ”+a);  System.out.println(“b is ”+b);  System.out.println(“x is ”+x);  System.out.println(“y is ”+y);  }  }

Kod ini menjana output berikut:

a is 1  b is 2  x is java.awt.Point[x=0,y=0]  y is java.awt.Point[x=1,y=1]  Performing assignment and setLocation.。.  a is 3  b is 2  x is java.awt.Point[x=5,y=5]  y is java.awt.Point[x=5,y=5]

Tiada apa-apa yang mengejutkan tentang hasil pengubahsuaian integer a dan b. Nilai b diberikan kepada pembolehubah integer a, menghasilkan nilai makhluk meningkat sebanyak 1. Output ini mencerminkan apa yang kita mahu berlaku. Walau bagaimanapun, apa yang mengejutkan ialah output objek x dan y selepas menetapkan dan memanggil setLocation. Kami secara khusus memanggil setLocation pada x selepas menyelesaikan tugasan x = y Bagaimanakah nilai x dan y boleh sama? Lagipun, kami memberikan y kepada x dan kemudian menukar x, yang tidak berbeza daripada apa yang kami lakukan dengan integer a dan b.

Kekeliruan ini disebabkan oleh penggunaan jenis dan objek primitif. Tugasan berfungsi tidak berbeza untuk kedua-dua jenis. Tetapi ia mungkin kelihatan berbeza. Tugasan menjadikan nilai di sebelah kiri tanda sama (=) sama dengan nilai di sebelah kanan. Ini jelas untuk jenis primitif seperti int a dan b sebelum ini. Untuk jenis bukan primitif (seperti objek Point), tugasan mengubah suai rujukan objek, bukan objek itu sendiri. Oleh itu, selepas pernyataan

x = y;

, x sama dengan y. Dengan kata lain, kerana x dan y ialah rujukan objek, ia kini merujuk kepada objek yang sama. Oleh itu, sebarang perubahan kepada x juga berubah y. Berikut ialah situasi selepas kod di //1 dilaksanakan:

Situasi selepas tugasan di //2 dilaksanakan adalah seperti berikut:

Apabila setLocation dipanggil di //3 , kaedah ini Dilakukan pada objek yang dirujuk oleh x. Kerana objek Titik yang dirujuk oleh Semua bertindak pada objek yang sama.

Adalah penting untuk membezakan antara jenis rujukan dan jenis primitif dan memahami semantik rujukan. Kegagalan berbuat demikian akan menyebabkan kod ditulis tidak dapat melakukan tugas yang dimaksudkan.

Atas ialah kandungan terperinci Apakah perbezaan antara jenis rujukan dan jenis primitif di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam