ลำดับการโหลดไฟล์คลาส
1. โหลดตัวแปรคงที่และบล็อกการเริ่มต้นแบบคงที่ของคลาสแม่ (ลำดับการดำเนินการถูกจัดเรียงตามลำดับ)
2. โหลดตัวแปรคงที่และบล็อกการเริ่มต้นแบบคงที่ที่เรียกใช้คลาสนี้
ตราบใดที่คลาสไม่ได้ถูกทำลายตัวแปรคงที่และบล็อกการเริ่มต้นแบบคงที่จะถูกดำเนินการเพียงครั้งเดียวและสองขั้นตอนนี้จะไม่ดำเนินการต่อไปในการดำเนินการที่ตามมาของคลาส
กระบวนการสร้างอินสแตนซ์ชั้นเรียน
อินสแตนซ์ของคลาสจะถูกสร้างขึ้นเฉพาะเมื่อมีการเรียกวิธีการใหม่
1. ตามลำดับของการโหลดไฟล์คลาสด้านบน (ข้ามขั้นตอนนี้หากมีการโหลดคลาส)
2. ตัวแปรที่ไม่คงที่และบล็อกการเริ่มต้นที่ไม่คงที่ของคลาสแม่
3. วิธีการก่อสร้างของชั้นเรียนหลัก
4. ตัวแปรที่ไม่คงที่และบล็อกการเริ่มต้นแบบไม่คงที่ของคลาสนี้
5. วิธีการก่อสร้างของชั้นเรียนนี้
4. เมื่อทำลายอินสแตนซ์ของชั้นเรียนก่อนอื่นจะทำลายส่วนย่อยของคลาสแล้วทำลายส่วนคลาสแม่
ทั้งวิธีการคงที่และวิธีการที่ไม่คงที่จะเรียกว่า
นั่นคือระบบจะไม่โทรและดำเนินการโดยอัตโนมัติ ดังนั้นผู้ใช้จะไม่ดำเนินการเมื่อไม่ได้เรียก ความแตกต่างที่สำคัญคือวิธีการคงที่สามารถเรียกได้โดยตรงด้วยชื่อคลาส (และวัตถุอินสแตนซ์สามารถทำได้) ในขณะที่วิธีที่ไม่คงที่สามารถเรียกได้หลังจากการสร้างอินสแตนซ์วัตถุ
แนวคิดที่เกี่ยวข้อง
คำหลักคงที่:
เป็นตัวดัดแปลงที่ใช้ในการแก้ไขสมาชิก (ตัวแปรสมาชิกและฟังก์ชั่นสมาชิก)
สมาชิกที่ได้รับการแก้ไขมีลักษณะดังต่อไปนี้:
โหลดเมื่อคลาสถูกโหลด (ทันทีที่มีการโหลดคลาสข้อมูลคงที่จะโหลดพื้นที่ในหน่วยความจำทันที)
หายไปเมื่อชั้นเรียนหายไปแสดงว่ามีวงจรชีวิตที่ยาวนานที่สุด
มากกว่าการดำรงอยู่ของวัตถุ (วัตถุหายไปคงที่ยังคงอยู่ที่นั่น)
การดำรงอยู่คงที่ก่อนวัตถุมีอยู่ในภายหลัง
แบ่งปันโดยวัตถุทั้งหมด
บันทึกพื้นที่หน่วยความจำ
เมื่อสมาชิกได้รับการแก้ไขแบบคงที่นอกเหนือจากการถูกเรียกโดยวัตถุแล้วมันยังสามารถเรียกได้โดยตรงโดยชื่อคลาส
การเขียน: ชื่อคลาส สมาชิกคงที่
หมายเหตุเกี่ยวกับการใช้งาน
วิธีการคงที่สามารถเข้าถึงสมาชิกคงที่เท่านั้น (วิธีการและตัวแปร)
วิธีที่ไม่คงที่สามารถเข้าถึงทั้งแบบคงที่และไม่คงที่
คำหลักนี้และคำหลักสุดยอดไม่สามารถเขียนด้วยวิธีการคงที่
เนื่องจากความสำคัญคงที่เหนือวัตถุสิ่งนี้จึงไม่สามารถปรากฏในวิธีการคงที่
ฟังก์ชั่นหลักเป็นแบบคงที่
PublicStaticVoidMain (String [] args) {}
เมื่อใดควรใช้สแตติก?
เราจำเป็นต้องเริ่มต้นจากสองด้าน: เนื่องจากเนื้อหาของการดัดแปลงแบบคงที่รวมถึงตัวแปรสมาชิกและฟังก์ชั่น
เมื่อใดที่จะกำหนดตัวแปรคงที่ (ตัวแปรคลาส)
เมื่อข้อมูลที่ใช้ร่วมกันปรากฏในวัตถุข้อมูลจะถูกแก้ไขแบบคงที่ ข้อมูลที่ไม่ซ้ำกันในวัตถุควรถูกกำหนดเป็นที่ไม่มีอยู่ในหน่วยความจำฮีป
เมื่อใดที่จะกำหนดฟังก์ชั่นคงที่
เมื่อไม่สามารถเข้าถึงข้อมูลที่ไม่คงที่ (ข้อมูลเฉพาะวัตถุ)) ฟังก์ชั่นสามารถกำหนดเป็นแบบคงที่
ข้อดีและข้อเสียคงที่
กำไร:
1. เก็บข้อมูลที่ใช้ร่วมกันในพื้นที่แยกต่างหากสำหรับวัตถุประหยัดพื้นที่ ไม่จำเป็นต้องจัดเก็บสำเนาหนึ่งชุดของแต่ละวัตถุ
2. สามารถเรียกได้โดยตรงโดยชื่อคลาส
ข้อเสีย:
1. วงจรชีวิตยาวเกินไป
2. ข้อ จำกัด การเข้าถึงเกิดขึ้น (การเข้าถึงแบบคงที่เท่านั้น)
โครงสร้างหน่วยความจำ
เมื่อโปรแกรม Java กำลังทำงานอยู่พวกเขาจำเป็นต้องจัดสรรพื้นที่ในหน่วยความจำ เพื่อปรับปรุงประสิทธิภาพการคำนวณพื้นที่ที่แตกต่างกันของพื้นที่ได้ถูกแบ่งออกเนื่องจากแต่ละพื้นที่มีวิธีการประมวลผลข้อมูลเฉพาะและวิธีการจัดการหน่วยความจำ
หน่วยความจำกอง
ใช้ในการจัดเก็บตัวแปรท้องถิ่นเมื่อใช้ข้อมูลพื้นที่ที่ครอบครองจะถูกปล่อยออกมาโดยอัตโนมัติ
หน่วยความจำกอง
อาร์เรย์และวัตถุ (เอนทิตี) อินสแตนซ์ที่สร้างผ่านใหม่จะถูกเก็บไว้ในหน่วยความจำฮีป (ตัวแปรสมาชิกถูกสร้างขึ้นด้วยการจัดตั้งวัตถุและมีอยู่ในหน่วยความจำฮีปที่วัตถุตั้งอยู่) แต่ละเอนทิตีมีค่าที่อยู่หน่วยความจำ (ตัวแปรอ้างอิงตามที่อยู่) ตัวแปรในเอนทิตีมีค่าเริ่มต้นเริ่มต้น เอนทิตีไม่ได้ใช้อีกต่อไปและจะถูกนำไปรีไซเคิลโดยนักสะสมขยะภายในเวลาที่ไม่แน่นอน (กลไกการรวบรวมขยะ)
พื้นที่วิธีการพื้นที่วิธีการท้องถิ่นลงทะเบียน
ตรวจสอบ
| คำสั่งซื้อ | ตัวแปรระดับสแตติกคลาสแม่ = 1 | คลาสหลักที่ไม่คงที่ตัวแปร = 1 | ตัวแปร subclass Static = 1 | ตัวแปรย่อยที่ไม่คงที่ = 1 |
|---|---|---|---|---|
| [คลาสแม่เรียกวิธีการคลาสแม่แบบสแตติก] | parent.pstaticMethod (); | |||
| การเริ่มต้นชั้นเรียนการเริ่มต้นของคลาสแม่ | 2 | |||
| การเริ่มต้นชั้นเรียนการเริ่มต้นแบบสแตติกคลาสสองบล็อกสอง | 3 | |||
| วิธีการคลาสแม่ | 4 | |||
| [subclass เรียกวิธีการแบบสแตติกคลาสย่อย] | เด็ก cstaticmethod (); | |||
| subclass เริ่มต้นบล็อกหนึ่งบล็อก | 5 | 2 | ||
| subclass เริ่มต้นบล็อกสองบล็อกสอง | 6 | 3 | ||
| วิธีการแบบสแตติกคลาสย่อย | 7 | 4 | ||
| 【อินสแตนซ์คลาสย่อย】 | เด็ก c = เด็กใหม่ (); | |||
| คลาสแม่เป็นบล็อกการเริ่มต้นที่ไม่คงที่ | 8 | 2 | ||
| คลาสหลักที่ไม่ได้เริ่มต้นบล็อกสองบล็อกสอง | 9 | 3 | ||
| ตัวสร้างคลาสหลัก | 10 | 4 | ||
| subclass ไม่เริ่มต้นบล็อกหนึ่งบล็อกหนึ่ง | 11 | 5 | 5 | 2 |
| subclass non-static Initialization บล็อกสอง | 12 | 6 | 6 | 3 |
| วิธีการก่อสร้างคลาสย่อย | 13 | 7 | 7 | 4 |
| 【คลาสหลักแบบอินสแตนซ์วัตถุคลาสย่อย】 | ผู้ปกครอง p = เด็กใหม่ (); | |||
| คลาสแม่เป็นบล็อกการเริ่มต้นที่ไม่คงที่ | 14 | 2 | ||
| คลาสหลักที่ไม่ได้เริ่มต้นบล็อกสองบล็อกสอง | 15 | 3 | ||
| ตัวสร้างคลาสหลัก | 16 | 4 | ||
| subclass ไม่เริ่มต้นบล็อกหนึ่งบล็อกหนึ่ง | 17 | 5 | 8 | 2 |
| subclass non-static Initialization บล็อกสอง | 18 | 6 | 9 | 3 |
| วิธีการก่อสร้างคลาสย่อย | 19 | 7 | 10 | 4 |
| คำสั่งซื้อ | ตัวแปรระดับสแตติกคลาสแม่ = 1 | คลาสหลักที่ไม่คงที่ตัวแปร = 1 | ตัวแปร subclass Static = 1 | ตัวแปรย่อยที่ไม่คงที่ = 1 |
|---|---|---|---|---|
| 【อินสแตนซ์คลาสย่อย】 | เด็ก c = เด็กใหม่ (); | |||
| การเริ่มต้นชั้นเรียนการเริ่มต้นของคลาสแม่ | 2 | |||
| การเริ่มต้นชั้นเรียนการเริ่มต้นแบบสแตติกคลาสสองบล็อกสอง | 3 | |||
| subclass เริ่มต้นบล็อกหนึ่งบล็อก | 4 | 2 | ||
| subclass เริ่มต้นบล็อกสองบล็อกสอง | 5 | 3 | ||
| คลาสแม่เป็นบล็อกการเริ่มต้นที่ไม่คงที่ | 6 | 2 | ||
| คลาสหลักที่ไม่ได้เริ่มต้นบล็อกสองบล็อกสอง | 7 | 3 | ||
| ตัวสร้างคลาสหลัก | 8 | 4 | ||
| subclass ไม่เริ่มต้นบล็อกหนึ่งบล็อกหนึ่ง | 9 | 5 | 4 | 2 |
| subclass non-static Initialization บล็อกสอง | 10 | 6 | 5 | 3 |
| วิธีการก่อสร้างคลาสย่อย | 11 | 7 | 6 | 4 |
| 【คลาสหลักแบบอินสแตนซ์วัตถุคลาสย่อย】 | ผู้ปกครอง p = เด็กใหม่ (); | |||
| คลาสแม่เป็นบล็อกการเริ่มต้นที่ไม่คงที่ | 12 | 2 | ||
| คลาสหลักที่ไม่ได้เริ่มต้นบล็อกสองบล็อกสอง | 13 | 3 | ||
| ตัวสร้างคลาสหลัก | 14 | 4 | ||
| subclass ไม่เริ่มต้นบล็อกหนึ่งบล็อกหนึ่ง | 15 | 5 | 7 | 2 |
| subclass non-static Initialization บล็อกสอง | 16 | 6 | 8 | 3 |
| วิธีการก่อสร้างคลาสย่อย | 17 | 7 | 9 | 4 |
| [คลาสแม่เรียกวิธีการคลาสแม่แบบสแตติก] | parent.pstaticMethod (); | |||
| วิธีการคลาสแม่ | 18 | |||
| [subclass เรียกวิธีการแบบสแตติกคลาสย่อย] | เด็ก cstaticmethod (); | |||
| วิธีการแบบสแตติกคลาสย่อย | 19 | 10 |
คลาสสาธารณะ Classtest {โมฆะคงที่สาธารณะหลัก (String args []) {system.out.println ("【การสร้างอินสแตนซ์ subclass 】 | เด็ก C = เด็กใหม่ ();"); เด็ก c = เด็กใหม่ (); System.out.println ("【คลาสพรีเมี่ยมอินสแตนซ์วัตถุย่อย subclass 】 | ผู้ปกครอง p = เด็กใหม่ ();"); ผู้ปกครอง p = เด็กใหม่ (); System.out.println ("[คลาสพรีเมี่ยมเรียกวิธีการคลาสแม่แบบคงที่] | parent.pstaticMethod ();"); parent.pstaticMethod (); System.out.println ("[subclass เรียกวิธี subclass static method] | child.cstaticmethod ();"); เด็ก cstaticmethod (); - คลาสสาธารณะ Classtest2 {โมฆะคงที่สาธารณะหลัก (String args []) {system.out.println ("[ประธานาธิบดีคลาสเรียกวิธีการคลาสแม่แม่] | parent.pstaticMethod ();"); parent.pstaticMethod (); System.out.println ("[subclass เรียกวิธี subclass แบบคงที่] | child.cstaticmethod ();"); เด็ก cstaticmethod (); System.out.println ("[subclass instantiation] | เด็ก c = เด็กใหม่ ();"); เด็ก c = เด็กใหม่ (); System.out.println ("【คลาสแม่แบบอินสแตนซ์วัตถุคลาสเด็ก】 | ผู้ปกครอง p = เด็กใหม่ ();"); ผู้ปกครอง p = เด็กใหม่ (); - พาเรนต์ระดับสาธารณะ {// ตัวแปรคลาสแม่แบบสแตติกคงที่ int m = 1; // คลาสหลักที่ไม่ใช่ตัวแปรคงที่ int n = 1; // คำสั่งคงที่บล็อก 1 คงที่ {M ++; // j ++; ตัวแปรระดับพาเรนต์ที่ไม่คงที่ไม่สามารถใช้ในบล็อกคำสั่งแบบคงที่ System.out.println ("Preperent คลาสการเริ่มต้นแบบคงที่บล็อก 1 |" + m); } // คำสั่งคงที่บล็อก 2 คงที่ {M ++; System.out.println ("Preperent Class Initialization Block 2 |" + M); } // constructor Public Parent () {M ++; n ++; System.out.println ("Preperent Class Constructor |" + M + "|" + N); } // บล็อกคำสั่ง nonstatic {M ++; n ++; System.out.println ("เป็นประธานระดับการเริ่มต้นแบบไม่คงที่บล็อก 1 |" + m + "|" + n); } // บล็อกคำสั่ง nonstatic {M ++; n ++; System.out.println ("เป็นประธานระดับการเริ่มต้นที่ไม่ใช่การเริ่มต้นบล็อก 2 |" + m + "|" + n); } // วิธีที่ไม่คงที่โมฆะ pmethod () {m ++; n ++; System.out.println ("เป็นผู้นำในการเรียนแบบไม่คงที่ |" + m + "|" + n); กลับ; } // วิธีการคงที่สาธารณะเป็นโมฆะ pstaticMethod () {m ++; // j ++; ไม่สามารถใช้ตัวแปรคลาสแม่แบบไม่คงที่ในวิธีการคงที่ system.out.println ("เป็นประธานวิธีการคงที่ |" + m); กลับ; } @Override void protected finalize () โยน throwable {super.finalize (); System.out.println ("ทำลายคลาสแม่ |"); - เด็กชั้นเรียนสาธารณะขยายพาเรนต์ {// ตัวแปรสแตติกคงที่ int i = 1; // ตัวแปรที่ไม่คงที่ int j = 1; // คำสั่งคงที่บล็อก 1 คงที่ {M ++; i ++; // j ++; ตัวแปรที่ไม่คงที่ไม่สามารถใช้ในบล็อกคำสั่งแบบคงที่ System.out.println ("subclass static initialization block 1" + "|" + m + "||" + i); } // คำสั่งคงที่บล็อก 2 คงที่ {M ++; i ++; System.out.println ("subclass static initialization block 2" + "|" + m + "||" + i); } // constructor Public Child () {M ++; n ++; i ++; J ++; System.out.println ("Subclass Constructor" + "|" + m + "|" + n + "|" + i + "|" + j); } // บล็อกคำสั่ง nonstatic {M ++; n ++; i ++; J ++; System.out.println ("subclass ที่ไม่ใช่การเริ่มต้นแบบคงที่บล็อกหนึ่ง" + "|" + m + "|" + n + "|" + i + "|" + j); } // บล็อกคำสั่ง nonstatic {M ++; n ++; i ++; J ++; System.out.println ("subclass ที่ไม่ใช่การเริ่มต้นแบบคงที่บล็อกสอง" + "|" + m + "|" + n + "|" + i + "|" + j); } // วิธีที่ไม่คงที่โมฆะ pmethod () {m ++; n ++; i ++; J ++; System.out.println ("subclass สืบทอดวิธีที่ไม่คงที่" + "|" + m + "|" + n + "|" + i + "|" + j); กลับ; } // วิธีการคงที่สาธารณะโมฆะคงที่ pstaticMethod () {// วิธีการคงที่ไม่สามารถสืบทอด M ++; i ++; // j ++; ตัวแปรที่ไม่คงที่ไม่สามารถใช้ในวิธีการคงที่ } // วิธีที่ไม่คงที่โมฆะสาธารณะ cmethod () {m ++; n ++; i ++; J ++; System.out.println ("subclass method non-static" + "|" + m + "|" + n + "|" + i + "|" + j); กลับ; } // วิธีการคงที่สาธารณะโมฆะคงที่ cstaticMethod () {m ++; i ++; // j ++; ตัวแปรที่ไม่คงที่ไม่สามารถใช้ในวิธีการแบบคงที่ system.out.println ("วิธีการแบบสแตติกคลาสย่อย" + "|" + m + "||" + i); กลับ; } @Override void protected finalize () โยน throwable {super.finalize (); System.out.println ("ทำลายคลาสย่อย |"); -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการวิเคราะห์ที่ครอบคลุมของกระบวนการโหลดคลาสใน Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้ได้ตลอดเวลาและบรรณาธิการจะตอบกลับทุกคนในเวลา รอคอยความคิดเห็นที่มีค่าของคุณ