ก่อนอื่นตัวต่อ: รหัสต่อไปนี้จะพิมพ์อะไร
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
ตอบ:
0
สปอยเลอร์ด้านล่าง
หากคุณพิมพ์X
ในขนาด (ยาว) และ Redefine X = scale(10) + 3
พิมพ์จะได้รับแล้วX = 0
X = 3
ซึ่งหมายความว่าX
มีการตั้งค่าชั่วคราวและการตั้งค่าในภายหลัง0
3
นี่เป็นการละเมิดfinal
!
ตัวดัดแปลงแบบคงที่ร่วมกับตัวดัดแปลงขั้นสุดท้ายใช้เพื่อกำหนดค่าคงที่ ตัวดัดแปลงสุดท้ายระบุว่าค่าของฟิลด์นี้ไม่สามารถเปลี่ยนแปลงได้
ที่มา: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [เน้นเพิ่ม]
คำถามของฉัน: นี่เป็นข้อผิดพลาดหรือไม่? เป็นfinal
ป่วยกำหนด?
นี่คือรหัสที่ฉันสนใจใน.
X
ได้รับมอบหมายสองค่าที่แตกต่างกันและ0
ผมเชื่อว่านี่จะเป็นละเมิด3
final
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
คำถามนี้ได้รับการตั้งค่าสถานะเป็นซ้ำเป็นไปได้ของการสั่งซื้อข้อมูลการเริ่มต้นครั้งสุดท้าย Java แบบคงที่ ฉันเชื่อว่าคำถามนี้ไม่ซ้ำกันเนื่องจากคำถามอื่น ๆ ตอบคำสั่งของการเริ่มต้นในขณะที่คำถามของฉันที่อยู่เริ่มต้นวงจรรวมกับfinal
แท็ก จากคำถามอื่น ๆ เพียงอย่างเดียวฉันจะไม่สามารถเข้าใจได้ว่าทำไมรหัสในคำถามของฉันจึงไม่ทำให้เกิดข้อผิดพลาด
สิ่งนี้ชัดเจนโดยเฉพาะอย่างยิ่งเมื่อดูผลลัพธ์ที่ ernesto ได้รับ: เมื่อa
ถูกแท็กด้วยfinal
เขาจะได้ผลลัพธ์ต่อไปนี้:
a=5
a=5
ซึ่งไม่เกี่ยวข้องกับส่วนหลักของคำถามของฉัน: final
ตัวแปรเปลี่ยนตัวแปรอย่างไร
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
X
final