ก่อนอื่นตัวต่อ: รหัสต่อไปนี้จะพิมพ์อะไร
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 ผมเชื่อว่านี่จะเป็นละเมิด3final
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.
Xfinal