ความหลากหลายใน Java: วิธีการโอเวอร์โหลดหรือแทนที่เมธอด

ความหลากหลายใน Java: วิธีการโอเวอร์โหลดหรือแทนที่เมธอด

วิธีการโอเวอร์โหลดและการแทนที่เป็นสองวิธีที่ 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
  • บทเรียนการเข้ารหัส
เกี่ยวกับผู้เขียน เจอโรม เดวิดสัน(ตีพิมพ์บทความ 22 บทความ)

เจอโรมเป็นพนักงานเขียนบทที่ MakeUseOf เขาครอบคลุมบทความเกี่ยวกับการเขียนโปรแกรมและลินุกซ์ เขายังเป็นคนที่กระตือรือร้นในการเข้ารหัสและคอยติดตามดูอุตสาหกรรม crypto อยู่เสมอ

เพิ่มเติมจาก Jerome Davidson

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก