sách gpt4 ai đã đi

java: "cuối cùng" System.out, System.in và System.err?

In lại Tác giả: IT Lao Gao Thời gian cập nhật: 2023-10-28 11:49:45 29 4
mua khóa gpt4 Nike

Hệ thống.raĐược tuyên bố là public static final PrintStream ra.

Nhưng bạn có thể gọiHệ thống.setOut()Chỉ định lại nó.

Ừm? trong trường hợp của cuối cùng, điều này có thể xảy ra như thế nào?

(Điểm tương tự cũng áp dụng cho Hệ thống.inHệ thống.lỗi)

Quan trọng hơn, nếu bạn có thể thay đổi một trường public static final, thì cuối cùng Điều này có ý nghĩa gì đối với chế độ bảo hành của bạn (nếu có)? (Tôi chưa bao giờ nhận ra hay mong đợi System.in/out/err hoạt động như thế nào cuối cùng biến đổi)

1 Câu trả lời

JLS 17.5.4 Ghi các trường được bảo vệ :

Thông thường, các trường tĩnh cuối cùng có thể không được sửa đổi. Tuy nhiên Hệ thống.in, Hệ thống.ra, Và Hệ thống.lỗi là các trường tĩnh cuối cùng, vì lý do cũ, phải được phép thay đổi bằng các phương pháp Hệ thống.setIn, Hệ thống.setOutHệ thống.setErr. Chúng tôi gọi những lĩnh vực này là được bảo vệ ghi để phân biệt chúng với các trường cuối thông thường.

Trình biên dịch cần xử lý các trường này khác với các trường final khác. Ví dụ, việc đọc một trường final thông thường là "miễn nhiễm" với đồng bộ hóa: rào cản liên quan đến khóa hoặc đọc dễ bay hơi không nhất thiết phải ảnh hưởng đến giá trị được đọc từ trường final. Vì giá trị của các trường được bảo vệ khi ghi có thể thay đổi, nên các sự kiện đồng bộ hóa phải có tác động đến chúng. Do đó, ngữ nghĩa chỉ ra rằng các trường này được coi là các trường bình thường không thể thay đổi bởi mã người dùng, trừ khi mã người dùng đó nằm trong Hệ thống lớp học.

Nhân tiện, bạn thực sự có thể thay đổi thông qua sự phản chiếu cuối cùng lĩnh vực bằng cách gọi setAccessible(đúng) (hoặc sử dụng Không an toàn phương pháp) ). Kỹ thuật này được Hibernate và các nền tảng khác sử dụng trong quá trình giải tuần tự hóa, nhưng chúng có một hạn chế: mã đã thấy giá trị trường cuối cùng trước khi sửa đổi không đảm bảo sẽ thấy giá trị mới sau khi sửa đổi. Điều đặc biệt về các trường được đề cập là chúng không bị hạn chế này vì chúng được trình biên dịch xử lý theo một cách đặc biệt.

"cuối cùng" System.out, System.in và System.err? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/5951464/

29 4 0
CNTT Lao Gao
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com