1. ในการประกาศคลาส ให้ใช้คีย์เวิร์ดขยายเพื่อสร้างคลาสย่อยของคลาส คลาสประกาศว่าจะใช้อินเทอร์เฟซตั้งแต่หนึ่งอินเทอร์เฟซขึ้นไปผ่านการใช้คำหลัก
Extended หมายถึงการสืบทอดคลาสบางอย่าง หลังจากการสืบทอด คุณสามารถใช้เมธอดของคลาสพาเรนต์ หรือคุณสามารถแทนที่เมธอดของคลาสพาเรนต์ได้ Implements หมายถึงการใช้อินเทอร์เฟซหลายตัว โดยทั่วไปจะว่างเปล่าและจะต้องเขียนใหม่ก่อนจึงจะสามารถทำได้ ใช้แล้ว.
2. ขยายการสืบทอดคลาสหลัก ตราบใดที่คลาสไม่ได้รับการประกาศให้เป็นคลาสสุดท้ายหรือคลาสถูกกำหนดให้เป็นนามธรรม ก็สามารถสืบทอดได้ JAVA ไม่รองรับการสืบทอดหลายรายการ แต่สามารถนำไปใช้งานได้โดยใช้อินเทอร์เฟซ ต้องใช้ Inheritance สามารถสืบทอดคลาสได้เท่านั้น แต่ Implement สามารถใช้หลายอินเทอร์เฟซได้ เพียงคั่นด้วยเครื่องหมายจุลภาค
คัดลอกรหัสรหัส ดังต่อไปนี้:
คลาส A ขยาย B ดำเนินการ C, D, E
หลังจากที่ศึกษามาเป็นเวลานาน ในที่สุดฉันก็เข้าใจการใช้งานในวันนี้ จริงๆ แล้วมันก็ง่ายมาก เพียงแค่ดูตัวอย่างต่อไปนี้
แนวคิดบางประการเกี่ยวกับอินเทอร์เฟซ
<!--[ถ้า !supportLineBreakNewLine]-->
คัดลอกรหัสรหัส ดังต่อไปนี้:
นักวิ่งหน้าด้านสาธารณะ
-
รหัสภายใน = 1;
การวิ่งเป็นโมฆะ ();
-
อินเทอร์เฟซ Animal ขยาย Runner
-
เป็นโมฆะหายใจ ();
-
คลาสปลาดำเนินสัตว์
-
การรันโมฆะสาธารณะ ()
-
System.out.println("ปลากำลังว่ายน้ำ");
-
ช่องระบายอากาศสาธารณะ ()
-
System.out.println("ปลากำลังเดือดปุดๆ");
-
-
นามธรรม LandAnimal ดำเนินการสัตว์
-
ช่องระบายอากาศสาธารณะ ()
-
System.out.println("LandAnimal กำลังหายใจ");
-
-
คลาส Student ขยาย Person ใช้งาน Runner
-
-
การรันโมฆะสาธารณะ ()
-
System.out.println("นักเรียนกำลังดำเนินการ");
-
-
-
อินเทอร์เฟซใบปลิว
-
โมฆะบิน ();
-
คลาสเบิร์ดใช้ Runner, Flyer
-
การรันโมฆะสาธารณะ ()
-
System.out.println("นกกำลังวิ่ง");
-
โมฆะสาธารณะบิน ()
-
System.out.println("นกกำลังบิน");
-
-
คลาส TestFish
-
โมฆะคงที่สาธารณะหลัก (String args [])
-
ปลา f = ปลาใหม่ ();
อินท์เจ = 0;
เจ = Runner.ID;
เจ = f.ID;
-
-
หมายเหตุเกี่ยวกับการใช้งานอินเทอร์เฟซ:
ก. การใช้อินเทอร์เฟซคือการใช้วิธีการทั้งหมดของอินเทอร์เฟซ (ยกเว้นคลาสนามธรรม)
ข วิธีการในอินเทอร์เฟซเป็นแบบนามธรรม
ค. คลาสที่ไม่เกี่ยวข้องหลายคลาสสามารถใช้อินเทอร์เฟซเดียวกันได้ และคลาสหนึ่งสามารถใช้อินเทอร์เฟซที่ไม่เกี่ยวข้องหลายรายการได้
================================================== =========
ความแตกต่างระหว่างการขยายและการดำเนินการ
ขยายคือการสืบทอดคลาสผู้ปกครอง ตราบใดที่คลาสไม่ได้รับการประกาศให้เป็นคลาสสุดท้ายหรือคลาสถูกกำหนดให้เป็นนามธรรม ก็สามารถสืบทอดได้ JAVA ไม่รองรับการสืบทอดหลายรายการ แต่สามารถใช้งานได้โดยใช้อินเทอร์เฟซ ต้องใช้การสืบทอด สามารถสืบทอดได้เพียงคลาสเดียว แต่การนำไปใช้สามารถนำไปใช้ได้หลายอินเทอร์เฟซ เพียงคั่นด้วยเครื่องหมายจุลภาค
คลาส A ขยาย B ดำเนินการ C, D, E
คลาสประกาศว่าจะใช้อินเทอร์เฟซตั้งแต่หนึ่งอินเทอร์เฟซขึ้นไปผ่านการใช้คำหลัก ในการประกาศคลาส ให้สร้างคลาสย่อยของคลาสโดยใช้คีย์เวิร์ดขยาย
คัดลอกรหัสรหัส ดังต่อไปนี้:
ชื่อคลาสย่อยของคลาสขยายชื่อคลาสพาเรนต์ใช้ชื่ออินเทอร์เฟซ
-
-
================================================== =========
A a = new B(); เป็นผลให้ a เป็นอินสแตนซ์ของคลาส A และสามารถเข้าถึงได้เฉพาะวิธีการใน A เท่านั้น แล้ว A a = new A(); คืออะไร?
================================================== ========
คลาส B ขยาย A
หลังจากการสืบทอด สมาชิกหรือวิธีการบางอย่างที่ไม่พบในคลาสพาเรนต์มักจะถูกกำหนดไว้
A = ใหม่ B();
ไม่เป็นไร โหลดเลย
a เป็นอินสแตนซ์ของออบเจ็กต์คลาสพาเรนต์ ดังนั้นจึงไม่สามารถเข้าถึงสมาชิกใหม่หรือวิธีการที่กำหนดโดยคลาสย่อย
================================================== ========
หากกำหนดเช่นนี้:
คลาส A{
ฉัน;
โมฆะฉ(){}
-
คลาส B ขยาย A{
อินท์เจ;
เป็นโมฆะ f(){}//เขียนใหม่
เป็นโมฆะ g(){}
-
แล้ว:
B b = ใหม่ B();
b เป็นอินสแตนซ์ของอ็อบเจ็กต์คลาสย่อย ไม่เพียงแต่สามารถเข้าถึงคุณสมบัติและวิธีการของตัวเองเท่านั้น แต่ยังรวมถึงคุณสมบัติและวิธีการของคลาสพาเรนต์ด้วย สิ่งต่างๆ เช่น bi, bj, bf(), bg() ล้วนถูกกฎหมาย ในขณะนี้ bf() คือ f() ใน B เข้าถึงได้
A = ใหม่ B();
แม้ว่า a จะใช้ตัวสร้างของ B แต่มันจะกลายเป็นอินสแตนซ์ของอ็อบเจ็กต์คลาสพาเรนต์หลังจากอัปแคสต์ และไม่สามารถเข้าถึงคุณสมบัติและวิธีการของคลาสย่อยได้ ai,af() ถูกกฎหมาย แต่ aj,ag() ผิดกฎหมาย ในขณะนี้ การเข้าถึง af() กำลังเข้าถึง f() ใน B
================================================== ========
A a = new B(); จริงๆ แล้วคำสั่งนี้มี 3 กระบวนการ:
(1) ก ก;
ประกาศ a เป็นวัตถุคลาสพาเรนต์ ซึ่งเป็นเพียงข้อมูลอ้างอิงและไม่มีการจัดสรรพื้นที่
(2) อุณหภูมิ B = ใหม่ B();
อินสแตนซ์ของวัตถุคลาส B ถูกสร้างขึ้นผ่านตัวสร้างของคลาส B นั่นคือเตรียมใช้งาน
(3) ก = (A)อุณหภูมิ;
แปลงอุณหภูมิของวัตถุคลาสย่อยให้เป็นวัตถุคลาสที่ไม่เป็นพาเรนต์และกำหนดให้กับ a นี่คือการอัปโหลด (อัปคาสต์) ซึ่งมีความปลอดภัย
หลังจากสามกระบวนการข้างต้น a ได้กลายเป็นอินสแตนซ์ของคลาส A โดยสมบูรณ์
คลาสย่อยมักจะมีคุณสมบัติและเมธอดมากกว่าคลาสพาเรนต์ การอัปโหลดจะละทิ้งคลาสเหล่านั้นเท่านั้น ซึ่งปลอดภัย ในขณะที่การดาวน์โหลดในบางครั้งจะเพิ่มคลาสเหล่านั้น ซึ่งโดยปกติจะไม่ปลอดภัย
================================================== =========
af() ควรสอดคล้องกับวิธี f() ของคลาส B
หลังจากเรียก Constructor ให้สร้างอินสแตนซ์แล้ว ทางเข้าไปยังวิธีการที่เกี่ยวข้องก็ถูกกำหนดแล้ว
ตั้งแต่นั้นมา แม้ว่า a จะถูกอัปโหลดเป็นคลาส A แต่เมธอดที่ถูกแทนที่ f() ยังคงเป็นเมธอด f() ของ B นั่นคือแต่ละอ็อบเจ็กต์รู้ว่าควรเรียกเมธอดใด
A a1 = ใหม่ B();
A a2 = C ใหม่ ();
แม้ว่า a1 และ a2 จะเป็นวัตถุคลาส A ทั้งคู่ แต่ f() ตามลำดับนั้นแตกต่างกัน นี่คือศูนย์รวมของความหลากหลายที่กล่าวถึงในชั้นแรก
ปัญหาดังกล่าวได้รับการอธิบายไว้อย่างชัดเจนใน "แนวคิดการเขียนโปรแกรม Java"
การใช้งานโดยทั่วไปจะใช้อินเทอร์เฟซ Extended เป็นคลาสที่สืบทอดมา โดยทั่วไปอินเทอร์เฟซจะมีเพียงการประกาศเมธอด แต่ไม่มีคำจำกัดความ ดังนั้นจึงเหมาะสมสำหรับ Java ที่จะชี้ให้เห็นถึงการใช้งานอินเทอร์เฟซโดยเฉพาะ เนื่องจากการสืบทอดหมายความว่าคลาสพาเรนต์ได้ปรับใช้วิธีการ ในขณะที่อินเทอร์เฟซไม่ได้ใช้วิธีการของตัวเอง มีเพียงการประกาศเท่านั้น นั่นคือ ส่วนหัวของวิธีการไม่มีเนื้อหาของวิธีการ ดังนั้น คุณสามารถเข้าใจได้ว่าอินเทอร์เฟซเป็นคลาสย่อยที่ใช้การประกาศเมธอดของตน แทนที่จะสืบทอดเมธอดของมัน แต่เมธอดคลาสทั่วไปสามารถมีเนื้อความของเมธอดได้ ดังนั้นจึงสมเหตุสมผลกว่าที่จะเรียกมันว่าสืบทอด การนำเข้าแพ็คเกจสามารถใช้คลาสที่นำไปใช้งานทั้งหมดซึ่งไม่ใช่อินเทอร์เฟซในนั้น จากนั้นคุณตัดสินใจว่าจะใช้อินเทอร์เฟซหรือไม่ หากคุณต้องการใช้ คุณจะไม่สามารถเรียกใช้อินเทอร์เฟซโดยไม่ใช้งาน เนื่องจากอินเทอร์เฟซเป็นข้อกำหนด ซึ่งเป็นชุดของการประกาศเมธอดที่ไม่มีเนื้อหาของเมธอด ผมขอยกตัวอย่าง: อินเทอร์เฟซสามารถเปรียบเทียบได้กับโปรโตคอล ตัวอย่างเช่น ถ้าฉันบอกว่าโปรโตคอล "ฆ่า" คุณสามารถใช้มีดแมเชเทเพื่อใช้งานอินเทอร์เฟซนี้ได้ สำหรับวิธีการฆ่า มีดแมเชเต้ก็สามารถนำมาใช้ได้ แน่นอนว่าคุณสามารถใช้ Grab เพื่อใช้งานอินเทอร์เฟซการฆ่าได้ แต่คุณไม่สามารถใช้อินเทอร์เฟซการฆ่าเพื่อฆ่าผู้คนได้ เนื่องจากอินเทอร์เฟซการฆ่าเป็นเพียงคำอธิบายฟังก์ชันและโปรโตคอล วิธีการดำเนินการนั้นขึ้นอยู่กับคลาสการใช้งาน . ดังนั้นหากมีอินเทอร์เฟซในแพ็คเกจ คุณไม่จำเป็นต้องใช้งานมัน สิ่งนี้ไม่ส่งผลต่อการใช้คลาสอื่นของคุณ
ดำเนินการ
Implements เป็นคีย์เวิร์ดที่ใช้โดยคลาสเพื่อใช้อินเทอร์เฟซ ตัวอย่างเช่น: people คืออินเทอร์เฟซ และมีวิธีพูด ส่วนต่อประสานสาธารณะ people(){ public say();} แต่ส่วนต่อประสานไม่มีเนื้อความของวิธีการ เนื้อความของวิธีการสามารถนำไปใช้ผ่านคลาสที่ระบุเท่านั้น ตัวอย่างเช่น คลาสภาษาจีนใช้อินเทอร์เฟซบุคคล คลาสสาธารณะ ภาษาจีนดำเนินการ ผู้คน { public say() {System.out.println("Hello!");}}
ใน Java การดำเนินการหมายถึงคลาสย่อยสืบทอดคลาสพาเรนต์ ตัวอย่างเช่น คลาส A สืบทอดคลาส B และเขียนเป็นคลาส A นำไปใช้ B{}
ความแตกต่างจากการขยาย
ขยาย คุณสามารถใช้คลาสพาเรนต์ หรือคุณสามารถเรียกคลาสพาเรนต์เพื่อเริ่มต้น this.parent() และมันจะเขียนทับตัวแปรหรือฟังก์ชันที่กำหนดโดยคลาสพาเรนต์ ข้อดีของสิ่งนี้คือสถาปนิกสามารถกำหนดอินเทอร์เฟซและให้วิศวกรนำไปใช้ได้ ประสิทธิภาพการพัฒนาโครงการทั้งหมดและต้นทุนการพัฒนาลดลงอย่างมาก
นำไปใช้ ใช้คลาสพาเรนต์ และคลาสย่อยไม่สามารถแทนที่เมธอดหรือตัวแปรของคลาสพาเรนต์ได้ แม้ว่าคลาสย่อยจะกำหนดตัวแปรหรือฟังก์ชันเดียวกันกับคลาสพาเรนต์ คลาสก็จะถูกแทนที่ด้วยคลาสพาเรนต์
การใช้งานเฉพาะของการใช้งานทั้งสองนี้ขึ้นอยู่กับสถานการณ์จริงของโครงการและจำเป็นต้องดำเนินการ ไม่สามารถแก้ไขการใช้งานเฉพาะอินเทอร์เฟซที่กำหนดไว้เท่านั้น หรือสามารถปรับเปลี่ยนเพื่อให้มีการขยายการใช้งานที่ดี
<!--[สิ้นสุด]-->