Artikel ini menganalisis panggilan berdasarkan nilai di Java dengan contoh. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Java mengoperasikan instance objek dengan referensi
Yang bisa dipastikan adalah cara mengoperasikan objek di Java adalah dengan mengoperasikan objek dengan referensi. Untuk memahami ini lebih dalam saya menulis kode berikut:
Pertama tentukan tipe khusus. Salin kodenya sebagai berikut: public class Person {
nama string;
Orang(Nama string){
ini.nama = nama;
}
}
Nama di sini defaultnya adalah public (yang berbeda dengan atribut default kelas di C++)
Maka pemanggilan pada fungsi Utama adalah sebagai berikut:
Copy kode berikut: public class Main {
/**
* @param argumen
*/
public static void main(String[] args) {
// TODO Stub metode yang dibuat secara otomatis
Orang p1 = Orang baru("Paulus");
Orang p2 = Orang baru("Griefen");
System.out.println("p1.nama = " + p1.nama + " p2.nama = " + p2.nama);
Orang tmp;
tmp = p1;
hal1 = hal2;
System.out.println("tmp.nama = " + tmp.nama + " p1.nama = " + p1.nama + " p2.nama = " + p2.nama);
}
}
Outputnya saat ini adalah sebagai berikut:
Copy kodenya sebagai berikut : p1.name = Paul p2.name = Griefen
tmp.name = Paul p1.name = Griefen p2.name = Griefen
Hah? Mengapa ini merupakan hasil? Sebagai CPPer saya bingung! Ini adalah referensi, jadi setelah menjalankan pernyataan berikut, salin kode sebagai berikut: Person tmp;
tmp = p1;
hal1 = hal2;
Karena saya memahami operasi ini sesuai dengan konsep referensi dalam C++, maka tmp p1 p2 saat ini semuanya harus berupa objek yang sama, yaitu semuanya harus menunjuk ke objek p2. Namun outputnya jelas membuktikan bahwa pemahaman tersebut salah! Jadi karena referensi di Java tidak sama dengan referensi di C++? ! ! ! Apakah sama dengan pointer di C++?
Bagus! Mari kita pahami proses operasi ini berdasarkan pointer di C++.
Pertama-tama, Person tmp; mendeklarasikan sebuah pointer, yang mirip dengan deklarasi pointer di C++. Dalam C++ dengan jelas diatur bahwa deklarasi referensi tidak dapat ditulis secara terpisah dengan cara ini. Ketika deklarasi referensi dibuat, harus menunjuk pada suatu objek. Jelas, alasan pada langkah pertama sudah benar. Ini adalah awal yang baik! Maka tmp = p1; p1 = p2; Jelas tmp menunjuk ke p1 dan p1 menunjuk ke p2. Ternyata konsisten!
Artinya jika referensi di Java dibandingkan dengan operasi data di C++, seharusnya lebih mirip dengan konsep pointer di C++!
Pointer di C++ mengimplementasikan fungsi di atas
Karena metode pengoperasian objek di Java di atas mirip dengan pointer di C++, mari kita lihat cara mengimplementasikan metode di atas di C++. Salin kode sebagai berikut: #include "stdafx.h"
#termasuk <string>
#termasuk <iostream>
Orang kelas
{
publik:
std::nama string;
publik:
Orang(std::nama string)
{
ini->nama = nama;
};
};
ke dalam _tmain(ke dalam argc, _TCHAR* argv[])
{
Orang* p1 = Orang baru("Paulus");
Orang* p2 = Orang baru("Griefen");
std::cout<< "p1.nama " << p1->nama << " p2.nama = " << p2->nama << std::endl;
Orang* tmp;
tmp = hal1;
hal1 = hal2;
std::cout<<"tmp.nama" << tmp->nama << " p1.nama " << p1->nama << " p2.nama = " << p2->nama << std::endl ;
hapus tmp;
hapus p1;
kembali 0;
}
Setelah debugging, saya menemukan bahwa hasil keluarannya sama dengan hasil menjalankan Java di atas.
Implementasi mendasar dari bahasa apa pun adalah sama
Karena efek referensi di Java sepertinya sama dengan pointer di C++, mengapa tidak disebut pointer langsung di Java? Tentu saja ada perbedaannya, misalnya referensi di Java tidak bisa melakukan operasi ++, tapi pointer di C++ bisa dan bisa dipindahkan sesuka hati. Tentu saja saat ini Java telah melakukan banyak perbaikan pada pointernya untuk membatasinya dan membuatnya berjalan lebih aman. Namun betapapun besarnya lapisan atas, ketika Anda sampai ke lapisan bawah, Anda perlu mengajukan permohonan memori, dan memori tersebut harus dilepaskan setelah habis. Ini berfungsi dalam bahasa apa pun!
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.