Contenu connexe Similaire à ג'אווה - תכנות מונחה עצמים - מתודות - דריסה/חפיפה, העמסה ומתודות בונות (8) ג'אווה - תכנות מונחה עצמים - מתודות - דריסה/חפיפה, העמסה ומתודות בונות2. מתודות דריסת–Method Overriding
כאשר מתודות דריסת של יישומים ראינו .הזדמנויות 'במס מתודות דריסת נושא את אחרת או זו בצורה הזכרנו ,כה עד
המתודות את הזכרנוfinalize()ו-equals()של ההגדרה בטווח כשדרסנו אנונימיות פנימיות מחלקות בנושא בפרק ,כן וכמו
בדוגמה :(תזכורת ייחודי אובייקט קבלת לשם הרחבנו אותה המחלקה של המתודות אחת את האנונימית הפנימית המחלקה
המתודה את דרסנו שראינוcout().)
במ חדשה מתודה להגדיר עלינו ,קיימת מתודה לדרוס מנת עלבעלת שתהה ,ממשק מממשת או ממחלקה שיורשת חלקה
אינה לדרוס מעוניינים אותה שהמתודה ובלבד הגדרתה את להחליף מעוניינים שאנו המתודה כמו בדיוק החתימה אותה
.)בהמשך (יוסבר סופית מתודה
:דוגמה נראה
public class BaseClass {
protected int getID(int number) {
return number*number+3;
}
}
public class DerivedClass extends BaseClass {
protected int getID(int number) {
return number+3;
}
}
הוגדרה שבו באופןgetIDהלוגיקה ורק )הכרחי תנאי ,(כאמור לחלוטין זהה המתודה של והחתימה היות ,היורשת במחלקה
היא כאשר ,שונה הפנימיתמחדש שהוגדרה המתודה ,היורשת מהמחלקה אובייקט על תופעל-ולא שתופעל זו היא נדרסה
את מחדש מגדירים ולא ,דריסה מבצעים היינו לא שאם כמובן .המקורית המתודהgetID,בה להשתמש יכולים היינו עדיין
.הבסיס ממחלקת שהגיעה זו הייתה שלה שההגדרה רק
super
השמורה המילה את להזכיר נכון ,זו בנקודהsuper.מתודות דריסת של בהקשר בה השימוש לגבי ולהסביר
השמורה המילה בפנינו נגישה הופכת ,יורשת מחלקה של הגדרתה בתחום נמצאים אנו כאשרsuperבצירוף ,בה שימוש .
.מרחיבה שלנו המחלקה אותה הבסיס מחלקת ומתודות משתני את בפנינו יחשוף אחריה מפרידה נקודה
מגדירים שאנו המחלקה אם שהרי ,מיותר הוא זו שמורה במילה ששימוש לחשוב כמובן נוכל ,לעומק כך על נחשוב לא אם
לג יכולים שאנו ידוע ,הבסיס מחלקת את מרחיבה כרגעהמילה בלי גם שלה ומתודות למשתנים שתsuperיהיה אכן והדבר ,
.חדשה מתודה ע"י דרסנו הגדרתה שאת במתודה מדובר כאשר :אחד במקרה מלבד המקרים בכל נכון
,בירושה שהגיעה המתודה לחתימת לחלוטין זהה המתודה וחתימת היות ,יורשת במחלקה מתודה דריסת שביצענו מרגע
במח למתודה הגישה.הדורסת המתודה ע"י מוסתרת להיות הופכת הבסיס לקת
3. השמורה המילה את לשלוף אז נוכל ,המקורית במתודה שימוש לעשות נרצה זאת ובכל במידהsuper:כך בה ולהשתמש
public class Human {
public void cout() {
System.out.println("I'm a Human!");
}
}
public class Person extends Human {
public void cout() {
super.cout();
System.out.println("But not just a Human, I'm a person too");
}
}
המתודה את נפעיל כאשר ,זה באופןcout()של אובייקט עלHuman:הפלט שורת את נקבל ,
I'm a Human!
המתודה את נפעיל וכאשרcout()של אובייקט עלPerson:הפלט שורות את נקבל ,
I'm a Human!
But not just a Human, I'm a person too
ה מבין הראשונה הפלט שורת-2הפעלת מעצם נובעת האחרונותcout()שלHuman:
super.cout();
של הגדרתה משאר ישירות נובעות השנייה הפלט ושורתcout()ב-Person:
System.out.println("But not just a Human, I'm a person too");
השמורה למילה שימושים עוד ישנםsuper.בהמשך אותם נזכיר ,
שנקראת טכניקה על לדבר ניתן ,המתחילים מהמתכנתים רבים בקרב לבלבול גורם ,מה משום אך ,לגמרי שונה באופן
העמסת:מתודות
4. העמסת-מתודות חפיפת–Method Overloading
שמקנה התנאי .אופנים 'במס זהה שם בעלות למתודות קריאה ולאפשר המתודה אותה של גרסאות 'מס לייצר באפשרותנו
.החופפות המתודות בחתימות שוני על שמירה הוא הזו היכולת את לנו
שהיא הפרמטרים 'מס ,המתודה משם מורכבת המתודה חתימת.המתודה של החזרה וערך סוגם ,מקבלת
שמות את לשנות מספיק לא ,כן וכמו בלבד שלהם החזרה בערך מזו זו שונות יהיו חופפות שמתודות מספיק לא :לב נשים
!המתודה שמקבלת הפרמטרים
הפרמטרים 'מס :הבאים מהשניים באחד לשוני נדאג אם ,השם אותו בעלות חופפות מתודות לייצר יכולים אנו,מקבלות שהן
שהמתודה הפרמטרים טיפוסי של ההופעה בסדר לשוני נדאג אם היא נוספת אופציה .מקבלות שהן הפרמטרים טיפוסי או
.מומלצת לא זו אופציה אך ,מקבלת
:שהוזכרו לאפשרויות בהתאם ,מתודות העמסת של למקרים דוגמאות נראה
public class ClassName {
public int getID(int number, char number2) {
return number*number+3;
}
public void getID(char number) { //Change in the number of the parameters
}
public int getID(int number) { //Change in the type of the parameter
return number*number+3;
}
public void getID(int number) { //Not enough changing only the return type
}
public int getID(char number2, int number) { //Not Recommended changing only d order
return number*number+3;
}
}
:הטכניקות שתי ,לראות שניתן כפידריסתו מתודותהעמסתכדי עד אפילו אולי ,מהשנייה האחת בתכליתן שונות מתודות
:מהשנייה האחת לחלוטין הפוכות
לחלוטין לה זהה תהה הדורסת המתודה שחתימת כך ,המקורית המתודה חתימת על לשמור עלינו ,מתודה לדרוס מנת על
.ירושה רמת בכל בלבד אחת פעם מתודה לדרוס ניתן ,מכך יוצא וכפועל
להעמ מנת עלמתודה כל של )המתודה שמקבלת הפרמטרים סוג או '(מס החתימות בין מהותי לשוני לדאוג עלינו ,מתודה יס
חתימות לבין שלה החתימה בין מהותי שוני יש עוד כל ,פעמים 'מס מתודה כל להעמיס ניתן ,כלומר ,שלידה מזו מועמסת
.שהועמסו האחרות המתודות
5. בונות מתודות-Constructors
מתבונות ודות–בראש ,אובייקט יצירת בעת .יצרנו עתה שזה אובייקט לאתחל ע"מ נועדו אשר מתודות הן ,קונסטרקטורים
לרשימת בהתאם ,בונה מתודה תופעל ,מכן לאחר מיד ,שלהם המחדל ברירת בערכי המופע משתני יאותחלו ובראשונה
תופ ,ערכים רשימת נשלחה לא אם .היצירה בעת שנשלחה הערכיםדפולטיבית בונה מתודה על–.פרמטרים ללא
אף ידינו על הוגדרה שלא בתנאי וזאת אוטומטי באופן תוגדר ,ידינו על תוגדר לא אם גם ,דפולטיבית בונה מתודה אותה
.פרמטרים מקבלת שכן כזו ,אחרת בונה מתודה
בונה מתודה לאפשר וברצוננו פרמטרים שמקבלת בונה מתודה ידינו על הוגדרה אםעלינו יהיה ,פרמטרים מקבלת שלא
.אוטומטי באופן תיווצר לא כבר היא ,וכאמור היות ידני באופן אותה להגדיר
!שהוא סוג משום חזרה ערך וללא גישה במציין מקודמת ,מוגדרת היא בה המחלקה כשם תמיד יהיה בונה מתודה של שמה
המחלקה עבור ,לדוגמהClassNameה ללא הבונה המתודה תוגדר:פרמטרים
public ClassName() {
}
הקונסטרקטורים בין שונות חתימות עפ"י ,רגילות מתודות לחפיפה ניתנות בו האופן באותו לחפיפה ניתנות בונות מתודות
פרמטרים ללא בונה מתודה עוד תיווצר לא ,יותר או אחד פרמטר עם בונה מתודה של הגדרה בעת ,כאמור .השונים
ועל ,דפולטיבית.מפורש באופן להגדירה עלינו יש ,כזו אחת של שירות לספק ברצוננו יש אם ,כן
,לדוגמה ,מהפרמטרים אלו אי לספק האובייקט ליוצר ולאפשר פרמטרים רשימת סמך על אובייקט לבנות נרצה ,לעתים
בין פרמטרים של 'מס כל לנו לשלוח למשתמש לאפשר מעוניינים ואנו ,משתנים ארבעה שלנו במחלקה0ל-4ובהתאם ,
.הפרמטרים שאר של ידנית השלמה תוך האובייקט את נבנה ,שנשלחו לפרמטרים
מתוך קריאה ולבצע הבונות המתודות של חפיפה לבצע צריכים אנו ,יישלחו פרמטרים כמה מראש יודעים לא ואנו היות
ל בהתאם ,התמונה את ונשלים נעטר אנו כשבדרך ,אחרת בונה למתודה הבונה המתודהלהציב מעוניינים שאנו ערכים
.מחדל כברירת
השמורה במילה שימוש באמצעות נעשית אחרת בונה מתודה מתוך בונה למתודה קריאהthisהפרמטרים ורשימת
.אחרת למתודה קוראים שהיינו כשם בדיוק ,בסוגריים
מחדל ברירת בערכי ומאתחלת ארבעה מתוך פרמטרים שני שמקבלת בונה מתודה למשל נגדיר:הנותרים השניים את
this(int a, int b, 1, 1);
הקוראת הבונה המתודה של הראשונה בשורה להיעשות חייבת שכזו קריאה.
שאר ,כלומר ,הקריאה התבצעה בה השורה לאחר מיד תמשיך התוכנית ,שנקראה הבונה המתודה של פעולתה סיום לאחר
.הקריאה התבצעה בו בבנאי הקוד קטע
האוב בהם במקריםשל בניה מתבצעת ,ראשית .מעט משתנה הפעולות סדר ,אחרת ממחלקה שיורשת ממחלקה נוצר ייקט
של הבנאי הפעלת ,ובסיומה הבסיס מחלקת של הבנאי של ברקע אוטומטית הפעלה כלומר ,הבסיס ממחלקת אובייקט
.היורשת המחלקה
של לבנאי נגיע לבסוף ,מורישות מחלקות לעוד בהיררכיה נעלה אם גם כךהמחלקהObject,ואחריו ,ראשון יופעל הוא ,
.אחרון שיופעל לבנות מנסים שאנו האובייקט של לבנאי עד הבנאים שאר יופעלו ,ההיררכיה במורד
6. שגיאת תתרחש ,כזה אחד קיים לא אם .פרמטרים מקבל שלא המחדל ברירת בנאי הוא אוטומטית שמופעל הבנאי
זו שגיאה לפתור מנת על .קומפילציה:דרכים משתי באחת לפעול ניתן
:פרמטרים ללא בנאי הבסיס מחלקת להגדרת להוסיף ,הראשונה
BaseClass() {
}
:המחדל ברירת מבנאי ששונה ,הבסיס במחלקת המוגדר לבנאי קריאה לבצע ,השנייה
super
השמורה המילה את שוב להזכיר נכון ,זו בנקודהsuper.בונות מתודות של בהקשר בה השימוש לגבי ולהסביר
השמורה במילה שימוש ע"י תתבצע הבסיס מחלקת של לבנאי קריאהsuper.
:לדוגמה הבא באופן תתבצע ,הבסיס במחלקת המחדל ברירת מבנאי שונה לבנאי קריאה
super(3,"to",6);
:לבנאי קריאה תתבצע זו בדרך
BaseClass(int a, String b, int c) {
}
.תתאפשר זו שקריאה כדי ,בה מוגדר להיות צריך שהוא וכמובן
:הבא באופן הבהירות לשם ורק אך תיעשה וזו פרמטרים ללא לבנאי קריאה לבצע גם ניתן
super();
.מפורשות אותה נציין לא אם גם אוטומטית בצורה ,כאמור ,שמתבצעת קריאה זוהי
בשורה להיעשות חייבת שכזו קריאההקוראת הבונה המתודה של הראשונה.
שימוש תוך במחלקה אחרת בונה למתודה קריאה שגם הגדרנו שהרי ,קונפליקט קיים שבתיאוריה מבינים אנו ,זו בנקודה
השמורה במילהthisהשמורה במילה שימוש תוך הבסיס ממחלקת בונה למתודה קריאה וגםsuperשתיהן חייבות ,
להיעשותהראשונה בשורהשלנשאלת ,כן אם ...אחת רק יש ראשונה ששורה לכולנו וברור ,הקוראת הבונה המתודה
?השפה בדרישות סתירה כאן אין האם ,השאלה
לא שזה כמובן אך ,כאחד וותיקים מתחילים תכניתנים נופלים אליה מלכודת במעין מדובר .שאין היא הברורה התשובה ,ובכן
כד לפעול עלינו כיצד שנבין ע"מ מספיקהנכון השימוש אופן את ראשית להבין עלינו יהיה ,כך לשם .זו במלכודת ליפול לא י
ע"י המחלקה אותה מתוך לבנאים בקריאהthisמאליו ברור יהיה ,יעיל באופן זו בטכניקה להשתמש כיצד שנבין לאחר .
.לעיל שתואר המלכודת למצב הפתרון
משתמש אנו בגינה הסיבה מהי ,עצמנו את נשאל ראשיתב ים-thisאם ?בנאי של הגדרתו מתוך אחר לבנאי קריאה לשם
.קוד בשורות חיסכון לשם נעשה שהדבר להסכים נוכל ,זו בטכניקה לשימוש האמתית הסיבה על לעומק נחשוב
תוך דפולטיביים ערכים אליו ישלחו הקונסטרקטורים ששאר זה יהיה פרמטרים הרבה הכי שמקבל שהבנאי הוא הרעיון
לו קריאהבאמצעותthisלבנאי ממנו לקרוא צורך כבר אין ,הפרמטרים כל את שמקבל זה והוא היות ,הגדרתו שבתחום כך ,
ב בשימוש צורך באמת אין ,כן ועל ,פחות משוכלל-thisל שיקרא זה יהיה הוא ולכן בהגדרתו-superאת פתרנו ובכך
.הבעיה
7. :הנ"ל להסבר מימוש נראה
public class BaseClass {
BaseClass() {
}
}
public class DerivedClass extends BaseClass {
DerivedClass() {
this(0,0,0);
}
DerivedClass(int i) {
this(i,0,0);
}
DerivedClass(int i, int j) {
this(i,j,0);
}
DerivedClass(int i, int j, int k) {
super();
}
}