วิธีการโอเวอร์โหลดและการแทนที่เป็นสองวิธีที่ Java แสดงให้เห็นถึงความหลากหลาย Polymorphism มาจากการรวมกันของคำภาษากรีกสองคำ: 'poly' หมายถึงจำนวนมากและ 'morph' หมายถึงรูปแบบ ดังนั้นความหลากหลายจึงทำให้วิธีการต่างๆ มีหลายรูปแบบ
ทำตามคำแนะนำนี้เพื่อเรียนรู้วิธีโอเวอร์โหลดหรือแทนที่เมธอดใน Java
วิธีการโอเวอร์โหลดคืออะไร?
'วิธีการโอเวอร์โหลด' หมายถึงการกำหนดวิธีการที่แตกต่างกันในคลาสที่มีชื่อเดียวกัน วิธีการต้องมีลายเซ็นที่แตกต่างกัน ลายเซ็นของเมธอดคือการรวมกันของชื่อเมธอดและรายการพารามิเตอร์ ไม่รวมประเภทการคืนสินค้า
คอมไพเลอร์รู้ว่าจะใช้วิธีการใดโดยการตรวจสอบประเภท จำนวนพารามิเตอร์ และลำดับของการจัดวาง
ที่เกี่ยวข้อง: สำรวจการสืบทอดในภาษาการเขียนโปรแกรม Java
วิธีการโอเวอร์โหลดแสดงให้เห็นถึงความหลากหลายในการคอมไพล์เวลา ความแตกต่างของเวลาคอมไพล์หมายความว่าคอมไพเลอร์ Java ผูกอ็อบเจ็กต์กับฟังก์ชันการทำงานที่รันไทม์ คอมไพเลอร์ตรวจสอบลายเซ็นเมธอดเพื่อให้บรรลุสิ่งนี้
ความหลากหลายประเภทนี้เรียกอีกอย่างว่าการผูกแบบคงที่หรือในช่วงต้น
ดูตัวอย่างวิธีการโอเวอร์โหลดด้านล่าง:
class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println('The cube of 5 is ' + myMultiplication.cube(5));
System.out.println('The cube of 5.0 is ' + myMultiplication.cube(5.0));
System.out.println('The cube of 0.5 is ' + myMultiplication.cube(0.5));
}
}
เอาท์พุท:
The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125
โค้ดด้านบนแสดงวิธีรับคิวบ์ประเภทต่างๆ ( int , สองเท่า , ลอย ) โดยใช้วิธีการเดียวกัน
โดยทั่วไป เมธอดโอเวอร์โหลดใช้เพื่อกำหนดเมธอดที่คล้ายคลึงกันกับพารามิเตอร์ประเภทต่างๆ
วิธีการเอาชนะคืออะไร?
นี้หมายถึงการใช้งานที่แตกต่างกันของวิธีการในคลาสย่อย ต้องกำหนดวิธีการไว้ในคลาสหลักแล้ว
วิธีการแทนที่ (เช่นหนึ่งในคลาสย่อย) ต้องมีลายเซ็นเมธอดเดียวกับในซูเปอร์คลาส ชนิดส่งคืนของวิธีการแทนที่อาจเป็นชนิดเดียวกันหรือชนิดย่อยของหนึ่งในซูเปอร์คลาส
การแทนที่โดยทั่วไปจะใช้เพื่อรวมการใช้งานเฉพาะของพฤติกรรมของอ็อบเจ็กต์ในคลาสย่อย
class Account{
public void message() {
System.out.println('
Thank you for opening an account with us!');
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println('
Thank you for opening a Savings account with us!');
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println('
Thank you for opening a Fixed Deposit account with us!');
}
}
เอาท์พุท:
Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!
ตัวอย่างข้างต้นแสดงให้เห็นว่า method ข้อความ() ถูกแทนที่ในคลาสย่อย ออมทรัพย์ และ เงินฝากประจำ . ข้อความที่แตกต่างกันจะปรากฏขึ้นสำหรับผู้ถือบัญชีธนาคารที่มีบัญชีออมทรัพย์และผู้ที่มีบัญชีเงินฝากประจำ
ที่เกี่ยวข้อง: สิ่งที่คุณต้องรู้เกี่ยวกับการใช้สตริงใน Java
นอกจากนี้ยังเป็นที่น่าสังเกตว่าการแทนที่วิธีการนั้นแสดงให้เห็นถึงความแตกต่างของรันไทม์หรือการส่งเมธอดแบบไดนามิก ซึ่งหมายความว่าเมธอดที่จะเรียกได้รับการแก้ไขตอนรันไทม์มากกว่าที่คอมไพล์
เพื่อหลีกเลี่ยงไม่ให้วิธีการถูกแทนที่ ให้ใช้คำสำคัญ สุดท้าย .
final void message (){
System.out.println('
Thank you for opening an account with us!');
}
เมื่อคลาสย่อยพยายามแทนที่ จะเกิดข้อผิดพลาดในการคอมไพล์
ตามหลักการแล้ว วิธีการทั้งหมดที่ถูกเรียกภายใน Constructor ควรเป็น สุดท้าย . ทั้งนี้เพื่อหลีกเลี่ยงการเปลี่ยนแปลงที่ไม่ได้ตั้งใจซึ่งอาจเกิดจากคลาสย่อย
บางครั้ง คุณอาจต้องเข้าถึงวิธีการแทนที่ภายในวิธีการแทนที่ คุณสามารถใช้คำสำคัญ สุดยอด ตามด้วยตัวดำเนินการจุด ( . ) และชื่อเมธอดในกรณีดังกล่าว
พิจารณาซูเปอร์คลาส สัตว์ .
class Animal{
public void move() {
System.out.println('
I can move.');
}
}
ด้านล่างเป็นคลาสย่อยที่เรียกว่า ปลา , ที่แทนที่ เคลื่อนไหว() :
class Fish extends Animal {
public void move() {
System.out.println('
I can swim.');
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}
เอาท์พุท:
คุณสามารถรับชมช่องท้องถิ่นบน roku
I can swim.
I can move.
เมื่อแทนที่เมธอด คุณต้องคำนึงถึงตัวแก้ไขการเข้าถึงที่ใช้ด้วย โมดิฟายเออร์ในคลาสย่อยควรมีระดับการมองเห็นเท่ากันหรือสูงกว่าในคลาสฐาน ตัวอย่างเช่น ถ้าเมธอดในคลาสฐานถูกกำหนดเป็น มีการป้องกัน จากนั้นวิธีการแทนที่อาจเป็น มีการป้องกัน หรือ สาธารณะ .
รหัสอย่างง่ายพร้อมความหลากหลาย
การแทนที่เมธอดและการโอเวอร์โหลดเป็นสิ่งสำคัญสำหรับการลดความซับซ้อนของโค้ด และโค้ดอย่างง่ายคือแนวปฏิบัติที่ดี
ทำไม? ลองนึกภาพ codebase ที่ซับซ้อนซึ่งมีรายละเอียดมากกว่า Grand Central Station ตอนนี้ลองนึกภาพแมลงทำลายล้างเริ่มทำลายการทำงานหนักของคุณต่อหน้าต่อตาคุณ คุณต้องแยกแหล่งที่มาของการติดเชื้อ และคุณจำเป็นต้องทำอย่างรวดเร็ว
โชคดี คุณไม่ได้ลดความซับซ้อนของโค้ด... ตอนนี้คุณกำลังจะได้รับบทเรียนที่แท้จริงเกี่ยวกับการเข้ารหัส การใช้โครงสร้างข้อมูลที่มีประสิทธิภาพและทำสิ่งที่คุณสามารถทำได้เพื่อย่อโค้ด (เช่น คำนึงถึง DRY) เป็นการป้องกันสถานการณ์เช่นนี้ได้ดีที่สุด
ถัดไปในรายการการเรียนรู้ Java ของคุณควรทำงานกับอาร์เรย์ เป็นโครงสร้างข้อมูลที่สำคัญที่ใช้เก็บกลุ่มจุดข้อมูล
แบ่งปัน แบ่งปัน ทวีต อีเมล วิธีสร้างและดำเนินการกับอาร์เรย์ใน Javaเรียนจาวา? ให้อาร์เรย์จัดการข้อมูลของคุณอย่างง่ายดาย
อ่านต่อไป หัวข้อที่เกี่ยวข้อง- การเขียนโปรแกรม
- Java
- บทเรียนการเข้ารหัส
เจอโรมเป็นพนักงานเขียนบทที่ MakeUseOf เขาครอบคลุมบทความเกี่ยวกับการเขียนโปรแกรมและลินุกซ์ เขายังเป็นคนที่กระตือรือร้นในการเข้ารหัสและคอยติดตามดูอุตสาหกรรม crypto อยู่เสมอ
เพิ่มเติมจาก Jerome Davidsonสมัครรับจดหมายข่าวของเรา
เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!
คลิกที่นี่เพื่อสมัครสมาชิก