การเรียก super()
Constructor ควรเป็นบรรทัดแรกของ Constructor หรือไม่ ถ้าเป็นเช่นนั้นทำไม? เหตุใดฉันจึงไม่สามารถคำนวณแบบจำกัดง่ายๆ ก่อนการเรียกคอนสตรัคเตอร์ได้ เช่น การคำนวณพารามิเตอร์คอนสตรัคเตอร์
ฉันพบสถานการณ์ที่มีตัวสร้างคลาสภายในซึ่งสามารถเรียกได้ด้วยข้อกำหนดการปิด:
class A {
class Inner1 {
Inner1() {
// do something
}
}
}
class B {
A a1 = new A();
A a2 = new A();
class Inner2 extends A.Inner1 {
Inner2(boolean sel) {
(sel?a1:a2).super();
}
}
}
กรณีนี้แสดงว่าเราต้องการเลือกอินสแตนซ์ที่ล้อมรอบสำหรับตัวสร้างคลาสพื้นฐาน เหตุใดตรรกะในการคัดเลือกจึงควรมีจำกัด ทำไมไม่มีใครเขียนอะไรแบบนี้ได้
if( sel ) {
a1.super();
}
else {
a2.super();
}
เพิ่มเติม
จากคำถามของฉันฉันหมายถึงข้อจำกัดอาจเป็นเช่นในกรณีต่อไปนี้:
public class Base {
private final String content;
public Base(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
public class Derived extends Base {
public Derived(String content) {
super(String.format("Current value of content is %s.", getContent()));
}
}
ในกรณีหลังนี้ ฉัน:
1) ปฏิบัติตามข้อกำหนดของ super()
ที่จะอยู่ในบรรทัดแรก
2) ฝ่าฝืนคำสั่งก่อสร้าง
3) รับข้อผิดพลาดของคอมไพเลอร์ "ไม่สามารถอ้างถึงวิธีการอินสแตนซ์ในขณะที่เรียกใช้คอนสตรัคเตอร์อย่างชัดเจน"
เหตุใดเราจึงไม่สามารถยกเลิก "ข้อกำหนดบรรทัดแรก" และพึ่งพาเฉพาะข้อผิดพลาดเหมือนข้อสุดท้ายได้
super()
ต้องถูกวางเป็นบรรทัดแรกของการเรียกคอนสตรัคเตอร์หากคุณใช้ - แต่ตรวจสอบเธรดนี้: stackoverflow.com/questions/9675431/ หรือสิ่งนี้: stackoverflow.com/questions/1168345/ - person wkl   schedule 24.05.2012super()
Java จะหยุดโปรแกรมของคุณและบอกให้คุณแก้ไข - person Hunter McMillen   schedule 24.05.2012super()
ก่อนไม่ได้แก้ปัญหาทั้งหมดและสร้างปัญหาใหม่ๆ มากมาย มันเป็นการทำให้ง่ายขึ้น เพราะมันหมายความว่าเราไม่จำเป็นต้องแยกการจัดสรรอ็อบเจ็กต์และการเริ่มต้นออกเป็นสองส่วนแยกกัน และฉันคิดว่ามันจะหลีกเลี่ยงปัญหาประเภทหนึ่งที่จะเกิดขึ้นเป็นประจำ - person Voo   schedule 24.05.2012