sách gpt4 ai đã đi

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

In lại 作者:搜寻专家 更新时间:2023-11-01 03:50:24 27 4
mua khóa gpt4 Nike

Hệ thống.ra声明为 public static final PrintStream ra.

但是你可以调用Hệ thống.setOut()Chỉ định lại nó.

嗯?如果它是 cuối cùng, điều này có thể xảy ra như thế nào?

(相同点适用于Hệ thống.inHệ thống.lỗi)

更重要的是,如果您可以改变 public static final 字段,就 cuối cùng 给您的保证(如果有的话)而言,这意味着什么? (我从来没有意识到也没有预料到 System.in/out/err 的行为是 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.

顺便说一句,实际上你可以通过反射来改变 cuối cùng 字段,方法是调用它们的 setAccessible(đúng) (或者使用 Không an toàn 方法).这种技术在反序列化过程中被 Hibernate 和其他框架等使用,但它们有一个局限性:在修改前看到 final 字段值的代码不能保证在修改后看到新值。所讨论的字段的特别之处在于它们不受此限制,因为它们由编译器以特殊方式处理。

"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/30061231/

27 4 0
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