Java Object-oriented: ที่นี่เราจัดระเบียบความรู้พื้นฐานของวัตถุที่มุ่งเน้นเพื่อช่วยให้ทุกคนเรียนรู้และเข้าใจ ฉันหวังว่ามันจะช่วยทุกคน นี่คือความรู้ที่เกี่ยวข้องที่รวบรวมจากข้อมูลการสัมภาษณ์ของ บริษัท :
ความแตกต่างระหว่างการโอเวอร์โหลดและการแทนที่ วิธี overloaded สามารถเปลี่ยนประเภทของค่าส่งคืนได้หรือไม่?
การโอเวอร์โหลดหมายถึงการโอเวอร์โหลดและการแทนที่หมายถึงการเขียนทับนั่นคือการเขียนใหม่ การโอเวอร์โหลดโอเวอร์โหลดหมายความว่าอาจมีหลายวิธีที่มีชื่อเดียวกันในคลาสเดียวกัน แต่รายการพารามิเตอร์ของวิธีการเหล่านี้แตกต่างกัน (เช่นจำนวนหรือประเภทของพารามิเตอร์แตกต่างกัน)
การเขียนซ้ำใหม่หมายความว่าวิธีการในคลาสย่อยอาจเหมือนกับชื่อและพารามิเตอร์ของวิธีการในคลาสพาเรนต์ เมื่อวิธีการนี้ถูกเรียกผ่านวัตถุอินสแตนซ์ที่สร้างโดย subclass วิธีการนิยามในคลาสย่อยจะถูกเรียกซึ่งเทียบเท่ากับการเขียนทับวิธีเดียวกันที่กำหนดไว้ในคลาสพาเรนต์ นี่คือการรวมตัวกันของความหลากหลายของการเขียนโปรแกรมเชิงวัตถุ
การแทนที่สามารถแปลได้ว่าเป็นการแทนที่ อย่างที่คุณสามารถรู้ได้อย่างแท้จริงมันเป็นการเอาชนะวิธีการและเขียนใหม่เพื่อให้ได้ฟังก์ชั่นที่แตกต่างกัน การแทนที่ที่คุ้นเคยมากที่สุดสำหรับเราคือการใช้วิธีการเชื่อมต่อ ในอินเทอร์เฟซวิธีการโดยทั่วไปจะมีการประกาศและเมื่อเรานำไปใช้เราจำเป็นต้องใช้วิธีการทั้งหมดของการประกาศอินเทอร์เฟซ นอกเหนือจากการใช้งานทั่วไปนี้เราอาจแทนที่วิธีการในชั้นเรียนหลักในการสืบทอด ประเด็นต่อไปนี้ควรให้ความสนใจในระหว่างการครอบคลุม:
1. โลโก้ของวิธีการซ้อนทับจะต้องตรงกับโลโก้ของวิธีการซ้อนทับเพื่อให้ได้ผลของการซ้อนทับ
2. ค่าส่งคืนของวิธีที่เขียนทับจะต้องสอดคล้องกับการส่งคืนของวิธีที่เขียนทับ;
3. ข้อยกเว้นที่ถูกโยนโดยวิธีการที่เขียนทับจะต้องสอดคล้องกับข้อยกเว้นที่ถูกโยนโดยวิธีการที่เขียนทับหรือเป็นคลาสย่อย;
4. วิธีที่เขียนทับไม่สามารถเป็นส่วนตัวไม่เช่นนั้นมีเพียงวิธีใหม่เท่านั้นที่กำหนดไว้ในคลาสย่อยและไม่ได้เขียนทับ
โอเวอร์โหลดสามารถแปลได้ว่าเป็นการโอเวอร์โหลดซึ่งหมายถึงการกำหนดวิธีบางอย่างด้วยชื่อเดียวกันแยกแยะวิธีการเหล่านี้โดยการกำหนดพารามิเตอร์อินพุตที่แตกต่างกันและจากนั้นเมื่อเรียกว่า VM จะเลือกวิธีที่เหมาะสมในการดำเนินการตามรูปแบบพารามิเตอร์ที่แตกต่างกัน เมื่อใช้การโอเวอร์โหลดโปรดให้ความสนใจกับประเด็นต่อไปนี้:
1. เมื่อใช้การโอเวอร์โหลดคุณสามารถผ่านสไตล์พารามิเตอร์ที่แตกต่างกันได้เท่านั้น ตัวอย่างเช่นประเภทพารามิเตอร์ที่แตกต่างกันจำนวนพารามิเตอร์ที่แตกต่างกันและคำสั่งพารามิเตอร์ที่แตกต่างกัน (แน่นอนพารามิเตอร์หลายประเภทในวิธีเดียวกันจะต้องแตกต่างกันตัวอย่างเช่นมันสามารถสนุกได้ (int, ลอย) แต่มันไม่สามารถสนุกได้ (int, int));
2. ไม่สามารถบรรทุกเกินพิกัดผ่านการอนุญาตการเข้าถึงประเภทการส่งคืนและข้อยกเว้นที่ถูกโยนทิ้ง
3. ประเภทข้อยกเว้นและจำนวนวิธีการจะไม่ส่งผลกระทบต่อการโอเวอร์โหลด
4. สำหรับการสืบทอดหากวิธีการมีสิทธิ์ในการเข้าถึงในชั้นเรียนหลักและเป็น priavte ก็จะไม่สามารถเกินพิกัดในคลาสย่อยได้ หากกำหนดไว้จะกำหนดวิธีการใหม่เท่านั้นและจะไม่บรรลุผลของการโอเวอร์โหลด
หากรายการพารามิเตอร์ของวิธีการโอเวอร์โหลดหลายวิธีแตกต่างกันประเภทของผู้ส่งคืนอาจแตกต่างกัน หากรายการพารามิเตอร์ของทั้งสองวิธีเหมือนกันทุกประการการโอเวอร์โหลดเกินพิกัดไม่สามารถทำได้โดยค่าส่งคืนที่แตกต่างกัน เราสามารถใช้วิธีการพิสูจน์ย้อนกลับเพื่อแสดงปัญหานี้ ตัวอย่างเช่นเมื่อเราเรียกวิธี MAP.REMOVE (คีย์) แม้ว่าวิธีการลบจะมีค่าส่งคืนเรามักจะไม่กำหนดตัวแปรที่ได้รับผลการส่งคืน ในเวลานี้สมมติว่ามีสองวิธีในคลาสนี้ที่มีชื่อและรายการพารามิเตอร์เดียวกันเพียงเพราะประเภทการส่งคืนแตกต่างกัน Java ไม่สามารถกำหนดวิธีการที่โปรแกรมเมอร์ต้องการโทรเพราะมันไม่สามารถตัดสินได้โดยการส่งคืนประเภทผลลัพธ์
ตัวสร้างสามารถแทนที่ได้หรือไม่?
ตัวสร้างคอนสตรัคเตอร์ไม่สามารถสืบทอดได้ดังนั้นการแทนที่ไม่สามารถแทนที่ได้ แต่การโอเวอร์โหลดสามารถโอเวอร์โหลดได้
อินเทอร์เฟซสามารถสืบทอดได้หรือไม่? คลาสนามธรรมสามารถใช้อินเทอร์เฟซได้หรือไม่? คลาสนามธรรมสามารถสืบทอดคลาสคอนกรีตได้หรือไม่? คลาสนามธรรมสามารถอยู่ได้หรือไม่? คลาสนามธรรมสามารถมีวิธีการหลักแบบคงที่ในคลาสนามธรรมได้หรือไม่?
อินเตอร์เฟสสามารถสืบทอดอินเทอร์เฟซ คลาสบทคัดย่อสามารถใช้งาน (ดำเนินการ) อินเทอร์เฟซ อาจมีวิธีการหลักแบบคงที่ในคลาสนามธรรม
ความแตกต่างเพียงอย่างเดียวระหว่างคลาสนามธรรมและคลาสสามัญคือพวกเขาไม่สามารถสร้างวัตถุอินสแตนซ์และอนุญาตวิธีการนามธรรม
เมื่อเขียนวิธีการโคลน () มักจะมีบรรทัดของรหัส มันคืออะไร?
วิธีการโคลน () คือการโคลนซึ่งหมายถึงการคัดลอกวัตถุ นั่นคือมีวัตถุ A อยู่แล้วซึ่งมีค่าที่ถูกต้องบางอย่าง แต่ถ้าคุณต้องการมีวัตถุ B และการเปลี่ยนแปลงใด ๆ เป็น B จะไม่ส่งผลกระทบต่อค่าใน A แต่ B ไม่ใช่วัตถุใหม่ที่ใหม่
คัดลอก: ①วัตถุคัดลอกส่งคืนวัตถุใหม่ไม่ใช่การอ้างอิง ②ความแตกต่างระหว่างการคัดลอกวัตถุและวัตถุที่ส่งคืนด้วยตัวดำเนินการใหม่คือสำเนานั้นมีข้อมูลของวัตถุต้นฉบับอยู่แล้วแทนที่จะเป็นข้อมูลเริ่มต้นของวัตถุ
โคลนมีพฤติกรรมเริ่มต้น super.clone (); เพราะก่อนอื่นสมาชิกในชั้นเรียนหลักจะต้องถูกคัดลอกเข้ามาแล้วสมาชิกของมันจะถูกคัดลอก
อะไรคือแง่มุมของคุณสมบัติเชิงวัตถุ
ภาษาการเขียนโปรแกรมเชิงวัตถุรวมถึงคุณสมบัติหลักสี่ประการ ได้แก่ การห่อหุ้ม, การสืบทอด, นามธรรม, และ polymorphism
1 แพ็คเกจ:
บรรจุภัณฑ์เป็นพื้นฐานสำหรับการรับรองว่าส่วนประกอบซอฟต์แวร์มีความเป็นโมดูลที่ยอดเยี่ยม เป้าหมายของบรรจุภัณฑ์คือการบรรลุ "การประสานงานสูงและการมีเพศสัมพันธ์ต่ำ" ของส่วนประกอบซอฟต์แวร์เพื่อป้องกันการเปลี่ยนแปลงที่เกิดจากการพึ่งพาซึ่งกันและกันของโปรแกรม ในภาษาการเขียนโปรแกรมเชิงวัตถุวัตถุเป็นหน่วยพื้นฐานที่สุดของการห่อหุ้มและการห่อหุ้มเชิงวัตถุนั้นชัดเจนและมีประสิทธิภาพมากกว่าการห่อหุ้มภาษาแบบดั้งเดิม การห่อหุ้มวัตถุที่เน้นวัตถุคือการห่อหุ้มรหัสที่อธิบายคุณสมบัติและพฤติกรรมของวัตถุใน "โมดูล" นั่นคือในชั้นเรียน คุณสมบัติถูกกำหนดโดยตัวแปรและพฤติกรรมถูกกำหนดโดยวิธีการ วิธีการสามารถเข้าถึงคุณสมบัติโดยตรงในวัตถุเดียวกัน โดยทั่วไปแล้วอย่าลืมใส่ตัวแปรและวิธีการเข้าถึงตัวแปรนี้เข้าด้วยกันกำหนดตัวแปรสมาชิกทั้งหมดในชั้นเรียนเป็นส่วนตัวและมีเพียงวิธีการของชั้นเรียนเท่านั้นที่สามารถเข้าถึงตัวแปรสมาชิกเหล่านี้ซึ่งโดยทั่วไปใช้การห่อหุ้มวัตถุ เข้าใจหลักการ: ใส่วิธีการและวิธีการที่เกี่ยวข้องที่ทำงานในสิ่งเดียวกันในคลาสเดียวกันและใส่วิธีการและข้อมูลที่ทำงานในคลาสเดียวกัน
2. บทคัดย่อ:
สิ่งที่เป็นนามธรรมคือการค้นหาความคล้ายคลึงกันและความสามัคคีของบางสิ่งจากนั้นจำแนกพวกเขาไว้ในชั้นเรียนที่พิจารณาเฉพาะความคล้ายคลึงกันและความสามัคคีของสิ่งเหล่านี้และไม่สนใจแง่มุมที่ไม่เกี่ยวข้องกับหัวข้อและเป้าหมายปัจจุบันและมุ่งเน้นไปที่แง่มุมที่เกี่ยวข้องกับเป้าหมายปัจจุบัน ตัวอย่างเช่นการเห็นมดและช้างและคุณสามารถจินตนาการได้ว่าพวกเขาเป็นอย่างไรนั่นคือสิ่งที่เป็นนามธรรม สิ่งที่เป็นนามธรรมรวมถึงสองด้าน: การเป็นนามธรรมเชิงพฤติกรรมและสิ่งที่เป็นนามธรรมของรัฐ ตัวอย่างเช่นกำหนดคลาสบุคคลดังนี้:
บุคคลในชั้นเรียน {ชื่อสตริง; อายุ int; - มนุษย์เป็นสิ่งที่ซับซ้อนมากและมีหลายแง่มุม แต่เนื่องจากระบบปัจจุบันต้องเข้าใจชื่อและอายุของบุคคลเท่านั้นชั้นเรียนที่กำหนดไว้ข้างต้นมีคุณลักษณะของชื่อและอายุเท่านั้น นี่คือสิ่งที่เป็นนามธรรม การใช้นามธรรมสามารถหลีกเลี่ยงการพิจารณารายละเอียดบางอย่างที่ไม่เกี่ยวข้องกับเป้าหมาย
3. มรดก:
เมื่อกำหนดและนำคลาสไปใช้สามารถทำได้ตามคลาสที่มีอยู่และเนื้อหาที่กำหนดโดยคลาสที่มีอยู่นั้นถูกนำมาเป็นเนื้อหาของตัวเองและสามารถเพิ่มเนื้อหาใหม่ได้หรือวิธีดั้งเดิมสามารถแก้ไขได้เพื่อให้เหมาะกับความต้องการพิเศษมากขึ้น นี่คือมรดก การสืบทอดเป็นกลไกที่คลาสย่อยจะแบ่งปันข้อมูลและวิธีการคลาสแม่โดยอัตโนมัติ นี่คือความสัมพันธ์ระหว่างคลาสซึ่งช่วยปรับปรุงความสามารถในการนำกลับมาใช้ใหม่และความสามารถในการปรับขนาดของซอฟต์แวร์
4 polymorphisms:
Polymorphism หมายถึงประเภทเฉพาะที่ชี้ไปโดยตัวแปรอ้างอิงที่กำหนดไว้ในโปรแกรมและวิธีการเรียกใช้วิธีที่ออกผ่านตัวแปรอ้างอิงจะไม่ได้รับการพิจารณาในระหว่างการเขียนโปรแกรม แต่จะถูกกำหนดในระหว่างการรันของโปรแกรมนั่นคือวัตถุอินสแตนซ์คลาสที่ตัวแปรอ้างอิงจะชี้ไปที่และวิธีการเรียนคลาสที่ออกโดยตัวแปรอ้างอิง เนื่องจากคลาสที่เฉพาะเจาะจงจะถูกกำหนดเฉพาะเมื่อโปรแกรมทำงานตัวแปรอ้างอิงสามารถผูกมัดกับการใช้งานคลาสที่แตกต่างกันโดยไม่ต้องแก้ไขรหัสโปรแกรมต้นทางซึ่งนำไปสู่วิธีการเฉพาะของการโทรอ้างอิงที่เปลี่ยนไปตามลำดับ นั่นคือรหัสเฉพาะที่ผูกไว้กับโปรแกรมที่รันโดยไม่ต้องแก้ไขรหัสโปรแกรมเพื่อให้โปรแกรมสามารถเลือกสถานะการรันหลายสถานะซึ่งเป็น polymorphism Polymorphism ช่วยเพิ่มความยืดหยุ่นและความยืดหยุ่นของซอฟต์แวร์ ตัวอย่างเช่น UserDao ในรหัสต่อไปนี้เป็นอินเทอร์เฟซที่กำหนดวัตถุอินสแตนซ์ที่ชี้ไปที่ตัวแปรอ้างอิง UserDao และถูกส่งคืนโดย daofactory.getDao () เมื่อดำเนินการ บางครั้งมันชี้ไปที่การใช้งานของ userjdbcdao และบางครั้งมันชี้ไปที่การใช้งานของ userhibernatedao ด้วยวิธีนี้คุณสามารถเปลี่ยนการใช้งานคลาสเฉพาะที่ชี้ไปที่ UserDAO โดยไม่ต้องแก้ไขซอร์สโค้ดซึ่งส่งผลให้รหัสเฉพาะของเมธอด userDao.Insertuser () เปลี่ยนไปตามลำดับ นั่นคือบางครั้งมันถูกเรียกว่าวิธีการแทรกของ userjdbcdao และบางครั้งก็เรียกว่าวิธีการแทรกของ userhibernatedao:
userdao userdao = daofactory.getDao (); userdao.insertuser (ผู้ใช้);
กลไกในการใช้ polymorphism ใน Java คืออะไร?
ตัวแปรอ้างอิงที่กำหนดโดยคลาสแม่หรืออินเตอร์เฟสสามารถชี้ไปที่วัตถุอินสแตนซ์ของคลาสย่อยหรือคลาสการใช้งานคอนกรีตและวิธีการที่เรียกโดยโปรแกรมจะถูกผูกไว้แบบไดนามิกในระหว่างการรันไทม์ มันเป็นวิธีที่หมายถึงวัตถุอินสแตนซ์เฉพาะที่ชี้ไปที่ตัวแปรนั่นคือวิธีการของวัตถุที่ทำงานในหน่วยความจำมากกว่าวิธีที่กำหนดไว้ในประเภทของตัวแปรอ้างอิง
ความแตกต่างระหว่างคลาสนามธรรมและอินเทอร์เฟซคืออะไร?
คลาสที่มีตัวดัดแปลงนามธรรมเป็นคลาสนามธรรมวัตถุอินสแตนซ์ที่ไม่สามารถสร้างได้โดยคลาสนามธรรม คลาสที่มีวิธีการนามธรรมจะต้องกำหนดเป็นคลาสนามธรรมและวิธีการในคลาสนามธรรมไม่จำเป็นต้องเป็นนามธรรม คำจำกัดความของวิธีการนามธรรมในคลาสคลาสนามธรรมจะต้องดำเนินการในคลาสย่อยคอนกรีตดังนั้นจึงไม่สามารถมีตัวสร้างนามธรรมหรือวิธีการคงที่แบบนามธรรม หาก subclass ไม่ได้ใช้วิธีการนามธรรมทั้งหมดในคลาสหลักที่เป็นนามธรรมคลาสย่อยจะต้องถูกกำหนดเป็นประเภทนามธรรม
อินเทอร์เฟซสามารถกล่าวได้ว่าเป็นกรณีพิเศษของคลาสนามธรรมและวิธีการทั้งหมดในอินเทอร์เฟซจะต้องเป็นนามธรรม คำจำกัดความของวิธีการในส่วนต่อประสานเริ่มต้นกับประเภทนามธรรมสาธารณะและประเภทตัวแปรสมาชิกในค่าเริ่มต้นอินเทอร์เฟซเป็นค่าเริ่มต้นสาธารณะคงที่
ความแตกต่างทางไวยากรณ์ระหว่างสอง:
1. คลาสบทคัดย่อสามารถมีวิธีการก่อสร้าง แต่ไม่ได้อยู่ในอินเทอร์เฟซ
2. อาจมีตัวแปรสมาชิกทั่วไปในคลาสนามธรรม แต่ไม่มีตัวแปรสมาชิกทั่วไปในอินเทอร์เฟซ
3. คลาสบทคัดย่อสามารถมีวิธีการทั่วไปที่ไม่ได้รับการรับรอง วิธีการทั้งหมดในอินเทอร์เฟซจะต้องเป็นนามธรรมและไม่สามารถไม่มีวิธีการธรรมดา
4. ประเภทการเข้าถึงของวิธีการนามธรรมในคลาสนามธรรมสามารถเป็นสาธารณะได้รับการปกป้องและ (ประเภทเริ่มต้นแม้ว่าจะไม่มีข้อผิดพลาดใน eclipse แต่ก็ไม่ควรใช้งานได้) แต่วิธีการนามธรรมในอินเทอร์เฟซอาจเป็นประเภทสาธารณะเท่านั้นและค่าเริ่มต้นคือประเภทนามธรรมสาธารณะ
5. คลาสบทคัดย่อสามารถมีวิธีการคงที่ แต่อินเทอร์เฟซไม่สามารถมีวิธีการคงที่
6. ทั้งคลาสนามธรรมและอินเทอร์เฟซสามารถมีตัวแปรสมาชิกคงที่ ประเภทการเข้าถึงของตัวแปรสมาชิกแบบคงที่ในคลาสนามธรรมสามารถเป็นไปได้ แต่ตัวแปรที่กำหนดไว้ในอินเทอร์เฟซสามารถเป็นแบบคงที่สาธารณะได้เท่านั้นและค่าเริ่มต้นคือประเภทสุดท้ายคงที่สาธารณะ
7. คลาสสามารถใช้หลายอินเทอร์เฟซ แต่สามารถสืบทอดคลาสนามธรรมหนึ่งคลาสเท่านั้น
ความแตกต่างระหว่างทั้งสองในแอปพลิเคชัน:
อินเทอร์เฟซมีบทบาทในวิธีการออกแบบสถาปัตยกรรมระบบส่วนใหญ่ใช้เพื่อกำหนดสัญญาการสื่อสารระหว่างโมดูล คลาสบทคัดย่อมีบทบาทในการใช้งานรหัสและสามารถตระหนักถึงการใช้รหัสซ้ำ ตัวอย่างเช่นรูปแบบการออกแบบวิธีการเทมเพลตเป็นแอปพลิเคชั่นทั่วไปของคลาสนามธรรม สมมติว่าคลาส servlet ทั้งหมดในโครงการบางโครงการจะต้องใช้วิธีเดียวกันเพื่อทำการตัดสินการอนุญาตบันทึกการเข้าถึงบันทึกและจัดการข้อยกเว้นจากนั้นคุณสามารถกำหนดคลาสพื้นฐานที่เป็นนามธรรมเพื่อให้ Servlets ทั้งหมดสามารถสืบทอดคลาสพื้นฐานที่เป็นนามธรรมนี้การตัดสินการอนุญาตการเข้าถึงบันทึกการเข้าถึงแต่ละรายการ รหัสหลอกมีดังนี้:
Public Abstract Class Baseservlet ขยาย httpservlet {บริการโมฆะสุดท้ายสาธารณะ (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น IOExcetion, servletexception {บันทึกการเข้าถึงบันทึกสำหรับการตัดสินการอนุญาตถ้า (ด้วยการอนุญาต) {ลอง {doservice Doservice (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น IOExcetion, ServleTexception; // โปรดทราบว่าการอนุญาตการเข้าถึงหมายถึงการป้องกันซึ่งดูเหมือนว่าทั้งมืออาชีพและเข้มงวดเพราะมันเป็น} คลาสสาธารณะ MyServlet1 ขยาย baseservlet {void doservice ที่ได้รับการป้องกันรหัสบางส่วนที่อยู่ตรงกลางของวิธีการคลาสแม่ไม่แน่นอนดังนั้นฉันจึงทิ้งไว้ในคลาสย่อยดังนั้นฉันจึงใช้วิธีการเทมเพลตในการออกแบบรูปแบบ
วิธีนามธรรมสามารถคงที่ในเวลาเดียวกันมันสามารถเป็นดั้งเดิมในเวลาเดียวกันและสามารถซิงโครไนซ์ในเวลาเดียวกันได้หรือไม่?
วิธีการของนามธรรมไม่สามารถคงที่เนื่องจากวิธีการนามธรรมจะต้องดำเนินการโดย subclasses และ Static ไม่มีส่วนเกี่ยวข้องกับคลาสย่อย!
วิธีการดั้งเดิมหมายความว่าวิธีการที่จะต้องนำไปใช้ในภาษาการเขียนโปรแกรมขึ้นอยู่กับแพลตฟอร์มอื่นและไม่มีปัญหาในการใช้งาน subclass ดังนั้นจึงไม่สามารถเป็นนามธรรมและไม่สามารถผสมกับนามธรรมได้ ตัวอย่างเช่นคลาส FileOutputSteam จะต้องจัดการกับฮาร์ดแวร์และการใช้งานพื้นฐานใช้การใช้งาน API ที่เกี่ยวข้องกับระบบปฏิบัติการ ตัวอย่างเช่นมันถูกนำไปใช้ในภาษา C ใน Windows ดังนั้นเมื่อดูที่ซอร์สโค้ดของ JDK คุณจะพบว่าคำจำกัดความของวิธีการเปิดของ FileOutputStream มีดังนี้: โมฆะดั้งเดิมเปิด (ชื่อสตริง) พ่น FilenotFoundException;
หากเราต้องการใช้ Java เพื่อเรียกฟังก์ชั่นภาษา C ที่เขียนโดยผู้อื่นเราไม่สามารถเรียกได้โดยตรง เราจำเป็นต้องเขียนฟังก์ชั่นภาษา C ตามข้อกำหนดของ Java และฟังก์ชั่นภาษา C ของเราจะเรียกฟังก์ชั่นภาษา C ของคนอื่น เนื่องจากฟังก์ชั่นภาษา C ของเราถูกเขียนขึ้นตามข้อกำหนดของ Java ฟังก์ชั่นภาษา C ของเราจึงสามารถเชื่อมต่อกับ Java ได้ วิธีการเชื่อมต่อบน Java คือการกำหนดวิธีที่สอดคล้องกับฟังก์ชัน C ของเรา วิธีการที่สอดคล้องกันใน Java ไม่จำเป็นต้องเขียนโค้ดเฉพาะ แต่จำเป็นต้องประกาศดั้งเดิมก่อนหน้านี้
สำหรับการซิงโครไนซ์วัตถุล็อคการซิงโครไนซ์ที่ใช้โดยการซิงโครไนซ์ซิงโครไนซ์บนวิธีนี้คือสิ่งนี้และวิธีนามธรรมไม่สามารถกำหนดสิ่งนี้ได้
คลาสภายในคืออะไร? คลาสซ้อนกันคงที่แตกต่างจากชั้นเรียนภายใน
คลาสภายในเป็นคลาสที่กำหนดไว้ในชั้นเรียน สมาชิกคงที่ไม่สามารถกำหนดในชั้นเรียนภายใน สมาชิกคงที่ไม่ใช่ลักษณะของวัตถุ พวกเขาเพียงแค่ต้องหาที่อยู่อาศัยดังนั้นพวกเขาจึงต้องอยู่ในชั้นเรียน คลาสภายในสามารถเข้าถึงตัวแปรสมาชิกโดยตรงในคลาสภายนอก คลาสภายในสามารถกำหนดไว้นอกวิธีการของคลาสภายนอกหรือในวิธีการของคลาสของคลาสภายนอกดังที่แสดงด้านล่าง:
ชั้นเรียนสาธารณะด้านนอก {int out_x = 0; วิธีโมฆะสาธารณะ () {inner1 inner1 = new inner1 (); คลาสสาธารณะ Inner2 // ชั้นเรียนที่กำหนดไว้ในตัววิธีการ {วิธีการสาธารณะ () {out_x = 3; }} inner2 inner2 = new inner2 (); } คลาสสาธารณะ inner1 // คลาสภายในที่กำหนดไว้นอกร่างกายวิธี {}} ประเภทการเข้าถึงของชั้นเรียนด้านในที่กำหนดไว้นอกร่างกายวิธีการสามารถสาธารณะได้รับการปกป้องและเริ่มต้นส่วนตัว นี่เป็นเหมือนตัวแปรสมาชิกที่กำหนดไว้ในชั้นเรียนมี 4 ประเภทการเข้าถึงซึ่งกำหนดว่าคำจำกัดความของคลาสชั้นในสามารถมองเห็นได้ในชั้นเรียนอื่น ๆ หรือไม่ ในกรณีนี้เรายังสามารถสร้างวัตถุอินสแตนซ์ของคลาสด้านในภายนอก เมื่อสร้างวัตถุอินสแตนซ์ของคลาสภายในเราต้องสร้างวัตถุอินสแตนซ์ของคลาสด้านนอกก่อนจากนั้นใช้วัตถุอินสแตนซ์ของคลาสด้านนอกเพื่อสร้างวัตถุอินสแตนซ์ของคลาสภายใน รหัสมีดังนี้:
Outer Outer = New Outer ();
OUTER.INNER1 Inner1 = OUTER.NEW InNner1 ();
ไม่สามารถมีตัวดัดแปลงประเภทการเข้าถึงก่อนที่คลาสด้านในที่กำหนดไว้ในวิธีการเช่นเดียวกับตัวแปรท้องถิ่นที่กำหนดไว้ในวิธีการ แต่สามารถใช้ตัวดัดแปลงสุดท้ายหรือนามธรรมได้ก่อนระดับชั้นใน คลาสภายในนี้ไม่สามารถมองเห็นได้สำหรับคลาสอื่น ๆ และไม่สามารถอ้างถึงคลาสภายในนี้ได้ แต่วัตถุอินสแตนซ์ที่สร้างขึ้นโดยคลาสภายในนี้สามารถส่งผ่านไปยังคลาสอื่นเพื่อเข้าถึง คลาสภายในประเภทนี้จะต้องกำหนดก่อนแล้วใช้นั่นคือรหัสคำจำกัดความของคลาสภายในจะต้องปรากฏขึ้นก่อนที่จะใช้คลาสซึ่งเหมือนกับหลักการที่ตัวแปรท้องถิ่นในวิธีจะต้องกำหนดก่อนแล้วใช้ คลาสด้านในนี้สามารถเข้าถึงตัวแปรท้องถิ่นใน Body Method แต่จะต้องเพิ่มตัวดัดแปลงสุดท้ายก่อนที่ตัวแปรท้องถิ่น
ใน Body Method, ไวยากรณ์ต่อไปนี้สามารถใช้เพื่อสร้างคลาสภายในที่ไม่ระบุชื่อนั่นคือในขณะที่กำหนดอินเทอร์เฟซหรือคลาสย่อยของคลาสบางส่วนวัตถุอินสแตนซ์ของคลาสย่อยจะถูกสร้างขึ้นโดยไม่ต้องกำหนดชื่อสำหรับคลาสย่อย:
ระดับสาธารณะชั้นนอก {โมฆะสาธารณะเริ่มต้น () {เธรดใหม่ (ใหม่ runable () {public void run () {};}). start (); - ในที่สุดคุณสามารถนำหน้าคลาสด้านในที่กำหนดไว้นอกวิธีการเพื่อเพิ่มคำหลักคงที่ในคลาสที่ซ้อนกันแบบคงที่ มันไม่มีลักษณะของชั้นเรียนภายในอีกต่อไป ทั้งหมดในความหมายแคบไม่ใช่ชั้นใน คลาสที่ซ้อนกันแบบสแตติกไม่แตกต่างกันในพฤติกรรมและฟังก์ชั่นของคลาสสามัญที่รันไทม์ แต่มีความแตกต่างบางประการในไวยากรณ์เมื่อมีการอ้างอิงการเขียนโปรแกรม มันสามารถกำหนดเป็นสาธารณะได้รับการปกป้องค่าเริ่มต้นส่วนตัวและประเภทอื่น ๆ ในขณะที่คลาสทั่วไปสามารถกำหนดเป็นแบบสาธารณะและประเภทเริ่มต้นเท่านั้น ชื่อของคลาสที่ซ้อนกันแบบคงที่ด้านนอกคือ "ชื่อคลาสภายนอกชื่อคลาสเรียน" คุณสามารถสร้างคลาสที่ซ้อนกันแบบคงที่โดยตรงโดยไม่ต้องสร้างวัตถุอินสแตนซ์ของคลาสภายนอกภายนอก ตัวอย่างเช่นหากภายในเป็นคลาสที่ซ้อนกันแบบคงที่ที่กำหนดไว้ในชั้นนอกคุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างคลาสภายใน:
OUTER.inner inner = new Outer.inner ();
เนื่องจากคลาสที่ซ้อนกันแบบคงที่ไม่พึ่งพาวัตถุอินสแตนซ์ของคลาสภายนอกคลาสที่ซ้อนกันแบบสแตติกสามารถเข้าถึงตัวแปรสมาชิกที่ไม่คงที่ของคลาสภายนอก เมื่อเข้าถึงคลาสซ้อนกันแบบคงที่ในคลาสภายนอกคุณสามารถใช้ชื่อของคลาสซ้อนกันแบบคงที่โดยไม่ต้องเพิ่มชื่อของคลาสภายนอก ในคลาสที่ซ้อนกันคงที่คุณยังสามารถอ้างถึงตัวแปรสมาชิกคงที่ของคลาสภายนอกโดยไม่ต้องเพิ่มชื่อของคลาสภายนอก
คลาสด้านในที่กำหนดไว้ในวิธีการคงที่ก็เป็นคลาสที่ซ้อนกันแบบคงที่ ในเวลานี้คุณไม่สามารถเพิ่มคำหลักคงที่ก่อนคลาส คลาสที่ซ้อนกันแบบคงที่ในวิธีการคงที่คล้ายกับวิธีการใช้งานของคลาสชั้นในในวิธีการทั่วไป นอกเหนือจากการเข้าถึงตัวแปรสมาชิกแบบคงที่โดยตรงในคลาสภายนอกแล้วยังสามารถเข้าถึงตัวแปรท้องถิ่นในวิธีการคงที่ อย่างไรก็ตามต้องเพิ่มตัวดัดแปลงสุดท้ายก่อนที่ตัวแปรท้องถิ่น
ชั้นในสามารถอ้างอิงสมาชิกของชั้นเรียนที่มีอยู่ได้หรือไม่? มีข้อ จำกัด หรือไม่?
ไม่เป็นไร หากไม่ใช่คลาสภายในแบบคงที่ไม่มีการ จำกัด !
หากคุณปฏิบัติต่อคลาสซ้อนกันแบบคงที่เป็นกรณีพิเศษของชั้นเรียนภายในในกรณีนี้คุณไม่สามารถเข้าถึงตัวแปรสมาชิกสามัญของชั้นนอก แต่มีสมาชิกคงที่ในชั้นนอกเท่านั้น ตัวอย่างเช่นรหัสต่อไปนี้:
ชั้นนอกชั้น {int คงที่ x; ชั้นเรียนคงที่ {void test () {syso (x); -คลาสภายในที่ไม่ระบุชื่อ (คลาสภายในที่ไม่ระบุชื่อ) สามารถขยาย (สืบทอด) คลาสอื่น ๆ และสามารถดำเนินการ (นำไปใช้) อินเตอร์เฟส (อินเตอร์เฟส) ได้หรือไม่?
คุณสามารถสืบทอดคลาสอื่น ๆ หรือใช้อินเทอร์เฟซอื่น ๆ ไม่เพียง แต่สามารถ แต่ต้อง!
ตัวอย่างเช่น:
นำเข้า java.util.date; การทดสอบระดับสาธารณะขยายวันที่ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การทดสอบใหม่ (). ทดสอบ (); } การทดสอบโมฆะสาธารณะ () {system.out.println (super.getClass (). getName ()); - ผลที่ได้คือการทดสอบ
ในวิธีการทดสอบวิธี getClass (). getName () เรียกว่าโดยตรงและชื่อคลาสทดสอบจะถูกส่งคืน เนื่องจาก getClass () ถูกกำหนดเป็นขั้นสุดท้ายในคลาสวัตถุคลาสย่อยไม่สามารถเขียนทับวิธีได้ ดังนั้นวิธีการเรียก getClass (). getName () ในวิธีการทดสอบจริง ๆ แล้วเรียกเมธอด getClass () ที่สืบทอดมาจากคลาสพาเรนต์ซึ่งเทียบเท่ากับการเรียกใช้เมธอด super.getClass (). getName () ดังนั้นวิธี super.getClass (). getName () ควรกลับมาทดสอบด้วย หากคุณต้องการรับชื่อของคลาสแม่คุณควรใช้รหัสต่อไปนี้:
getClass (). getSuperClass (). getName ();
อะไรคือความแตกต่างระหว่างวัตถุที่มุ่งเน้นและมุ่งเน้นกระบวนการ
1 จุดเริ่มต้นแตกต่างกัน วิธีการเชิงวัตถุคือการจัดการกับปัญหาของโลกวัตถุประสงค์ในวิธีที่สอดคล้องกับการคิดแบบดั้งเดิม มันเน้นว่าประเด็นสำคัญของโดเมนปัญหาจะถูกพาดพิงถึงอินเทอร์เฟซระหว่างวัตถุโดยตรง วิธีการที่มุ่งเน้นกระบวนการเน้นความเป็นนามธรรมและความเป็นโมดูลของกระบวนการซึ่งเป็นกระบวนการก่อสร้างที่เน้นกระบวนการเป็นศูนย์กลางหรือจัดการกับปัญหาโลกที่มีวัตถุประสงค์
2. วิธีการเชิงวัตถุใช้ตรรกะคอมพิวเตอร์เพื่อจำลองการมีอยู่จริงในโลกวัตถุประสงค์และใช้คลาสคอลเลกชันวัตถุเป็นหน่วยพื้นฐานสำหรับการจัดการปัญหาเพื่อให้โลกคอมพิวเตอร์ใกล้ชิดกับโลกวัตถุประสงค์มากที่สุดเท่าที่จะทำได้ วิธีการเชิงวัตถุใช้ลำดับชั้นของคลาสเพื่อสะท้อนการสืบทอดและการพัฒนาระหว่างคลาสในขณะที่วิธีการกระบวนการเชิงวัตถุจัดการกับปัญหากับหน่วยพื้นฐานที่ช่วยให้โมดูลที่ชัดเจนและแม่นยำแสดงกระบวนการใช้ลำดับชั้นของโมดูลเพื่อสรุปความสัมพันธ์และการทำงานระหว่างโมดูล
3 วิธีการประมวลผลข้อมูลแตกต่างจากวิธีโปรแกรมควบคุม วิธีการเชิงวัตถุห่อหุ้มข้อมูลและรหัสที่สอดคล้องกันในทั้งหมด โดยหลักการแล้ววัตถุอื่น ๆ ไม่สามารถแก้ไขข้อมูลได้โดยตรงนั่นคือการปรับเปลี่ยนวัตถุสามารถทำได้โดยฟังก์ชั่นสมาชิกของตนเองเท่านั้น วิธีโปรแกรมควบคุมคือการเปิดใช้งานและเรียกใช้โปรแกรมผ่าน "กิจกรรมขับเคลื่อน" กระบวนการเชิงวัตถุจะประมวลผลข้อมูลโดยตรงผ่านโปรแกรมและผลการประมวลผลจะปรากฏขึ้นหลังจากการประมวลผลเสร็จสมบูรณ์ ในแง่ของการควบคุมโปรแกรมโปรแกรมจะถูกเรียกหรือส่งกลับไปยังโปรแกรมตามการออกแบบและไม่สามารถนำทางได้ มีความสัมพันธ์ระหว่างโมดูลระหว่างการควบคุมและการควบคุมและการโทรและการโทร
4 การออกแบบการวิเคราะห์และการเข้ารหัสวิธีการแปลงนั้นแตกต่างกัน การวิเคราะห์วิธีการเชิงวัตถุตลอดวงจรชีวิตซอฟต์แวร์ ในการออกแบบและการเข้ารหัสมันเป็นกระบวนการที่ราบรื่น จากการวิเคราะห์ไปจนถึงการออกแบบและจากนั้นไปจนถึงการเข้ารหัสมันใช้แบบจำลองที่สอดคล้องกันเพื่อแสดงนั่นคือการเชื่อมต่อที่ราบรื่น วิธีการกระบวนการเชิงวัตถุเน้นการแปลงระหว่างการออกแบบการวิเคราะห์และการเข้ารหัสตามกฎและการวิเคราะห์และการออกแบบและการเข้ารหัสตลอดวงจรชีวิตซอฟต์แวร์จะทำได้
ข้อดีของการพัฒนาเชิงวัตถุคืออะไร
1 ประสิทธิภาพการพัฒนาที่สูงขึ้น การใช้การพัฒนาเชิงวัตถุสามารถเป็นนามธรรมของจริงและแมปแนวทางปฏิบัติจริงโดยตรงไปยังวัตถุที่พัฒนาแล้ว
2 ตรวจสอบความทนทานของซอฟต์แวร์ มันเป็นเพราะวิธีการพัฒนาเชิงวัตถุมีความสามารถในการนำกลับมาใช้ใหม่ได้สูง ในระหว่างกระบวนการพัฒนารหัสที่มีอยู่ที่ได้รับการทดสอบในสาขาที่เกี่ยวข้องได้ถูกนำมาใช้ซ้ำ ดังนั้นจึงมีบทบาทที่ดีในการส่งเสริมความทนทานของซอฟต์แวร์
3 ตรวจสอบการบำรุงรักษาซอฟต์แวร์ที่สูง เนื่องจากวิธีการพัฒนาเชิงวัตถุจึงสามารถอ่านได้ดีมาก ในเวลาเดียวกันรูปแบบการออกแบบเชิงวัตถุทำให้โครงสร้างรหัสชัดเจนขึ้น ในเวลาเดียวกันสำหรับรูปแบบการพัฒนาเชิงวัตถุมีรูปแบบการออกแบบที่เป็นผู้ใหญ่มากมายอยู่แล้ว รูปแบบการออกแบบเหล่านี้สามารถเปิดใช้งานโปรแกรมเพื่อปรับเปลี่ยนโมดูลบางอย่างเมื่อเผชิญกับการเปลี่ยนแปลงความต้องการเนื่องจากสะดวกกว่าในการบำรุงรักษา
อะไรคือความแตกต่างระหว่างสิ่งนี้กับซุปเปอร์
ในภาษา Java สิ่งนี้ชี้ไปที่วัตถุอินสแตนซ์ปัจจุบัน หนึ่งในฟังก์ชั่นที่สำคัญมากคือการแยกแยะตัวแปรสมาชิกของวัตถุจากพารามิเตอร์อย่างเป็นทางการของวิธีการ (เมื่อชื่อของวิธีการมีส่วนร่วมในตัวแปรสมาชิกตัวแปรสมาชิกจะถูกเขียนทับ)
Super สามารถใช้ในการเข้าถึงวิธีการหรือตัวแปรสมาชิกของคลาสแม่ เมื่อเมธอดหรือตัวแปรสมาชิกของคลาสเด็กมีชื่อเดียวกับคลาสแม่วิธีการหรือตัวแปรสมาชิกของคลาสแม่จะถูกเขียนทับ หากคุณต้องการเข้าถึงเมธอดหรือตัวแปรสมาชิกของคลาสแม่คุณสามารถเข้าถึงได้ผ่านคำหลัก Super เท่านั้น
วิธีรับชื่อคลาสของคลาสแม่
ภาษา Java มีวิธีการรับชื่อคลาส: getClass (). getName () นักพัฒนาสามารถเรียกวิธีนี้เพื่อรับชื่อคลาส อย่างไรก็ตามสำหรับการสืบทอดชื่อคลาสคลาสของพาเรนต์ไม่สามารถรับได้โดยการโทรหา getClass (). getName () วิธีการของคลาสแม่เช่น:
การทดสอบคลาส A {} ระดับสาธารณะขยายการทดสอบ {public void () {system.out.println (super.getClass (). getName ());} โมฆะคงที่สาธารณะ (สตริง []) args) {test.test ใหม่ ();}}}ผลการทำงานของโปรแกรมคือการทดสอบ เหตุผลก็คือคลาสใดในภาษา Java ที่สืบทอดมาจากคลาสวัตถุ วิธี getClass ถูกกำหนดให้เป็นเนทีฟสุดท้ายในคลาสวัตถุ คลาสย่อยไม่สามารถแทนที่วิธีนี้ได้ ดังนั้น this.getClass () และ super.getClass () ในที่สุดเรียกเมธอด getClass () ในคลาสวัตถุ คำจำกัดความของเมธอด getClass () ในคลาสวัตถุคือ: ส่งคืนคลาสรันไทม์ของวัตถุนี้ รหัสชื่อของคลาสแม่สามารถรับได้ในคลาสย่อยผ่านกลไกการสะท้อนของ Java ดังนี้:
การทดสอบคลาส A {} ระดับสาธารณะขยายการทดสอบ {public void () {system.out.println (this.getClass (). getSuperClass (). getName ());} publci โมฆะหลัก (สตริง [] args)อะไรคือความแตกต่างระหว่างการรวมกันและการสืบทอด
องค์ประกอบและการสืบทอดเป็นสองวิธีในการใช้รหัสซ้ำในวัตถุที่มุ่งเน้น การรวมกันหมายถึงการสร้างวัตถุของคลาสดั้งเดิมในคลาสใหม่และนำฟังก์ชั่นของคลาสที่มีอยู่กลับมาใช้ซ้ำ การสืบทอดเป็นหนึ่งในคุณสมบัติหลักของวัตถุที่มุ่งเน้นซึ่งช่วยให้นักออกแบบสามารถกำหนดการใช้งานคลาสตามการใช้งานของคลาสอื่น ๆ ทั้งองค์ประกอบและการสืบทอดอนุญาตให้ตั้งค่าวัตถุลูกในคลาสใหม่ยกเว้นองค์ประกอบที่แสดงในขณะที่การสืบทอดเป็นนัย มีการโต้ตอบระหว่างการรวมกันและการสืบทอด: คลาสทั้งหมดในองค์ประกอบสอดคล้องกับคลาสย่อยในการสืบทอดและคลาสท้องถิ่นในองค์ประกอบสอดคล้องกับคลาสหลักในการสืบทอด เมื่อใช้งานให้ทำตามหลักการสองประการต่อไปนี้:
1 หากไม่มีความสัมพันธ์ "IS-A" ระหว่างสองคลาสอย่าใช้การสืบทอดได้อย่างง่ายดายเพราะการใช้มรดกมากเกินไปจะทำลายการบำรุงรักษาของรหัส เมื่อคลาสหลักได้รับการแก้ไขมันจะส่งผลกระทบต่อคลาสย่อยทั้งหมดที่สืบทอดมาจากมัน
2. อย่าใช้การสืบทอดเพื่อให้บรรลุความหลากหลาย หากความสัมพันธ์ระหว่างคลาสไม่ใช่ "IS-A" คุณสามารถบรรลุวัตถุประสงค์เดียวกันได้โดยการใช้อินเทอร์เฟซและชุดค่าผสม
เนื่องจากภาษา Java รองรับการสืบทอดเดี่ยวเท่านั้นหากคุณต้องการสืบทอดคลาสสองชั้นขึ้นไปในเวลาเดียวกันจึงไม่สามารถนำไปใช้ได้โดยตรงใน Java ในเวลาเดียวกันในภาษา Java หากการสืบทอดมากเกินไปเนื้อหาในชั้นเรียนจะกลายเป็นป่อง ดังนั้นในภาษา Java หากคุณสามารถใช้ชุดค่าผสมให้พยายามอย่าใช้มรดก
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!