Saya tahu Java tidak memiliki pointer, tetapi saya mendengar bahwa program Java dapat dibuat dengan pointer dan ini dapat dilakukan oleh sedikit orang yang ahli di java. Benarkah
Saya tahu Java tidak memiliki pointer, tetapi saya mendengar bahwa program Java dapat dibuat dengan pointer dan ini dapat dilakukan oleh sedikit orang yang ahli di java. Benarkah
Jawaban:
Semua objek di Java adalah referensi dan Anda dapat menggunakannya seperti pointer.
abstract class Animal
{...
}
class Lion extends Animal
{...
}
class Tiger extends Animal
{
public Tiger() {...}
public void growl(){...}
}
Tiger first = null;
Tiger second = new Tiger();
Tiger third;
Dereferensikan nol:
first.growl(); // ERROR, first is null.
third.growl(); // ERROR, third has not been initialized.
Masalah Aliasing:
third = new Tiger();
first = third;
Kehilangan Sel:
second = third; // Possible ERROR. The old value of second is lost.
Anda dapat membuat ini aman dengan terlebih dahulu memastikan bahwa tidak diperlukan lagi nilai lama detik atau menetapkan nilai detik ke penunjuk lain.
first = second;
second = third; //OK
Perhatikan bahwa memberi nilai kedua dengan cara lain (NULL, new ...) sama banyaknya dengan potensi kesalahan dan dapat mengakibatkan kehilangan objek yang ditunjuknya.
Sistem Java akan memunculkan pengecualian ( OutOfMemoryError
) saat Anda memanggil new dan pengalokasi tidak dapat mengalokasikan sel yang diminta. Ini sangat jarang dan biasanya hasil dari rekursi lari.
Perhatikan bahwa, dari sudut pandang bahasa, mengabaikan objek ke pengumpul sampah bukanlah kesalahan sama sekali. Itu hanyalah sesuatu yang perlu disadari oleh programmer. Variabel yang sama dapat menunjuk ke objek yang berbeda pada waktu yang berbeda dan nilai lama akan diambil kembali jika tidak ada pointer yang mereferensikannya. Tetapi jika logika program membutuhkan pemeliharaan setidaknya satu referensi ke objek, itu akan menyebabkan kesalahan.
Para pemula sering melakukan kesalahan berikut.
Tiger tony = new Tiger();
tony = third; // Error, the new object allocated above is reclaimed.
Apa yang mungkin ingin Anda katakan adalah:
Tiger tony = null;
tony = third; // OK.
Casting yang Tidak Tepat:
Lion leo = new Lion();
Tiger tony = (Tiger)leo; // Always illegal and caught by compiler.
Animal whatever = new Lion(); // Legal.
Tiger tony = (Tiger)whatever; // Illegal, just as in previous example.
Lion leo = (Lion)whatever; // Legal, object whatever really is a Lion.
Pointer di C:
void main() {
int* x; // Allocate the pointers x and y
int* y; // (but not the pointees)
x = malloc(sizeof(int)); // Allocate an int pointee,
// and set x to point to it
*x = 42; // Dereference x to store 42 in its pointee
*y = 13; // CRASH -- y does not have a pointee yet
y = x; // Pointer assignment sets y to point to x's pointee
*y = 13; // Dereference y to store 13 in its (shared) pointee
}
Petunjuk di Jawa:
class IntObj {
public int value;
}
public class Binky() {
public static void main(String[] args) {
IntObj x; // Allocate the pointers x and y
IntObj y; // (but not the IntObj pointees)
x = new IntObj(); // Allocate an IntObj pointee
// and set x to point to it
x.value = 42; // Dereference x to store 42 in its pointee
y.value = 13; // CRASH -- y does not have a pointee yet
y = x; // Pointer assignment sets y to point to x's pointee
y.value = 13; // Deference y to store 13 in its (shared) pointee
}
}
UPDATE: seperti yang disarankan dalam komentar, kita harus mencatat bahwa C memiliki aritmatika penunjuk. Namun, kami tidak memilikinya di Jawa.
Java memang memiliki petunjuk. Setiap kali Anda membuat objek di Java, Anda sebenarnya membuat penunjuk ke objek; penunjuk ini kemudian dapat disetel ke objek lain atau ke null
, dan objek asli akan tetap ada (pengumpulan sampah tertunda).
Apa yang tidak dapat Anda lakukan di Java adalah aritmatika penunjuk. Anda tidak dapat mengubah alamat memori tertentu atau menaikkan penunjuk.
Jika Anda benar-benar ingin mendapatkan level rendah, satu-satunya cara untuk melakukannya adalah dengan Java Native Interface ; dan bahkan kemudian, bagian level rendah harus dilakukan dalam C atau C ++.
Karena Java tidak memiliki tipe data pointer, tidak mungkin menggunakan pointer di Java. Bahkan beberapa ahli tidak akan bisa menggunakan pointer di java.
Lihat juga poin terakhir dalam: Lingkungan Bahasa Java
Ada pointer di Java, tetapi Anda tidak bisa memanipulasinya seperti yang Anda bisa di C ++ atau C. Saat Anda meneruskan sebuah objek, Anda meneruskan sebuah pointer ke objek itu, tetapi tidak dalam arti yang sama seperti di C ++. Objek itu tidak dapat dibedakan. Jika Anda menyetel nilainya menggunakan pengakses aslinya, ini akan berubah karena Java mengetahui lokasi memorinya melalui penunjuk. Tapi penunjuk itu tidak bisa diubah. Saat Anda mencoba untuk mengatur penunjuk ke lokasi baru, Anda malah berakhir dengan objek lokal baru dengan nama yang sama dengan yang lain. Objek asli tidak berubah. Berikut adalah program singkat untuk menunjukkan perbedaannya.
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone {
public static void main(String[] args) throws java.lang.Exception {
System.out.println("Expected # = 0 1 2 2 1");
Cat c = new Cat();
c.setClaws(0);
System.out.println("Initial value is " + c.getClaws());
// prints 0 obviously
clawsAreOne(c);
System.out.println("Accessor changes value to " + c.getClaws());
// prints 1 because the value 'referenced' by the 'pointer' is changed using an accessor.
makeNewCat(c);
System.out.println("Final value is " + c.getClaws());
// prints 1 because the pointer is not changed to 'kitten'; that would be a reference pass.
}
public static void clawsAreOne(Cat kitty) {
kitty.setClaws(1);
}
public static void makeNewCat(Cat kitty) {
Cat kitten = new Cat();
kitten.setClaws(2);
kitty = kitten;
System.out.println("Value in makeNewCat scope of kitten " + kitten.getClaws());
//Prints 2. the value pointed to by 'kitten' is 2
System.out.println("Value in makeNewcat scope of kitty " + kitty.getClaws());
//Prints 2. The local copy is being used within the scope of this method.
}
}
class Cat {
private int claws;
public void setClaws(int i) {
claws = i;
}
public int getClaws() {
return claws;
}
}
Ini dapat dijalankan di Ideone.com.
Java tidak memiliki pointer seperti yang dimiliki C, tetapi Java memungkinkan Anda membuat objek baru di heap yang "direferensikan" oleh variabel. Kurangnya petunjuk adalah untuk menghentikan program Java mereferensikan lokasi memori secara ilegal, dan juga memungkinkan Pengumpulan Sampah dilakukan secara otomatis oleh Mesin Virtual Java.
Anda dapat menggunakan alamat dan petunjuk menggunakan kelas Tidak aman. Namun seperti namanya, metode ini TIDAK AMAN dan biasanya ide yang buruk. Penggunaan yang salah dapat menyebabkan JVM Anda mati secara acak (sebenarnya masalah yang sama menggunakan pointer secara tidak benar di C / C ++)
Meskipun Anda mungkin terbiasa dengan petunjuk dan berpikir Anda membutuhkannya (karena Anda tidak tahu cara membuat kode dengan cara lain), Anda akan menemukan bahwa Anda tidak melakukannya dan Anda akan lebih baik karenanya.
Secara teknis, semua objek Java adalah pointer. Semua tipe primitif adalah nilai. Tidak ada cara untuk mengambil kendali manual atas petunjuk tersebut. Java secara internal hanya menggunakan pass-by-reference.
Tidak juga, tidak.
Java tidak memiliki petunjuk. Jika Anda benar - benar menginginkannya, Anda dapat mencoba meniru mereka dengan membangun di sekitar sesuatu seperti refleksi, tetapi itu akan memiliki semua kerumitan petunjuk tanpa ada manfaatnya .
Java tidak memiliki pointer karena tidak membutuhkannya. Jawaban apa yang Anda harapkan dari pertanyaan ini, yaitu jauh di lubuk hati Anda berharap dapat menggunakannya untuk sesuatu atau apakah ini hanya sekedar keingintahuan?
Semua objek di java diteruskan ke fungsi dengan salinan referensi kecuali primitif.
Akibatnya, ini berarti Anda mengirim salinan penunjuk ke objek asli daripada salinan dari objek itu sendiri.
Silakan tinggalkan komentar jika Anda ingin contoh untuk memahami ini.
swap
fungsi di Java yang akan menukar dua objek.
Seperti yang dikatakan orang lain, jawaban singkatnya adalah "Tidak".
Tentu, Anda dapat menulis kode JNI yang memutar dengan pointer Java. Bergantung pada apa yang Anda coba capai, mungkin itu akan membawa Anda ke suatu tempat dan mungkin tidak.
Anda selalu bisa mensimulasikan poin dengan membuat array dan bekerja dengan indeks ke dalam array. Sekali lagi, tergantung pada apa yang Anda coba capai, itu mungkin berguna atau tidak.
dari buku bernama Decompiling Android oleh Godfrey Nolan
Keamanan menentukan bahwa pointer tidak digunakan di Java sehingga peretas tidak dapat keluar dari aplikasi dan masuk ke sistem operasi. Tidak ada petunjuk berarti bahwa sesuatu yang lain ---- dalam hal ini, JVM ---- harus mengurus alokasi dan membebaskan memori. Kebocoran memori juga harus menjadi bagian dari masa lalu, atau begitulah menurut teori. Beberapa aplikasi yang ditulis dalam C dan C ++ terkenal merusak memori seperti saringan karena pemrogram tidak memperhatikan untuk membebaskan memori yang tidak diinginkan pada waktu yang tepat ---- bukan berarti siapa pun yang membaca ini akan bersalah melakukan dosa seperti itu. Pengumpulan sampah juga akan membuat pemrogram lebih produktif, dengan lebih sedikit waktu yang dihabiskan untuk men-debug masalah memori.
Anda juga bisa mendapatkan petunjuk untuk literal. Anda harus menerapkannya sendiri. Ini cukup mendasar untuk para ahli;). Gunakan array int / object / long / byte dan voila Anda memiliki dasar-dasar untuk mengimplementasikan pointer. Sekarang nilai int apa pun bisa menjadi penunjuk ke array itu int []. Anda bisa menambah penunjuk, Anda bisa mengurangi penunjuk, Anda bisa menggandakan penunjuk. Anda memang memiliki aritmatika penunjuk! Itulah satu-satunya cara untuk mengimplementasikan 1000 kelas atribut int dan memiliki metode umum yang berlaku untuk semua atribut. Anda juga bisa menggunakan array byte [] daripada int []
Namun saya berharap Java akan membiarkan Anda meneruskan nilai literal dengan referensi. Sesuatu di sepanjang garis
//(* telling you it is a pointer)
public void myMethod(int* intValue);
Semua objek java adalah pointer karena variabel yang menyimpan alamat disebut pointer dan objek memegang alamat. Jadi objek adalah variabel pointer.