Truyền và Trả về References
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| NullPointerException/nʌl ˈpɔɪntə ekˈsepʃn/ | Ngoại lệ con trỏ rỗng |
Thay đổi một đối tượng khác với việc gán lại một tham số
- Một người gọi tham chiếu đến một Student với điểm số 10. Phương thức thực thi s.addScore(5); sau đó s = new Student("Other");
- Điểm số của đối tượng chia sẻ ban đầu trở thành 15. Gán lại tham số cục bộ không thay đổi biến của người gọi, vì Java sao chép giá trị tham chiếu vào tham số.
Truyền một đối tượng vào phương pháp
- Java sao chép giá trị tham chiếu vào tham số phương thức; nó không sao chép đối tượng. Tham số của phương thức trỏ đến cùng một đối tượng như biến của người gọi.
- Do đó, những thay đổi mà phương thức thực hiện lên đối tượng là có thể nhìn thấy bởi người gọi. Cả tham số primitive lẫn tham số tham chiếu đều được truyền theo giá trị; tham chiếu được sao chép vẫn có thể truy cập vào đối tượng chia sẻ.
Primitive so với đối tượng làm tham số
- Một tham số primitive được sao chép — phương thức không thể thay đổi biến của người gọi. Đối với tham số đối tượng, tham chiếu được sao chép trỏ đến cùng một đối tượng — phương thức có thể làm thay đổi đối tượng đó.
changeInt(x)không thể thay đổix;student.addScore(10)thực sự thay đổi sinh viên đó. Hãy hỏi xem phương thức có làm thay đổi đối tượng chia sẻ hay chỉ gán lại tham số cục bộ của nó.
Trả về một đối tượng
- Một phương thức có thể trả về tham chiếu đến một đối tượng — người gọi sau đó chia sẻ nó.
public Student topStudent() { return best; }trả lại tham chiếu đếnbest. - Trả về
bestchia sẻ một đối tượng đã tồn tại. Ngược lại,return new Student("Copy");xây dựng một đối tượng mới và trả về tham chiếu của nó; một phương thức cũng có thể trả vềnull. Đọc biểu thức trả về trước khi quyết định xem trạng thái có được chia sẻ hay không.
Tham chiếu được sao chép, đối tượng được chia sẻ; nguyên tử được sao chép
Điểm của đối tượng thay đổi; primitive x thì không.
Khi bạn truyền một đối tượng vào một phương thức, phương thức nhận được...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Java sao chép giá trị tham chiếu vào một biến tham số riêng biệt. Hai tham chiếu này có thể truy cập cùng một đối tượng; việc tái phân bổ tham số không thay thế biến người gọi.
Một method có thể thay đổi biến int của caller bằng cách modifying tham số của nó.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Primitives được sao chép — int của caller không bị chạm tới.
Gọi phương thức thông qua một tham chiếu null sẽ gây ra...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
điểm null không trỏ vào đối tượng nào, vì vậy không có gì để gọi phương thức.
Một phương thức có thể trả về tham chiếu đến một đối tượng, mà người gọi sau đó sẽ dùng chung.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một phương thức có thể trả về một tham chiếu đối tượng đã tồn tại và chia sẻ đối tượng đó với người gọi. Một phương thức khác có thể xây dựng và trả về một đối tượng mới thay vào đó.
Để sử dụng an toàn một tham chiếu có thể là null, bạn nên kiểm tra trước...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Bảo vệ chống lại giá trị null trước khi gọi phương thức trên nó.
Mọi phương thức trả về tham chiếu Student phải trả về một đối tượng đã tồn tại từ trước.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Sai: return new Student("Other"); xây dựng và trả về một đối tượng mới.
Tham chiếu null
- Một tham chiếu trỏ đến không có đối tượng nào là
null. Gọi một instance method thông quanullsẽ ném ra NullPointerException. - Trả về
null(ví dụ: "not found") là phổ biến — người gọi phải kiểm tra xem có phải không. Hãy bảo vệ bằngif (s != null) { s.addScore(10); }trước khi sử dụng một tham chiếu có thể là null.
Truyền đối tượng sao chép giá trị tham chiếu — phương thức có thể thay đổi đối tượng của người gọi; truyền kiểu nguyên sinh sao chép giá trị — nó không thể. Vì vậy student.addScore(10) làm biến đổi đối tượng của người gọi, nhưng changeInt(x) để nguyên x của người gọi không thay đổi. Và gọi một phương thức thực thể thông qua null sẽ gây ra NullPointerException — hãy kiểm tra != null trước khi một tham chiếu có thể là null.
After the two statements, what is the original caller-referenced Student score?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
The first statement mutates the original object to 15. The later local reassignment does not replace the caller reference.
Một phương thức trả về new Student("Other"); nhưng người gọi bỏ qua kết quả. Variable Student đang có của người gọi sẽ xảy ra điều gì?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Trả về một tham chiếu không gán nó vào biến của hàm gọi. Biến hiện tại vẫn trỏ đến đối tượng ban đầu của nó.
Tham chiếu so với giá trị:
void addTen(Student s) { s.addScore(10); }— thay đổi đối tượng được truyền (tham chiếu chia sẻ).void addTen(int x) { x += 10; }—intcủa người gọi không thay đổi (giá trị bản sao).- Cả hai giá trị tham số đều được sao chép; chỉ tham chiếu được sao chép mới tiếp cận trạng thái có thể thay đổi chung.
Mở rộng suy luận sang trường hợp mới
- So sánh
return s;vớireturn new Student("Other");: cái đầu tiên trả về tham chiếu đã cung cấp; cái thứ hai trả về một đối tượng mới được tạo ra. Không có cái nào thay đổi biến của người gọi cho đến khi người gọi gán kết quả trở lại. - Để dự đoán sự thay đổi, hãy vẽ người gọi và tham số thành các biến tham chiếu riêng biệt trỏ đến các đối tượng. Cập nhật đối tượng cho lời gọi mutator, và cập nhật chỉ mũi tên tham số cho việc gán lại tham số.
Truyền tham chiếu đối tượng sao chép giá trị của nó vào tham số, vì vậy phương thức có thể thay đổi đối tượng của người gọi; truyền kiểu nguyên sinh sao chép giá trị, vì vậy nó không thể. Một phương thức có thể trả về tham chiếu tới một đối tượng. Một tham chiếu trỏ đến không có đối tượng nào là null — gọi phương thức thực thể thông qua nó sẽ gây ra NullPointerException, vì vậy hãy kiểm tra trước.