Meneruskan dan Mengembalikan Referensi
Diperkenalkan| English | Makna |
|---|---|
| NullPointerException/nʌl ˈpɔɪntə ekˈsepʃn/ | NullPointerException |
Memutasi objek berbeda dari mereassign parameter
- Caller merujuk ke Student dengan skor 10. Method mengeksekusi s.addScore(5); lalu s = new Student("Other");
- Skor objek bersama asli menjadi 15. Mereassign parameter lokal tidak mengubah variabel caller, karena Java menyalin nilai referensi ke dalam parameter.
Mengirimkan objek ke sebuah metode
- Java menyalin nilai referensi ke dalam parameter method; ia tidak menyalin objek. Parameter method menunjuk ke objek yang sama dengan variabel caller.
- Jadi perubahan yang dilakukan method terhadap objek terlihat oleh caller. Baik argumen primitif maupun referensi dilemparkan oleh nilai; referensi yang disalin masih dapat mencapai objek bersama.
Primitif vs. objek sebagai argumen
- Argumen primitif disalin — method tidak dapat mengubah variabel caller. Untuk argumen objek, referensi yang disalin mencapai objek yang sama — method dapat memutasi objek tersebut.
changeInt(x)tidak dapat mengubahx;student.addScore(10)memang mengubah siswa tersebut. Tanyakan apakah metode memodifikasi objek yang dibagikan atau hanya menetapkan ulang parameter lokalnya.
Mengembalikan objek
- Sebuah metode dapat mengembalikan referensi ke sebuah objek — pemanggil kemudian membagikannya.
public Student topStudent() { return best; }mengembalikan referensi kebest. - Mengembalikan
bestmembagikan objek yang sudah ada. Sebaliknya,return new Student("Copy");membuat objek baru dan mengembalikan referensinya; sebuah metode juga dapat mengembalikannull. Bacalah ekspresi pengembalian sebelum memutuskan apakah status dibagikan.
Referensi disalin, objek bersama; primitif disalin
Skor objek berubah; primitif x tidak.
Ketika Anda meneruskan objek ke sebuah metode, metode menerima...
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Java menyalin nilai referensi ke dalam variabel parameter terpisah. Kedua referensi dapat mencapai objek yang sama; penugasan ulang parameter tidak menggantikan variabel Caller.
Metode dapat mengubah variabel int pemanggil dengan memodifikasi parameternya.
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Primitif disalin — int pemanggil tidak tersentuh.
Memanggilan metode instance melalui referensi null menyebabkan...
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
null tidak menunjuk pada objek apa pun, sehingga tidak ada yang dapat dipanggil metodenya.
Sebuah metode dapat mengembalikan referensi ke sebuah objek, yang kemudian dimiliki bersama oleh Caller.
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Sebuah metode dapat mengembalikan referensi objek yang sudah ada dan berbagi objeknya dengan Caller. Metode lain dapat membangun dan mengembalikan objek segar sebagai gantinya.
Untuk menggunakan referensi yang mungkin null secara aman, Anda harus terlebih dahulu memeriksa...
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Lindungi diri dari null sebelum memanggil metode di atasnya.
Setiap metode yang mengembalikan referensi Student harus mengembalikan objek yang telah ada sebelumnya.
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Salah: return new Student("Other"); membuat dan mengembalikan objek baru.
Referensi null
- Referensi yang menunjuk ke tidak ada objek adalah
null. Memanggil metode instansi melaluinullakan menyebabkan NullPointerException. - Mengembalikan
null(misalnya "tidak ditemukan") adalah hal yang umum — pemanggil harus memeriksanya. Lindungi denganif (s != null) { s.addScore(10); }sebelum menggunakan referensi yang mungkin bernilai null.
Mengirimkan objek menyalin nilai referensi — metode dapat mengubah objek pemanggil; mengirimkan primitif menyalin nilainya — itu tidak bisa. Jadi student.addScore(10) memodifikasi objek pemanggil, tetapi changeInt(x) meninggalkan x pemanggil tanpa perubahan. Dan memanggil metode instansi melalui referensi null akan menyebabkan NullPointerException — periksa != null terlebih dahulu jika referensi mungkin bernilai null.
After the two statements, what is the original caller-referenced Student score?
Kesulitan 2/5 · 140 koin + bonus kecil pada penyelesaian pertama hari ini
The first statement mutates the original object to 15. The later local reassignment does not replace the caller reference.
Sebuah method mengembalikan new Student("Other"); tetapi pemanggil mengabaikan hasilnya. Apa yang terjadi pada variabel Student yang sudah ada di pemanggil?
Kesulitan 1/5 · 100 koin + bonus kecil pada penyelesaian pertama hari ini
Mengembalikan referensi tidak menugaskannya ke variabel pemanggil. Variabel yang sudah ada masih menunjuk ke objek aslinya.
Referensi vs. nilai:
void addTen(Student s) { s.addScore(10); }— mengubah objek yang dikirim (referensi berbagi).void addTen(int x) { x += 10; }—intpemanggil tidak berubah (nilai disalin).- Kedua nilai parameter disalin; hanya referensi salinan yang mencapai status mutabel yang dibagikan.
Terapkan penalaran ke kasus baru
- Bandingkan
return s;denganreturn new Student("Other");: yang pertama mengembalikan referensi yang diberikan; yang kedua mengembalikan objek yang baru dibuat. Keduanya tidak mengubah variabel pemanggil sampai pemanggil menetapkan hasilnya. - Untuk memprediksi perubahan, gambarlah pemanggil dan parameter sebagai variabel referensi terpisah yang menunjuk ke objek. Perbarui objek untuk panggilan mutator, dan perbarui hanya panah parameter untuk penetapan ulang parameter.
Mengirimkan referensi objek menyalin nilainya ke dalam parameter, sehingga metode dapat mengubah objek pemanggil; mengirimkan primitif menyalin nilainya, sehingga tidak bisa. Metode dapat mengembalikan referensi ke sebuah objek. Referensi ke tidak ada objek adalah null — memanggil metode instansi melalui itu menyebabkan NullPointerException, jadi periksa terlebih dahulu.