ݺߣ

ݺߣShare a Scribd company logo
ג'אווה - תכנות מונחה עצמים - משתנים מטיפוס מחלקה והמרת טיפוסים למעלה/למטה
‫משתנ‬‫ים‬‫מחלקה‬ ‫מטיפוס‬-Class type Variables
:‫הבאות‬ ‫ההגדרות‬ ‫וקיימות‬ ‫בהנחה‬
public interface InterfaceName {}
public class ClassNameA {}
public class ClassNameB extends ClassNameA implements InterfaceName {}
:‫בלבד‬ ‫טיפוסים‬ ‫משלושה‬ ‫מאחד‬ ‫להיות‬ ‫יכול‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫את‬ ‫להכיל‬ ‫שמיועד‬ ‫המשתנה‬
‫הראשון‬,‫המחלקה‬ ‫מטיפוס‬:‫הטריוויאלי‬ ‫הטיפוס‬ ‫זהו‬ ,‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫אנו‬ ‫ממנה‬
ClassNameB cnb=new ClassNameB();
‫השני‬,‫למחלקה‬ ‫שמורישה‬ ‫מחלקה‬ ‫מטיפוס‬‫מטיפ‬ ‫כלומר‬ ,‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫אנו‬ ‫ממנה‬‫ממנה‬ ‫שהמחלקה‬ ‫מחלקה‬ ‫וס‬
.‫הגדרתה‬ ‫את‬ ‫מרחיבה‬ ‫האובייקט‬ ‫את‬ ‫יוצרים‬
ClassNameA cna=new ClassNameB();
‫השלישי‬,‫המחלקה‬ ‫אותו‬ ‫ממשק‬ ‫מטיפוס‬‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫ממנה‬‫מיישמת‬.
InterfaceName in=new ClassNameB();
‫(הרפרנס‬ ‫החזרה‬ ‫ערך‬ ‫את‬ ‫שנציב‬ ‫לאחר‬‫(בהתאם‬ ‫שלו‬ ‫למאפיינים‬ ‫לגשת‬ ‫יהיה‬ ‫ניתן‬ ,‫לכך‬ ‫המיועד‬ ‫במשתנה‬ )‫לאובייקט‬
:‫כך‬ ‫לדוגמה‬ ,)‫מתודה‬ ‫או‬ ‫(משתנה‬ ‫המאפיין‬ ‫ושם‬ ‫מפרידה‬ ‫נקודה‬ ,‫המשתנה‬ ‫שם‬ ‫ציון‬ ‫ע"י‬ )‫גישה‬ ‫להרשאות‬
objectName.methodName();
‫ה‬ ‫ממנו‬ ‫בטיפוס‬ ‫שהוגדרו‬ ‫למאפיינים‬ ‫ורק‬ ‫אך‬ ‫לגשת‬ ‫יכול‬ ‫משתנה‬ ‫של‬ ‫סוג‬ ‫שכל‬ ‫לב‬ ‫לשים‬ ‫יש‬‫אובייקט‬ ‫לאיזה‬ ‫קשר‬ ‫מבלי‬ ‫נוצר‬ ‫וא‬
.‫מחזיק‬ ‫הוא‬
.‫האחרונה‬ ‫הדוגמה‬ ‫את‬ ‫מעט‬ ‫נעבה‬ ‫יותר‬ ‫טוב‬ ‫הנושא‬ ‫את‬ ‫להבין‬ ‫מנת‬ ‫על‬
‫תרשים‬ ‫מתוך‬UML:‫נתון‬
:‫הבאות‬ ‫ההגדרות‬ ‫שקיימות‬ ‫להבין‬ ‫נוכל‬
public interface InterfaceName {
public abstract void interfaceMethod();
}
public class ClassNameA {
int classNameAVar;
}
public class ClassNameB extends ClassNameA implements InterfaceName {
int classNameBVar;
public void interfaceMethod () {
}
}
‫ב‬ ‫וכי‬-Runner.)'‫וכד‬ ‫אובייקטים‬ ‫(יצירת‬ ‫והממשק‬ ‫למחלקות‬ ‫תלות‬ ‫קשרי‬ ‫על‬ ‫המעידים‬ ‫שימושים‬ ‫נעשים‬
‫לכל‬ ‫גישה‬ ‫שתהיה‬ ‫כך‬ ,‫נוצר‬ ‫הוא‬ ‫ממנה‬ ‫המחלקה‬ ‫מסוג‬ ‫במשתנה‬ ‫נציב‬ ‫אליו‬ ‫הרפרנס‬ ‫שאת‬ ‫אובייקט‬ ‫ויצרנו‬ ‫נניח‬ ,‫כעת‬
:‫במחלקה‬ ‫שהוגדרו‬ ‫המאפיינים‬
ClassNameB cnb=new ClassNameB();
‫אובייקטים‬ ‫ניצור‬ ‫לא‬ ,‫מכאן‬:‫קודם‬ ‫שהוצגו‬ ‫האפשריים‬ ‫מהסוגים‬ ‫במשתנים‬ ‫שיצרנו‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫את‬ ‫נפיץ‬ ‫אלא‬ ,‫חדשים‬
ClassNameA cna = cnb;
InterfaceName in = cnb;
‫מחלקה‬ ‫מסוג‬ ‫אובייקט‬ ‫בידנו‬ ‫יש‬ ,‫זאת‬ ‫משעשינו‬ClassNameB‫שהרפרנס‬‫שהצגנו‬ ‫המשתנים‬ ‫טיפוסי‬ ‫בשלושת‬ ‫מוכל‬ ‫אליו‬
‫המשתנים‬ ‫שלושת‬ ,‫כלומר‬ ,‫הקודמת‬ ‫בדוגמה‬in, cna, cnb‫מהם‬ ‫אחד‬ ‫כל‬ ‫של‬ ‫הגישה‬ ‫אך‬ ,‫האובייקט‬ ‫לאותו‬ ‫מתייחסים‬
:‫נוצרו‬ ‫הם‬ ‫מהם‬ ‫הטיפוסים‬ ‫מהגדרות‬ ‫אחת‬ ‫בכל‬ ‫הוגדרו‬ ‫מאפיינים‬ ‫לאילו‬ ‫בהתאם‬ ‫תהיה‬ ‫האובייקט‬ ‫של‬ ‫למאפיינים‬
‫המשתנה‬in‫המתודה‬ ‫את‬ ‫רק‬ "‫"לראות‬ ‫יכול‬interfaceMethod()‫מהטיפוס‬ ‫שמגיעה‬ ‫היחידה‬ ‫והיא‬ ‫היות‬InterfaceName
:‫נוצר‬ ‫הוא‬ ‫ממנו‬
in.interfaceMethod();
‫המשתנה‬cna‫המשתנה‬ ‫את‬ ‫רק‬ "‫"לראות‬ ‫יכול‬classNameAVar‫מהטיפוס‬ ‫שמגיע‬ ‫היחיד‬ ‫והוא‬ ‫היות‬ClassNameA‫הוא‬ ‫ממנו‬
:‫נוצר‬
cna.classNameAVar=0;
‫המשתנה‬cnb‫המשתנה‬ ‫את‬ "‫"לראות‬ ‫יכול‬classNameBVar‫במחלקה‬ ‫מוגדר‬ ‫והוא‬ ‫היות‬ClassNameB,‫נוצר‬ ‫הוא‬ ‫ממנה‬
‫המשתנה‬ ‫את‬ "‫"לראות‬ ‫יכול‬ ‫הוא‬ ,‫כן‬ ‫כמו‬classNameAVar‫מהמחלקה‬ ‫יורש‬ ‫והוא‬ ‫היות‬ClassNameA,
‫המתודה‬ ‫את‬ "‫"לראות‬ ‫יכול‬ ‫והוא‬interfaceMethod()‫הממשק‬ ‫את‬ ‫מממש‬ ‫והוא‬ ‫היות‬InterfaceName:
cnb.interfaceMethod();
cnb.classNameAVar=0;
cnb.classNameBVar=0;
‫האפשריים‬ ‫המשתנים‬ ‫מטיפוסי‬ ‫אחד‬ ‫בכל‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫להצבת‬ ‫סיבות‬ ‫מעט‬ ‫לא‬ ‫יש‬‫שעומדת‬ ‫ללוגיקה‬ ‫בהתאם‬ ‫המשתנות‬
‫לחלק‬ ‫הגישה‬ ‫את‬ "‫"להסתיר‬ ‫היכולת‬ ‫הוא‬ ‫המתקבלים‬ ‫המידיים‬ ‫היתרונות‬ ‫אחד‬ ,‫לראות‬ ‫שניתן‬ ‫כפי‬ ‫אך‬ ,‫התכנית‬ ‫כתיבת‬ ‫מאחורי‬
.‫אליו‬ ‫הרפרנס‬ ‫את‬ ‫המכיל‬ ‫המשתנה‬ ‫לסוג‬ ‫בהתאם‬ ,‫אובייקט‬ ‫של‬ ‫מהמאפיינים‬
‫בתפ‬ ‫גרסה‬ ‫להפיץ‬ ‫ומעוניינת‬ ‫תוכנה‬ ‫המפתחת‬ ‫לחברה‬ ‫זאת‬ ‫לדמות‬ ‫ניתן‬‫הקהל‬ ‫בקרב‬ ‫מודעות‬ ‫לעורר‬ ‫ע"מ‬ ,‫בחינם‬ ,‫רחבה‬ ‫וצה‬
‫וכבר‬ ‫היות‬ ‫המוצר‬ ‫את‬ ‫לקנות‬ ‫יחליטו‬ ‫אנשים‬ ‫מאוד‬ ‫שמעט‬ ‫הרי‬ ,‫מלאה‬ ‫גרסה‬ ‫תהה‬ ‫שתופץ‬ ‫הגרסה‬ ‫אם‬ .‫שפיתחה‬ ‫המוצר‬ ‫לגבי‬
‫ממנה‬ ‫שהוסרו‬ ,‫שלה‬ ‫הביצועים‬ ‫מבחינת‬ ‫שמוגבלת‬ ‫גרסה‬ ‫החברה‬ ‫מפיצה‬ ,‫כן‬ ‫ועל‬ ‫מלאה‬ ‫בצורה‬ ‫מתפקד‬ ,‫ביד‬ ‫אותו‬ ‫להם‬ ‫יש‬
‫מסו‬ ‫פיצ'רים‬‫לראות‬ ‫ניתן‬ ‫שדרכה‬ ‫גרסה‬ ‫מקבל‬ ,‫הניסיון‬ ‫לגרסת‬ ‫שנחשף‬ ‫אדם‬ ‫אותו‬ .‫בה‬ ‫השימוש‬ ‫זמן‬ ‫שהוגבל‬ ‫או‬ ‫ימים‬
‫את‬ ‫ורק‬ ‫אך‬ ‫חושף‬ ‫ממשק‬ ‫מסוג‬ ‫משתנה‬ ‫שאותו‬ ‫כשם‬ ‫בדיוק‬ ,‫המפתחים‬ ‫בידי‬ ‫שנחשפו‬ ‫פיצ'רים‬ ‫באותם‬ ‫ורק‬ ‫אך‬ ‫ולהשתמש‬
‫וירשה‬ ‫אותו‬ ‫שמימשה‬ ‫זו‬ ,‫המשוכללת‬ ‫המחלקה‬ ‫של‬ ‫אלו‬ ‫את‬ ‫ולא‬ ‫בו‬ ‫שמוגדרים‬ ‫הפיצ'רים‬‫שלנו‬ ‫בדוגמה‬ ‫אחרת‬ ‫ממחלקה‬
.)‫המלאה‬ ‫התוכנה‬ ‫גרסת‬ :‫(ובהקבלה‬
‫העוסק‬ ‫בפרק‬ ‫הנושא‬ ‫על‬ ‫נדבר‬ ‫אנו‬ ,‫ובנוסף‬ )‫(קיבוץ‬ ‫הדרך‬ ‫באותה‬ ‫שונים‬ ‫מסוגים‬ ‫לאובייקטים‬ ‫לפנות‬ ‫היכולת‬ ‫הוא‬ ‫נוסף‬ ‫יתרון‬
.‫בפולימורפיזם‬
.‫אוטומטית‬ ‫טיפוסים‬ ‫בהמרת‬ ‫מודע‬ ‫לא‬ ‫שימוש‬ ‫נעשה‬ ‫שראינו‬ ‫בדוגמאות‬
‫למעלה/למטה‬ ‫טיפוסים‬ ‫המרת‬-Up/Down Type Casting
‫תוך‬ ‫מורכבות‬ ‫משימות‬ ‫לביצוע‬ ‫ישיר‬ ‫תרגום‬ ‫מקבלת‬ ‫זו‬ ‫יכולת‬ .‫ג'אווה‬ ‫בשפת‬ ‫מאוד‬ ‫חשוב‬ ‫נדבך‬ ‫היא‬ ‫קאסטינג‬ ‫לבצע‬ ‫היכולת‬
.‫כה‬ ‫עד‬ ‫שהכרנו‬ ‫פרימיטיביים‬ ‫טיפוסים‬ ‫בין‬ ‫ההמרות‬ ‫מאותן‬ ‫במהותו‬ ‫נבדל‬ ‫זה‬ ‫קאסטינג‬ .‫פשוט‬ ‫בתחביר‬ ‫שימוש‬
‫טיפוסי‬ ‫בהמרת‬‫המרה‬ .‫מורישה‬ ‫ממחלקה‬ ‫אובייקט‬ ‫כאל‬ ‫יורשת‬ ‫ממחלקה‬ ‫לאובייקט‬ ‫להתייחס‬ ‫היכולת‬ ‫על‬ ‫מדובר‬ ,‫למעלה‬ ‫ם‬
‫בכל‬ ‫מתבצעת‬ ‫והיא‬ ‫היות‬ ‫ממשי‬ ‫טכני‬ ‫צורך‬ ‫בכך‬ ‫אין‬ ,‫הבהירות‬ ‫לשם‬ ‫רק‬ ‫זאת‬ ‫אך‬ ,‫מפורשת‬ ‫בצורה‬ ‫להתבצע‬ ‫יכולה‬ ‫זה‬ ‫מסוג‬
‫אוטומטי‬ ‫באופן‬ ‫מקרה‬–‫תמיד‬ ‫ומצליחה‬ ‫כבטוחה‬ ‫נחשבת‬ ‫זו‬ ‫שהמרה‬ ‫כך‬ ‫מתוך‬ ‫זאת‬.‫בעיות‬ ‫מבלי‬
‫היות‬ ‫שמבצעים‬ ‫ההמרה‬ ‫לסוג‬ ‫לב‬ ‫תשומת‬ ‫מתן‬ ‫תוך‬ ,‫אז‬ ‫וגם‬ ‫מפורש‬ ‫ידני‬ ‫באופן‬ ‫להתבצע‬ ‫צריכה‬ ,‫זאת‬ ‫לעומת‬ ‫למטה‬ ‫המרה‬
.‫מבוקר‬ ‫לא‬ ‫באופן‬ ‫בוצעה‬ ‫באם‬ ‫ריצה‬ ‫ושגיאות‬ ‫קומפילציה‬ ‫שגיאות‬ ‫לגרור‬ ‫ועלולה‬ ‫טריוויאלית‬ ‫פחות‬ ‫זו‬ ‫והמרה‬
‫בתרש‬ ‫ראשית‬ ‫נביט‬ ,‫הנושא‬ ‫את‬ ‫יותר‬ ‫טוב‬ ‫להבין‬ ‫מנת‬ ‫על‬‫ה‬ ‫ים‬-UML:‫הנתון‬
:‫הבאות‬ ‫ההגדרות‬ ‫שקיימות‬ ‫להבין‬ ‫נוכל‬ ‫מתוכו‬
public class Human {
String type="Human";
}
public class Person extends Human {
}
public class Student extends Person {
}
public class Soldier extends Person {
}
‫וכי‬‫ב‬-Runner‫נעשים‬‫שימושים‬‫המעידים‬‫על‬‫קשרי‬‫תלות‬‫למחלקות‬(‫יצירת‬‫אובייקטים‬‫וכד‬.)'
‫אדם‬ ‫מבן‬ ‫יורשים‬ ‫וחייל‬ ‫שסטודנט‬ ‫לראות‬ ‫בקלות‬ ‫ניתן‬ .‫אנוש‬ ‫בן‬ ‫של‬ ‫המחלקות‬ ‫היררכיית‬ ‫של‬ ‫מצומצמת‬ ‫גרסה‬ ‫מתאר‬ ‫התרשים‬
‫מלבד‬ ,‫בג'אווה‬ ‫שהרי‬ ,‫מאובייקט‬ ‫יורש‬ ‫אנוש‬ ‫בן‬ ‫כי‬ ‫נציין‬ ,‫כן‬ ‫כמו‬ .‫אנוש‬ ‫מבן‬ ‫יורש‬ ‫אדם‬ ‫בן‬ ‫וכי‬‫כל‬ ,‫פרימיטיביים‬ ‫טיפוסים‬
.‫אוטומטי‬ ‫באופן‬ ‫מאובייקט‬ ‫יורשים‬ ‫הטיפוסים‬
‫בהגדרת‬ ‫נביט‬Runner:
public class Runner {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.type);
Soldier soldier = new Soldier();
System.out.println(soldier.type);
}
}
‫בהרצת‬ ‫שיתקבל‬ ‫הפלט‬Runner‫את‬ ‫יורשים‬ ‫ושניהם‬ ‫היות‬ ,‫האובייקטים‬ ‫שני‬ ‫עבור‬ ‫זהה‬ ‫כמובן‬ ‫יהיה‬type‫מ‬-Human.
‫למעלה‬ ‫המרה‬)‫אוטומטי‬ ‫באופן‬ ‫מתבצעת‬ ,‫(כאמור‬
public class Runner {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.type);
Soldier soldier = new Soldier();
System.out.println(soldier.type);
Student s = new Student();
System.out.println(s);
Person p = s; // Person p = (Person)s; - ‫אוטומטית‬ ‫למעלה‬ ‫המרה‬–‫ל‬ ‫שקולה‬
System.out.println(p);
/*
‫מה‬‫שיודפס‬
Human
Human
Student@32e0c07c
Student@32e0c07c
*/
}
}
‫שסטודנט‬ ‫היא‬ ‫בעיות‬ ‫בלי‬ ‫תמיד‬ ‫תתבצע‬ ‫כזו‬ ‫שהמרה‬ ‫הסיבה‬ ,‫אדם‬ ‫לבן‬ ‫מסטודנט‬ ‫בוצעה‬ ‫למעלה‬ ‫שהמרה‬ ‫לראות‬ ‫ניתן‬ ‫בדוגמה‬
,‫כן‬ ‫כמו‬ ,‫אדם‬ ‫בן‬ ‫אכן‬ ‫הוא‬‫ה‬ ‫מדיאגרמת‬ ‫ללמוד‬ ‫ניתן‬ ‫זאת‬ ‫כל‬ ,‫אובייקט‬ ‫הוא‬ ‫סטודנט‬ ‫כן‬ ‫וכמו‬ ‫אנוש‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬-UML
.‫הירושה‬ ‫היררכיית‬ ‫את‬ ‫המתארת‬
‫משתנה‬ ‫ע"י‬ ‫שמוחזק‬ ‫וסטודנט‬ ‫סטודנט‬ ‫מסוג‬ ‫משתנה‬ ‫ע"י‬ ‫שמוחזק‬ ‫שסטודנט‬ ‫הוא‬ ,‫בדוגמה‬ ‫אליו‬ ‫לב‬ ‫לשים‬ ‫שחשוב‬ ‫נוסף‬ ‫דבר‬
‫הד‬ ‫כך‬ ‫במקרה‬ ‫לא‬ .‫האופן‬ ‫באותו‬ ‫מודפסים‬ ‫אדם‬ ‫בן‬ ‫מסוג‬‫בר‬-.‫עצמו‬ ‫האובייקט‬ ‫על‬ ‫השפעה‬ ‫אין‬ ‫באובייקט‬ ‫שמחזיק‬ ‫למשתנה‬
‫המשתנה‬ ‫דרך‬ ,‫ובדוגמה‬ ,‫שונה‬ ‫בצורה‬ ‫לאובייקט‬ ‫להתייחס‬ ‫ניתן‬ ‫יהיה‬ ‫לפיה‬ ‫תווית‬ ‫כמעיין‬ ‫משמש‬ ‫המשתנה‬p,‫אדם‬ ‫בן‬ ‫מסוג‬
‫לאובייקט‬ ‫ברפרנס‬ ‫המחזיק‬s‫שבנאד‬ ‫או‬ ‫אדם‬ ‫בבן‬ ‫שהוגדרו‬ ‫ומתודות‬ ‫למשתנים‬ ‫ורק‬ ‫אך‬ ‫לפנות‬ ‫נוכל‬ ,‫סטודנט‬ ‫מסוג‬‫ירש‬ ‫ם‬
‫שהפנייה‬ ‫עוד‬ ‫כל‬ ‫יוסתרו‬ ,‫לסטודנט‬ ,‫בנאדם‬ ‫של‬ ‫ובמקרה‬ ‫הירושה‬ ‫בהיררכיית‬ ‫שמתחת‬ ‫למה‬ ‫ששייכים‬ ‫השדות‬ ,‫מלמעלה‬
‫למטה‬ ‫ידנית‬ ‫המרה‬ ‫שתיעשה‬ ‫שברגע‬ ‫לציין‬ ‫חשוב‬ .‫שמומש‬ ‫מממשק‬ ‫או‬ ‫מורישה‬ ‫ממחלקה‬ ,"‫"מלמעלה‬ ‫תיעשה‬ ‫לאובייקט‬
‫חסו‬ ‫שהיו‬ ‫המאפיינים‬ ‫כל‬ ‫גם‬ ‫יחזרו‬ ,‫סטודנט‬ ‫מטיפוס‬ ‫למשתנה‬ ‫בחזרה‬.‫כה‬ ‫כד‬ ‫מים‬
‫למטה‬ ‫המרה‬)‫ידני‬ ‫באופן‬ ‫מתבצעת‬ ,‫(כאמור‬
‫אנחנו‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫לשאול‬ ‫עלינו‬ ‫למטה‬ ‫קאסטינג‬ ‫עושים‬ ‫כשאנחנו‬ .‫מבוקרת‬ ‫בצורה‬ ‫להיעשות‬ ‫צריכה‬ ‫למטה‬ ‫ההמרה‬
.‫האובייקט‬ ‫של‬ ‫המהות‬ ‫למקור‬ ‫בהתאם‬ ‫לא‬ ‫או‬ ‫חוקית‬ ‫המרה‬ ‫מבצעים‬
,‫שהבאנו‬ ‫בדוגמה‬p‫ברפרנס‬ ‫החזיק‬.‫וחוקית‬ ‫אפשרית‬ ‫סטודנט‬ ‫לטיפוס‬ ‫בחזרה‬ ‫למטה‬ ‫המרה‬ ‫ולכן‬ ‫סטודנט‬ ‫מסוג‬ ‫לאובייקט‬
Student s1 = new Student();
System.out.println(s1);
Person p = s1; // Person p = (Person)s1; - ‫אוטומטית‬ ‫למעלה‬ ‫המרה‬–‫ל‬ ‫שקולה‬
System.out.println(p);
Student s2=(Student)p; // ‫המרה‬‫מלכתחילה‬ ‫שלו‬ ‫שהיו‬ ‫התכונות‬ ‫את‬ ‫לסטודנט‬ ‫ומחזירים‬ ‫היות‬ ‫תקינה‬ ‫למטה‬ ‫ידנית‬
( ‫ריצה‬ ‫שגיאת‬ ‫תניב‬ ,‫חייל‬ ‫מסוג‬ ‫לטיפוס‬ ‫למטה‬ ‫להמיר‬ ‫ניסיון‬ClassCastException‫זאת‬ ,‫קומפילציה‬ ‫מבחינת‬ ‫תתאפשר‬ ‫אך‬ ,)
‫ומ‬ ‫היות‬-p‫מבחינת‬ ‫שמתחתיו‬ ‫לאובייקט‬ ‫ברפרנס‬ ‫שהחזיק‬ ‫משתנה‬ ‫רק‬ ‫היה‬ ‫זה‬ ,‫אובייקט‬ ‫נוצר‬ ‫לא‬,‫מחלקתית‬ ‫היררכיה‬
‫המתכנת‬ ,‫המתכנת‬ ‫בידי‬ ‫היא‬ ‫לחוקיות‬ ‫האחריות‬ ,‫כן‬ ‫ועל‬ ,)‫אדם‬ ‫בבן‬ ‫(או‬ ‫בחייל‬ ‫או‬ ‫בסטודנט‬ ‫או‬ ‫להחזיק‬ ‫יכול‬ ‫הוא‬ ‫תיאורטית‬
:‫מדובר‬ ‫בפועל‬ ‫אובייקט‬ ‫באיזה‬ ‫לדעת‬ ‫שצריך‬ ‫זה‬ ‫הוא‬
Soldier sol=new Soldier();
sol=(Soldier)p;
‫במי‬ ‫להשתמש‬ ‫ניתן‬ ,‫האובייקט‬ ‫מקור‬ ‫מה‬ ‫לדעת‬ ‫ע"מ‬‫האופרטור‬ ,‫השמורה‬ ‫לה‬instanceof:‫הבא‬ ‫באופן‬
Student s3 = new Student();
Human h = s3; //‫למעלה‬ ‫המרה‬
if(h instanceof Student) { //‫בדיקה‬
Student s4 = (Student)h; //‫תקינה‬ ‫למטה‬ ‫המרה‬
}
‫אם‬‫מאיזה‬ ‫בוודאות‬ ‫שידוע‬ ,‫אובייקט‬ ‫ממנו‬ ‫נוצר‬ ‫שכן‬ ‫טיפוס‬ ‫של‬ ‫למטה‬ ‫בהמרה‬ ‫מדובר‬‫לטיפוס‬ ‫ממנו‬ ‫להמיר‬ ‫וננסה‬ ‫הוא‬ ‫טיפוס‬
( ‫ריצה‬ ‫שגיאת‬ ‫נקבל‬ ,‫אחר‬ClassCastException:)‫אדם‬ ‫בן‬ ‫הוא‬ ‫(סטודנט‬ ‫סטודנט‬ ‫לא‬ ‫הוא‬ ‫אדם‬ ‫שבן‬ ‫ברור‬ ‫הבאה‬ ‫בדוגמה‬ ,)
Person per=new Person();
Student s5=(Student)per;
,‫וממי‬ ‫למי‬ ‫להמיר‬ ‫ניתן‬ ‫מי‬ ‫את‬ ‫ההחלטה‬ ‫את‬ ‫לפשט‬ ‫מנת‬ ‫על‬‫היא‬ ‫להישאל‬ ‫שצריכה‬ ‫השאלה‬"?‫האובייקט‬ ‫מקור‬ ‫"מה‬
.‫אנוש‬ ‫לבן‬ ‫אותו‬ ‫להמיר‬ ‫ניתן‬ ,‫אנוש‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬ ‫אם‬ .‫אדם‬ ‫לבן‬ ‫אותו‬ ‫להמיר‬ ‫ניתן‬ ,‫אדם‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬ ‫אם‬
.‫אותם‬ ‫להמיר‬ ‫ניתן‬ ‫לא‬ ‫ולכן‬ ‫לא‬ ?‫אדם‬ ‫בן‬ ‫הוא‬ ‫אנוש‬ ‫בן‬ ‫האם‬ ?‫חייל‬ ‫הוא‬ ‫אנוש‬ ‫בן‬ ‫האם‬
,‫משמע‬ ?‫אדם‬ ‫כבן‬ ‫הזה‬ ‫לסטודנט‬ ‫מתייחס‬ ‫אני‬ ‫האם‬‫מה‬ ‫כל‬ ‫על‬ ‫איתו‬ "‫"לדבר‬ ‫ואז‬ ‫סטודנט‬ ‫כאל‬ ‫גם‬ ‫אליו‬ ‫להתייחס‬ ‫יכול‬ ‫אני‬
‫על‬ ‫רק‬ ‫אלא‬ ,‫סטודנט‬ ‫כאל‬ ‫אליו‬ ‫לדבר‬ ‫יכול‬ ‫לא‬ ‫אני‬ ,‫אדם‬ ‫בן‬ ‫כאל‬ ‫אליו‬ ‫מתייחס‬ ‫שאני‬ ‫עוד‬ ‫כל‬ ‫אך‬ ,‫סטודנט‬ ‫עם‬ ‫לדבר‬ ‫שאפשר‬
.‫אדם‬ ‫לבני‬ ‫שכלליים‬ ‫דברים‬
‫היכו‬ ‫הוא‬ ,‫ג'אווה‬ ‫בשפת‬ ‫הטיפוסים‬ ‫המרת‬ ‫של‬ ‫הבולטים‬ ‫היתרונות‬ ‫אחד‬‫שונים‬ ‫סוגים‬ ‫לקבל‬ ‫שיכולות‬ ‫כלליות‬ ‫מתודות‬ ‫לייצר‬ ‫לת‬
‫אנוש‬ ‫בני‬ ‫וגם‬ ‫אדם‬ ‫בני‬ ‫גם‬ ,‫סטודנטים‬ ‫גם‬ ,‫חיילים‬ ‫גם‬ ‫לקבל‬ ‫שתדע‬ ‫מתודה‬ ‫לייצר‬ ‫וברצוננו‬ ‫נניח‬ .‫כארגומנט‬ ‫אובייקטים‬ ‫של‬
:‫הבאה‬ ‫בהגדרה‬ ‫נביט‬ .‫גנרית‬ ‫בצורה‬
public void whois(Human h) {
System.out.println("This is a "+h);
}
‫של‬ ‫ההיררכיה‬ ‫במורד‬ ‫או‬ ‫שברמת‬ ‫מהמחלקות‬ ‫אחד‬ ‫לכל‬ ‫רפרנסים‬ ‫זו‬ ‫למתודה‬ ‫לשלוח‬ ‫נוכל‬ ,‫זה‬ ‫באופן‬Human:
whois(new Student());
whois(new Person());
whois(new Human());
:‫כזה‬ ‫פלט‬ ‫ונקבל‬
This is a Student@603a3e21
This is a Person@fc519e2
This is a Human@55264c84
‫את‬ ‫להציב‬ ‫ניתן‬ ‫בהם‬ ‫המשתנים‬ ‫סוגי‬ ‫על‬ ‫דיברנו‬ ,‫כה‬ ‫עד‬ .‫אליו‬ ‫הרפרנס‬ ‫אלא‬ ,‫עצמו‬ ‫האובייקט‬ ‫לא‬ ‫זה‬ ‫המרה‬ ‫שעובר‬ ‫מה‬ ,‫כן‬ ‫אם‬
.‫אחד‬ ‫ממשתנה‬ ‫ביותר‬ ‫להציב‬ ‫ניתן‬ ‫הרפרנס‬ ‫אותו‬ ‫שאת‬ ‫העובדה‬ ‫את‬ ‫נציין‬ ,‫כעת‬ .‫הרפרנס‬ ‫אותו‬
‫יפנו‬ ,‫כך‬ ‫ובשל‬ ‫הרפרנס‬ ‫אותו‬ ‫את‬ ‫יכילו‬ ,‫זה‬ ‫ערך‬ ‫שיכילו‬ ‫המשתנים‬ ‫כל‬ ,‫זה‬ ‫במקרה‬)=( ‫להשמה‬ ‫בנוגע‬ ‫גם‬ ‫כך‬ ,‫האובייקט‬ ‫לאותו‬
.‫החדש‬ ‫במשתנה‬ ‫כמתבקש‬ ‫יושם‬ ‫הרפרנס‬ ‫רק‬ ,‫שינוי‬ ‫ללא‬ ‫יישאר‬ ‫עצמו‬ ‫האובייקט‬ ,‫שונים‬ ‫מחלקה‬ ‫משתני‬ ‫בין‬
‫ערך‬ ‫תחזיר‬ ‫השוואה‬ .‫אובייקטים‬ ‫בין‬ )==( ‫השוואה‬ ‫על‬ ‫לדבר‬ ‫כן‬ ‫אם‬ ‫ניתן‬ ,‫האופן‬ ‫באותו‬‫אמת‬‫המושווים‬ ‫הרפרנסים‬ ‫אם‬ ‫ורק‬ ‫אך‬ ,
‫התייחסו‬ ‫מבלי‬ ,‫זהים‬‫ערך‬ ‫תחזיר‬ ‫השוואה‬ ,‫כלומר‬ ,‫עצמו‬ ‫לתוכן‬ ‫ת‬‫שקר‬‫בעלי‬ ‫אך‬ ,‫התוכן‬ ‫מבחינת‬ ‫זהים‬ ‫האובייקטים‬ ‫אם‬ ‫גם‬
.‫שונה‬ ‫רפרנס‬
‫מהמחלקה‬ ‫אוטומטי‬ ‫באופן‬ ‫יורשות‬ ‫המחלקות‬ ‫וכל‬ ‫היות‬Object‫ב‬ ‫להשתמש‬ ‫ניתן‬ ,-equals‫בין‬ ‫ההשוואה‬ ‫ביצוע‬ ‫לצורך‬
‫המתודה‬ ‫של‬ ‫הדפולטיבי‬ ‫פעולתה‬ ‫אופן‬ ‫בין‬ ‫הבדל‬ ‫אין‬ .‫אובייקטים‬equals‫בין‬ ‫הבדל‬ ‫יש‬ ‫אך‬ ,== ‫האופרטור‬ ‫של‬ ‫פעולתו‬ ‫לאופי‬
( ‫בג'אווה‬ ‫אופרטורים‬ ‫העמסת‬ ‫לבצע‬ ‫ניתן‬ ‫שלא‬ ‫בכך‬ ‫השניים‬‫ב‬ ‫אופרטורים‬ ‫העמסת‬ ‫לבצע‬ ‫ניתן‬ :‫טיפ‬-Groovy‫שפה‬ ‫שזו‬ ,
‫מבוססת‬JVM‫לג'אווה‬ ‫דומה‬‫של‬ ‫פעולתה‬ ‫אופן‬ ‫את‬ ‫לשנות‬ ‫שניתן‬ ,‫ומכאן‬ ‫מתודות‬ ‫דריסת‬ ‫לבצע‬ ‫ניתן‬ ‫כן‬ ‫אך‬ ,)equals‫כך‬ ,
:‫המחדל‬ ‫ברירת‬ ‫בדרך‬ ‫עושה‬ ‫שהיא‬ ‫כפי‬ ,‫הרפרנס‬ ‫לפי‬ ‫ולא‬ ‫התוכן‬ ‫לפי‬ ‫ההשוואה‬ ‫את‬ ‫שתבצע‬
public boolean equals(Object obj) { /*New logic goes here*/ }
‫ה‬ ‫ברירת‬ ‫ערך‬ ‫את‬ ‫יקבל‬ ‫מחלקה‬ ‫מטיפוס‬ ‫משתנה‬‫מחדל‬null‫בוצע‬ ‫לא‬ ‫באם‬ ,instantiation‫לגבי‬ ‫אינדיקציה‬ ‫זוהי‬ ,‫כלומר‬ ,
‫של‬ ‫הצבה‬ ‫לבצע‬ ‫גם‬ ‫(ניתן‬ ‫אובייקט‬ ‫לאף‬ ‫ברפרנס‬ ‫מחזיק‬ ‫לא‬ ‫זה‬ ‫שמשתנה‬ ‫העובדה‬null‫במשתנה‬ ‫לשימוש‬ ‫ניסיון‬ .)‫יזום‬ ‫באופן‬
‫המכיל‬ ‫מחלקה‬ ‫מסוג‬null.‫ריצה‬ ‫לשגיאת‬ ‫יגרום‬ ,
‫ר‬ ‫מכיל‬ ‫מחלקה‬ ‫מסוג‬ ‫משתנה‬ ‫האם‬ ‫בדיקה‬ ‫לבצע‬ ‫ניתן‬‫הוא‬ ‫האם‬ ‫בדיקה‬ ‫ע"י‬ ‫לא‬ ‫או‬ ‫לאובייקט‬ ‫פרנס‬==null‫או‬!=null

More Related Content

ג'אווה - תכנות מונחה עצמים - משתנים מטיפוס מחלקה והמרת טיפוסים למעלה/למטה

  • 2. ‫משתנ‬‫ים‬‫מחלקה‬ ‫מטיפוס‬-Class type Variables :‫הבאות‬ ‫ההגדרות‬ ‫וקיימות‬ ‫בהנחה‬ public interface InterfaceName {} public class ClassNameA {} public class ClassNameB extends ClassNameA implements InterfaceName {} :‫בלבד‬ ‫טיפוסים‬ ‫משלושה‬ ‫מאחד‬ ‫להיות‬ ‫יכול‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫את‬ ‫להכיל‬ ‫שמיועד‬ ‫המשתנה‬ ‫הראשון‬,‫המחלקה‬ ‫מטיפוס‬:‫הטריוויאלי‬ ‫הטיפוס‬ ‫זהו‬ ,‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫אנו‬ ‫ממנה‬ ClassNameB cnb=new ClassNameB(); ‫השני‬,‫למחלקה‬ ‫שמורישה‬ ‫מחלקה‬ ‫מטיפוס‬‫מטיפ‬ ‫כלומר‬ ,‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫אנו‬ ‫ממנה‬‫ממנה‬ ‫שהמחלקה‬ ‫מחלקה‬ ‫וס‬ .‫הגדרתה‬ ‫את‬ ‫מרחיבה‬ ‫האובייקט‬ ‫את‬ ‫יוצרים‬ ClassNameA cna=new ClassNameB(); ‫השלישי‬,‫המחלקה‬ ‫אותו‬ ‫ממשק‬ ‫מטיפוס‬‫האובייקט‬ ‫את‬ ‫יוצרים‬ ‫ממנה‬‫מיישמת‬. InterfaceName in=new ClassNameB(); ‫(הרפרנס‬ ‫החזרה‬ ‫ערך‬ ‫את‬ ‫שנציב‬ ‫לאחר‬‫(בהתאם‬ ‫שלו‬ ‫למאפיינים‬ ‫לגשת‬ ‫יהיה‬ ‫ניתן‬ ,‫לכך‬ ‫המיועד‬ ‫במשתנה‬ )‫לאובייקט‬ :‫כך‬ ‫לדוגמה‬ ,)‫מתודה‬ ‫או‬ ‫(משתנה‬ ‫המאפיין‬ ‫ושם‬ ‫מפרידה‬ ‫נקודה‬ ,‫המשתנה‬ ‫שם‬ ‫ציון‬ ‫ע"י‬ )‫גישה‬ ‫להרשאות‬ objectName.methodName(); ‫ה‬ ‫ממנו‬ ‫בטיפוס‬ ‫שהוגדרו‬ ‫למאפיינים‬ ‫ורק‬ ‫אך‬ ‫לגשת‬ ‫יכול‬ ‫משתנה‬ ‫של‬ ‫סוג‬ ‫שכל‬ ‫לב‬ ‫לשים‬ ‫יש‬‫אובייקט‬ ‫לאיזה‬ ‫קשר‬ ‫מבלי‬ ‫נוצר‬ ‫וא‬ .‫מחזיק‬ ‫הוא‬
  • 3. .‫האחרונה‬ ‫הדוגמה‬ ‫את‬ ‫מעט‬ ‫נעבה‬ ‫יותר‬ ‫טוב‬ ‫הנושא‬ ‫את‬ ‫להבין‬ ‫מנת‬ ‫על‬ ‫תרשים‬ ‫מתוך‬UML:‫נתון‬ :‫הבאות‬ ‫ההגדרות‬ ‫שקיימות‬ ‫להבין‬ ‫נוכל‬ public interface InterfaceName { public abstract void interfaceMethod(); } public class ClassNameA { int classNameAVar; } public class ClassNameB extends ClassNameA implements InterfaceName { int classNameBVar; public void interfaceMethod () { } } ‫ב‬ ‫וכי‬-Runner.)'‫וכד‬ ‫אובייקטים‬ ‫(יצירת‬ ‫והממשק‬ ‫למחלקות‬ ‫תלות‬ ‫קשרי‬ ‫על‬ ‫המעידים‬ ‫שימושים‬ ‫נעשים‬ ‫לכל‬ ‫גישה‬ ‫שתהיה‬ ‫כך‬ ,‫נוצר‬ ‫הוא‬ ‫ממנה‬ ‫המחלקה‬ ‫מסוג‬ ‫במשתנה‬ ‫נציב‬ ‫אליו‬ ‫הרפרנס‬ ‫שאת‬ ‫אובייקט‬ ‫ויצרנו‬ ‫נניח‬ ,‫כעת‬ :‫במחלקה‬ ‫שהוגדרו‬ ‫המאפיינים‬ ClassNameB cnb=new ClassNameB(); ‫אובייקטים‬ ‫ניצור‬ ‫לא‬ ,‫מכאן‬:‫קודם‬ ‫שהוצגו‬ ‫האפשריים‬ ‫מהסוגים‬ ‫במשתנים‬ ‫שיצרנו‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫את‬ ‫נפיץ‬ ‫אלא‬ ,‫חדשים‬ ClassNameA cna = cnb; InterfaceName in = cnb;
  • 4. ‫מחלקה‬ ‫מסוג‬ ‫אובייקט‬ ‫בידנו‬ ‫יש‬ ,‫זאת‬ ‫משעשינו‬ClassNameB‫שהרפרנס‬‫שהצגנו‬ ‫המשתנים‬ ‫טיפוסי‬ ‫בשלושת‬ ‫מוכל‬ ‫אליו‬ ‫המשתנים‬ ‫שלושת‬ ,‫כלומר‬ ,‫הקודמת‬ ‫בדוגמה‬in, cna, cnb‫מהם‬ ‫אחד‬ ‫כל‬ ‫של‬ ‫הגישה‬ ‫אך‬ ,‫האובייקט‬ ‫לאותו‬ ‫מתייחסים‬ :‫נוצרו‬ ‫הם‬ ‫מהם‬ ‫הטיפוסים‬ ‫מהגדרות‬ ‫אחת‬ ‫בכל‬ ‫הוגדרו‬ ‫מאפיינים‬ ‫לאילו‬ ‫בהתאם‬ ‫תהיה‬ ‫האובייקט‬ ‫של‬ ‫למאפיינים‬ ‫המשתנה‬in‫המתודה‬ ‫את‬ ‫רק‬ "‫"לראות‬ ‫יכול‬interfaceMethod()‫מהטיפוס‬ ‫שמגיעה‬ ‫היחידה‬ ‫והיא‬ ‫היות‬InterfaceName :‫נוצר‬ ‫הוא‬ ‫ממנו‬ in.interfaceMethod(); ‫המשתנה‬cna‫המשתנה‬ ‫את‬ ‫רק‬ "‫"לראות‬ ‫יכול‬classNameAVar‫מהטיפוס‬ ‫שמגיע‬ ‫היחיד‬ ‫והוא‬ ‫היות‬ClassNameA‫הוא‬ ‫ממנו‬ :‫נוצר‬ cna.classNameAVar=0; ‫המשתנה‬cnb‫המשתנה‬ ‫את‬ "‫"לראות‬ ‫יכול‬classNameBVar‫במחלקה‬ ‫מוגדר‬ ‫והוא‬ ‫היות‬ClassNameB,‫נוצר‬ ‫הוא‬ ‫ממנה‬ ‫המשתנה‬ ‫את‬ "‫"לראות‬ ‫יכול‬ ‫הוא‬ ,‫כן‬ ‫כמו‬classNameAVar‫מהמחלקה‬ ‫יורש‬ ‫והוא‬ ‫היות‬ClassNameA, ‫המתודה‬ ‫את‬ "‫"לראות‬ ‫יכול‬ ‫והוא‬interfaceMethod()‫הממשק‬ ‫את‬ ‫מממש‬ ‫והוא‬ ‫היות‬InterfaceName: cnb.interfaceMethod(); cnb.classNameAVar=0; cnb.classNameBVar=0; ‫האפשריים‬ ‫המשתנים‬ ‫מטיפוסי‬ ‫אחד‬ ‫בכל‬ ‫לאובייקט‬ ‫הרפרנס‬ ‫להצבת‬ ‫סיבות‬ ‫מעט‬ ‫לא‬ ‫יש‬‫שעומדת‬ ‫ללוגיקה‬ ‫בהתאם‬ ‫המשתנות‬ ‫לחלק‬ ‫הגישה‬ ‫את‬ "‫"להסתיר‬ ‫היכולת‬ ‫הוא‬ ‫המתקבלים‬ ‫המידיים‬ ‫היתרונות‬ ‫אחד‬ ,‫לראות‬ ‫שניתן‬ ‫כפי‬ ‫אך‬ ,‫התכנית‬ ‫כתיבת‬ ‫מאחורי‬ .‫אליו‬ ‫הרפרנס‬ ‫את‬ ‫המכיל‬ ‫המשתנה‬ ‫לסוג‬ ‫בהתאם‬ ,‫אובייקט‬ ‫של‬ ‫מהמאפיינים‬ ‫בתפ‬ ‫גרסה‬ ‫להפיץ‬ ‫ומעוניינת‬ ‫תוכנה‬ ‫המפתחת‬ ‫לחברה‬ ‫זאת‬ ‫לדמות‬ ‫ניתן‬‫הקהל‬ ‫בקרב‬ ‫מודעות‬ ‫לעורר‬ ‫ע"מ‬ ,‫בחינם‬ ,‫רחבה‬ ‫וצה‬ ‫וכבר‬ ‫היות‬ ‫המוצר‬ ‫את‬ ‫לקנות‬ ‫יחליטו‬ ‫אנשים‬ ‫מאוד‬ ‫שמעט‬ ‫הרי‬ ,‫מלאה‬ ‫גרסה‬ ‫תהה‬ ‫שתופץ‬ ‫הגרסה‬ ‫אם‬ .‫שפיתחה‬ ‫המוצר‬ ‫לגבי‬ ‫ממנה‬ ‫שהוסרו‬ ,‫שלה‬ ‫הביצועים‬ ‫מבחינת‬ ‫שמוגבלת‬ ‫גרסה‬ ‫החברה‬ ‫מפיצה‬ ,‫כן‬ ‫ועל‬ ‫מלאה‬ ‫בצורה‬ ‫מתפקד‬ ,‫ביד‬ ‫אותו‬ ‫להם‬ ‫יש‬ ‫מסו‬ ‫פיצ'רים‬‫לראות‬ ‫ניתן‬ ‫שדרכה‬ ‫גרסה‬ ‫מקבל‬ ,‫הניסיון‬ ‫לגרסת‬ ‫שנחשף‬ ‫אדם‬ ‫אותו‬ .‫בה‬ ‫השימוש‬ ‫זמן‬ ‫שהוגבל‬ ‫או‬ ‫ימים‬ ‫את‬ ‫ורק‬ ‫אך‬ ‫חושף‬ ‫ממשק‬ ‫מסוג‬ ‫משתנה‬ ‫שאותו‬ ‫כשם‬ ‫בדיוק‬ ,‫המפתחים‬ ‫בידי‬ ‫שנחשפו‬ ‫פיצ'רים‬ ‫באותם‬ ‫ורק‬ ‫אך‬ ‫ולהשתמש‬ ‫וירשה‬ ‫אותו‬ ‫שמימשה‬ ‫זו‬ ,‫המשוכללת‬ ‫המחלקה‬ ‫של‬ ‫אלו‬ ‫את‬ ‫ולא‬ ‫בו‬ ‫שמוגדרים‬ ‫הפיצ'רים‬‫שלנו‬ ‫בדוגמה‬ ‫אחרת‬ ‫ממחלקה‬ .)‫המלאה‬ ‫התוכנה‬ ‫גרסת‬ :‫(ובהקבלה‬ ‫העוסק‬ ‫בפרק‬ ‫הנושא‬ ‫על‬ ‫נדבר‬ ‫אנו‬ ,‫ובנוסף‬ )‫(קיבוץ‬ ‫הדרך‬ ‫באותה‬ ‫שונים‬ ‫מסוגים‬ ‫לאובייקטים‬ ‫לפנות‬ ‫היכולת‬ ‫הוא‬ ‫נוסף‬ ‫יתרון‬ .‫בפולימורפיזם‬ .‫אוטומטית‬ ‫טיפוסים‬ ‫בהמרת‬ ‫מודע‬ ‫לא‬ ‫שימוש‬ ‫נעשה‬ ‫שראינו‬ ‫בדוגמאות‬
  • 5. ‫למעלה/למטה‬ ‫טיפוסים‬ ‫המרת‬-Up/Down Type Casting ‫תוך‬ ‫מורכבות‬ ‫משימות‬ ‫לביצוע‬ ‫ישיר‬ ‫תרגום‬ ‫מקבלת‬ ‫זו‬ ‫יכולת‬ .‫ג'אווה‬ ‫בשפת‬ ‫מאוד‬ ‫חשוב‬ ‫נדבך‬ ‫היא‬ ‫קאסטינג‬ ‫לבצע‬ ‫היכולת‬ .‫כה‬ ‫עד‬ ‫שהכרנו‬ ‫פרימיטיביים‬ ‫טיפוסים‬ ‫בין‬ ‫ההמרות‬ ‫מאותן‬ ‫במהותו‬ ‫נבדל‬ ‫זה‬ ‫קאסטינג‬ .‫פשוט‬ ‫בתחביר‬ ‫שימוש‬ ‫טיפוסי‬ ‫בהמרת‬‫המרה‬ .‫מורישה‬ ‫ממחלקה‬ ‫אובייקט‬ ‫כאל‬ ‫יורשת‬ ‫ממחלקה‬ ‫לאובייקט‬ ‫להתייחס‬ ‫היכולת‬ ‫על‬ ‫מדובר‬ ,‫למעלה‬ ‫ם‬ ‫בכל‬ ‫מתבצעת‬ ‫והיא‬ ‫היות‬ ‫ממשי‬ ‫טכני‬ ‫צורך‬ ‫בכך‬ ‫אין‬ ,‫הבהירות‬ ‫לשם‬ ‫רק‬ ‫זאת‬ ‫אך‬ ,‫מפורשת‬ ‫בצורה‬ ‫להתבצע‬ ‫יכולה‬ ‫זה‬ ‫מסוג‬ ‫אוטומטי‬ ‫באופן‬ ‫מקרה‬–‫תמיד‬ ‫ומצליחה‬ ‫כבטוחה‬ ‫נחשבת‬ ‫זו‬ ‫שהמרה‬ ‫כך‬ ‫מתוך‬ ‫זאת‬.‫בעיות‬ ‫מבלי‬ ‫היות‬ ‫שמבצעים‬ ‫ההמרה‬ ‫לסוג‬ ‫לב‬ ‫תשומת‬ ‫מתן‬ ‫תוך‬ ,‫אז‬ ‫וגם‬ ‫מפורש‬ ‫ידני‬ ‫באופן‬ ‫להתבצע‬ ‫צריכה‬ ,‫זאת‬ ‫לעומת‬ ‫למטה‬ ‫המרה‬ .‫מבוקר‬ ‫לא‬ ‫באופן‬ ‫בוצעה‬ ‫באם‬ ‫ריצה‬ ‫ושגיאות‬ ‫קומפילציה‬ ‫שגיאות‬ ‫לגרור‬ ‫ועלולה‬ ‫טריוויאלית‬ ‫פחות‬ ‫זו‬ ‫והמרה‬ ‫בתרש‬ ‫ראשית‬ ‫נביט‬ ,‫הנושא‬ ‫את‬ ‫יותר‬ ‫טוב‬ ‫להבין‬ ‫מנת‬ ‫על‬‫ה‬ ‫ים‬-UML:‫הנתון‬ :‫הבאות‬ ‫ההגדרות‬ ‫שקיימות‬ ‫להבין‬ ‫נוכל‬ ‫מתוכו‬ public class Human { String type="Human"; } public class Person extends Human { } public class Student extends Person { } public class Soldier extends Person { } ‫וכי‬‫ב‬-Runner‫נעשים‬‫שימושים‬‫המעידים‬‫על‬‫קשרי‬‫תלות‬‫למחלקות‬(‫יצירת‬‫אובייקטים‬‫וכד‬.)'
  • 6. ‫אדם‬ ‫מבן‬ ‫יורשים‬ ‫וחייל‬ ‫שסטודנט‬ ‫לראות‬ ‫בקלות‬ ‫ניתן‬ .‫אנוש‬ ‫בן‬ ‫של‬ ‫המחלקות‬ ‫היררכיית‬ ‫של‬ ‫מצומצמת‬ ‫גרסה‬ ‫מתאר‬ ‫התרשים‬ ‫מלבד‬ ,‫בג'אווה‬ ‫שהרי‬ ,‫מאובייקט‬ ‫יורש‬ ‫אנוש‬ ‫בן‬ ‫כי‬ ‫נציין‬ ,‫כן‬ ‫כמו‬ .‫אנוש‬ ‫מבן‬ ‫יורש‬ ‫אדם‬ ‫בן‬ ‫וכי‬‫כל‬ ,‫פרימיטיביים‬ ‫טיפוסים‬ .‫אוטומטי‬ ‫באופן‬ ‫מאובייקט‬ ‫יורשים‬ ‫הטיפוסים‬ ‫בהגדרת‬ ‫נביט‬Runner: public class Runner { public static void main(String[] args) { Student student = new Student(); System.out.println(student.type); Soldier soldier = new Soldier(); System.out.println(soldier.type); } } ‫בהרצת‬ ‫שיתקבל‬ ‫הפלט‬Runner‫את‬ ‫יורשים‬ ‫ושניהם‬ ‫היות‬ ,‫האובייקטים‬ ‫שני‬ ‫עבור‬ ‫זהה‬ ‫כמובן‬ ‫יהיה‬type‫מ‬-Human. ‫למעלה‬ ‫המרה‬)‫אוטומטי‬ ‫באופן‬ ‫מתבצעת‬ ,‫(כאמור‬ public class Runner { public static void main(String[] args) { Student student = new Student(); System.out.println(student.type); Soldier soldier = new Soldier(); System.out.println(soldier.type); Student s = new Student(); System.out.println(s); Person p = s; // Person p = (Person)s; - ‫אוטומטית‬ ‫למעלה‬ ‫המרה‬–‫ל‬ ‫שקולה‬ System.out.println(p); /* ‫מה‬‫שיודפס‬ Human Human Student@32e0c07c Student@32e0c07c */ } } ‫שסטודנט‬ ‫היא‬ ‫בעיות‬ ‫בלי‬ ‫תמיד‬ ‫תתבצע‬ ‫כזו‬ ‫שהמרה‬ ‫הסיבה‬ ,‫אדם‬ ‫לבן‬ ‫מסטודנט‬ ‫בוצעה‬ ‫למעלה‬ ‫שהמרה‬ ‫לראות‬ ‫ניתן‬ ‫בדוגמה‬ ,‫כן‬ ‫כמו‬ ,‫אדם‬ ‫בן‬ ‫אכן‬ ‫הוא‬‫ה‬ ‫מדיאגרמת‬ ‫ללמוד‬ ‫ניתן‬ ‫זאת‬ ‫כל‬ ,‫אובייקט‬ ‫הוא‬ ‫סטודנט‬ ‫כן‬ ‫וכמו‬ ‫אנוש‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬-UML .‫הירושה‬ ‫היררכיית‬ ‫את‬ ‫המתארת‬ ‫משתנה‬ ‫ע"י‬ ‫שמוחזק‬ ‫וסטודנט‬ ‫סטודנט‬ ‫מסוג‬ ‫משתנה‬ ‫ע"י‬ ‫שמוחזק‬ ‫שסטודנט‬ ‫הוא‬ ,‫בדוגמה‬ ‫אליו‬ ‫לב‬ ‫לשים‬ ‫שחשוב‬ ‫נוסף‬ ‫דבר‬ ‫הד‬ ‫כך‬ ‫במקרה‬ ‫לא‬ .‫האופן‬ ‫באותו‬ ‫מודפסים‬ ‫אדם‬ ‫בן‬ ‫מסוג‬‫בר‬-.‫עצמו‬ ‫האובייקט‬ ‫על‬ ‫השפעה‬ ‫אין‬ ‫באובייקט‬ ‫שמחזיק‬ ‫למשתנה‬ ‫המשתנה‬ ‫דרך‬ ,‫ובדוגמה‬ ,‫שונה‬ ‫בצורה‬ ‫לאובייקט‬ ‫להתייחס‬ ‫ניתן‬ ‫יהיה‬ ‫לפיה‬ ‫תווית‬ ‫כמעיין‬ ‫משמש‬ ‫המשתנה‬p,‫אדם‬ ‫בן‬ ‫מסוג‬ ‫לאובייקט‬ ‫ברפרנס‬ ‫המחזיק‬s‫שבנאד‬ ‫או‬ ‫אדם‬ ‫בבן‬ ‫שהוגדרו‬ ‫ומתודות‬ ‫למשתנים‬ ‫ורק‬ ‫אך‬ ‫לפנות‬ ‫נוכל‬ ,‫סטודנט‬ ‫מסוג‬‫ירש‬ ‫ם‬ ‫שהפנייה‬ ‫עוד‬ ‫כל‬ ‫יוסתרו‬ ,‫לסטודנט‬ ,‫בנאדם‬ ‫של‬ ‫ובמקרה‬ ‫הירושה‬ ‫בהיררכיית‬ ‫שמתחת‬ ‫למה‬ ‫ששייכים‬ ‫השדות‬ ,‫מלמעלה‬ ‫למטה‬ ‫ידנית‬ ‫המרה‬ ‫שתיעשה‬ ‫שברגע‬ ‫לציין‬ ‫חשוב‬ .‫שמומש‬ ‫מממשק‬ ‫או‬ ‫מורישה‬ ‫ממחלקה‬ ,"‫"מלמעלה‬ ‫תיעשה‬ ‫לאובייקט‬ ‫חסו‬ ‫שהיו‬ ‫המאפיינים‬ ‫כל‬ ‫גם‬ ‫יחזרו‬ ,‫סטודנט‬ ‫מטיפוס‬ ‫למשתנה‬ ‫בחזרה‬.‫כה‬ ‫כד‬ ‫מים‬
  • 7. ‫למטה‬ ‫המרה‬)‫ידני‬ ‫באופן‬ ‫מתבצעת‬ ,‫(כאמור‬ ‫אנחנו‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫לשאול‬ ‫עלינו‬ ‫למטה‬ ‫קאסטינג‬ ‫עושים‬ ‫כשאנחנו‬ .‫מבוקרת‬ ‫בצורה‬ ‫להיעשות‬ ‫צריכה‬ ‫למטה‬ ‫ההמרה‬ .‫האובייקט‬ ‫של‬ ‫המהות‬ ‫למקור‬ ‫בהתאם‬ ‫לא‬ ‫או‬ ‫חוקית‬ ‫המרה‬ ‫מבצעים‬ ,‫שהבאנו‬ ‫בדוגמה‬p‫ברפרנס‬ ‫החזיק‬.‫וחוקית‬ ‫אפשרית‬ ‫סטודנט‬ ‫לטיפוס‬ ‫בחזרה‬ ‫למטה‬ ‫המרה‬ ‫ולכן‬ ‫סטודנט‬ ‫מסוג‬ ‫לאובייקט‬ Student s1 = new Student(); System.out.println(s1); Person p = s1; // Person p = (Person)s1; - ‫אוטומטית‬ ‫למעלה‬ ‫המרה‬–‫ל‬ ‫שקולה‬ System.out.println(p); Student s2=(Student)p; // ‫המרה‬‫מלכתחילה‬ ‫שלו‬ ‫שהיו‬ ‫התכונות‬ ‫את‬ ‫לסטודנט‬ ‫ומחזירים‬ ‫היות‬ ‫תקינה‬ ‫למטה‬ ‫ידנית‬ ( ‫ריצה‬ ‫שגיאת‬ ‫תניב‬ ,‫חייל‬ ‫מסוג‬ ‫לטיפוס‬ ‫למטה‬ ‫להמיר‬ ‫ניסיון‬ClassCastException‫זאת‬ ,‫קומפילציה‬ ‫מבחינת‬ ‫תתאפשר‬ ‫אך‬ ,) ‫ומ‬ ‫היות‬-p‫מבחינת‬ ‫שמתחתיו‬ ‫לאובייקט‬ ‫ברפרנס‬ ‫שהחזיק‬ ‫משתנה‬ ‫רק‬ ‫היה‬ ‫זה‬ ,‫אובייקט‬ ‫נוצר‬ ‫לא‬,‫מחלקתית‬ ‫היררכיה‬ ‫המתכנת‬ ,‫המתכנת‬ ‫בידי‬ ‫היא‬ ‫לחוקיות‬ ‫האחריות‬ ,‫כן‬ ‫ועל‬ ,)‫אדם‬ ‫בבן‬ ‫(או‬ ‫בחייל‬ ‫או‬ ‫בסטודנט‬ ‫או‬ ‫להחזיק‬ ‫יכול‬ ‫הוא‬ ‫תיאורטית‬ :‫מדובר‬ ‫בפועל‬ ‫אובייקט‬ ‫באיזה‬ ‫לדעת‬ ‫שצריך‬ ‫זה‬ ‫הוא‬ Soldier sol=new Soldier(); sol=(Soldier)p; ‫במי‬ ‫להשתמש‬ ‫ניתן‬ ,‫האובייקט‬ ‫מקור‬ ‫מה‬ ‫לדעת‬ ‫ע"מ‬‫האופרטור‬ ,‫השמורה‬ ‫לה‬instanceof:‫הבא‬ ‫באופן‬ Student s3 = new Student(); Human h = s3; //‫למעלה‬ ‫המרה‬ if(h instanceof Student) { //‫בדיקה‬ Student s4 = (Student)h; //‫תקינה‬ ‫למטה‬ ‫המרה‬ } ‫אם‬‫מאיזה‬ ‫בוודאות‬ ‫שידוע‬ ,‫אובייקט‬ ‫ממנו‬ ‫נוצר‬ ‫שכן‬ ‫טיפוס‬ ‫של‬ ‫למטה‬ ‫בהמרה‬ ‫מדובר‬‫לטיפוס‬ ‫ממנו‬ ‫להמיר‬ ‫וננסה‬ ‫הוא‬ ‫טיפוס‬ ( ‫ריצה‬ ‫שגיאת‬ ‫נקבל‬ ,‫אחר‬ClassCastException:)‫אדם‬ ‫בן‬ ‫הוא‬ ‫(סטודנט‬ ‫סטודנט‬ ‫לא‬ ‫הוא‬ ‫אדם‬ ‫שבן‬ ‫ברור‬ ‫הבאה‬ ‫בדוגמה‬ ,) Person per=new Person(); Student s5=(Student)per; ,‫וממי‬ ‫למי‬ ‫להמיר‬ ‫ניתן‬ ‫מי‬ ‫את‬ ‫ההחלטה‬ ‫את‬ ‫לפשט‬ ‫מנת‬ ‫על‬‫היא‬ ‫להישאל‬ ‫שצריכה‬ ‫השאלה‬"?‫האובייקט‬ ‫מקור‬ ‫"מה‬ .‫אנוש‬ ‫לבן‬ ‫אותו‬ ‫להמיר‬ ‫ניתן‬ ,‫אנוש‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬ ‫אם‬ .‫אדם‬ ‫לבן‬ ‫אותו‬ ‫להמיר‬ ‫ניתן‬ ,‫אדם‬ ‫בן‬ ‫הוא‬ ‫סטודנט‬ ‫אם‬ .‫אותם‬ ‫להמיר‬ ‫ניתן‬ ‫לא‬ ‫ולכן‬ ‫לא‬ ?‫אדם‬ ‫בן‬ ‫הוא‬ ‫אנוש‬ ‫בן‬ ‫האם‬ ?‫חייל‬ ‫הוא‬ ‫אנוש‬ ‫בן‬ ‫האם‬ ,‫משמע‬ ?‫אדם‬ ‫כבן‬ ‫הזה‬ ‫לסטודנט‬ ‫מתייחס‬ ‫אני‬ ‫האם‬‫מה‬ ‫כל‬ ‫על‬ ‫איתו‬ "‫"לדבר‬ ‫ואז‬ ‫סטודנט‬ ‫כאל‬ ‫גם‬ ‫אליו‬ ‫להתייחס‬ ‫יכול‬ ‫אני‬ ‫על‬ ‫רק‬ ‫אלא‬ ,‫סטודנט‬ ‫כאל‬ ‫אליו‬ ‫לדבר‬ ‫יכול‬ ‫לא‬ ‫אני‬ ,‫אדם‬ ‫בן‬ ‫כאל‬ ‫אליו‬ ‫מתייחס‬ ‫שאני‬ ‫עוד‬ ‫כל‬ ‫אך‬ ,‫סטודנט‬ ‫עם‬ ‫לדבר‬ ‫שאפשר‬ .‫אדם‬ ‫לבני‬ ‫שכלליים‬ ‫דברים‬
  • 8. ‫היכו‬ ‫הוא‬ ,‫ג'אווה‬ ‫בשפת‬ ‫הטיפוסים‬ ‫המרת‬ ‫של‬ ‫הבולטים‬ ‫היתרונות‬ ‫אחד‬‫שונים‬ ‫סוגים‬ ‫לקבל‬ ‫שיכולות‬ ‫כלליות‬ ‫מתודות‬ ‫לייצר‬ ‫לת‬ ‫אנוש‬ ‫בני‬ ‫וגם‬ ‫אדם‬ ‫בני‬ ‫גם‬ ,‫סטודנטים‬ ‫גם‬ ,‫חיילים‬ ‫גם‬ ‫לקבל‬ ‫שתדע‬ ‫מתודה‬ ‫לייצר‬ ‫וברצוננו‬ ‫נניח‬ .‫כארגומנט‬ ‫אובייקטים‬ ‫של‬ :‫הבאה‬ ‫בהגדרה‬ ‫נביט‬ .‫גנרית‬ ‫בצורה‬ public void whois(Human h) { System.out.println("This is a "+h); } ‫של‬ ‫ההיררכיה‬ ‫במורד‬ ‫או‬ ‫שברמת‬ ‫מהמחלקות‬ ‫אחד‬ ‫לכל‬ ‫רפרנסים‬ ‫זו‬ ‫למתודה‬ ‫לשלוח‬ ‫נוכל‬ ,‫זה‬ ‫באופן‬Human: whois(new Student()); whois(new Person()); whois(new Human()); :‫כזה‬ ‫פלט‬ ‫ונקבל‬ This is a Student@603a3e21 This is a Person@fc519e2 This is a Human@55264c84 ‫את‬ ‫להציב‬ ‫ניתן‬ ‫בהם‬ ‫המשתנים‬ ‫סוגי‬ ‫על‬ ‫דיברנו‬ ,‫כה‬ ‫עד‬ .‫אליו‬ ‫הרפרנס‬ ‫אלא‬ ,‫עצמו‬ ‫האובייקט‬ ‫לא‬ ‫זה‬ ‫המרה‬ ‫שעובר‬ ‫מה‬ ,‫כן‬ ‫אם‬ .‫אחד‬ ‫ממשתנה‬ ‫ביותר‬ ‫להציב‬ ‫ניתן‬ ‫הרפרנס‬ ‫אותו‬ ‫שאת‬ ‫העובדה‬ ‫את‬ ‫נציין‬ ,‫כעת‬ .‫הרפרנס‬ ‫אותו‬ ‫יפנו‬ ,‫כך‬ ‫ובשל‬ ‫הרפרנס‬ ‫אותו‬ ‫את‬ ‫יכילו‬ ,‫זה‬ ‫ערך‬ ‫שיכילו‬ ‫המשתנים‬ ‫כל‬ ,‫זה‬ ‫במקרה‬)=( ‫להשמה‬ ‫בנוגע‬ ‫גם‬ ‫כך‬ ,‫האובייקט‬ ‫לאותו‬ .‫החדש‬ ‫במשתנה‬ ‫כמתבקש‬ ‫יושם‬ ‫הרפרנס‬ ‫רק‬ ,‫שינוי‬ ‫ללא‬ ‫יישאר‬ ‫עצמו‬ ‫האובייקט‬ ,‫שונים‬ ‫מחלקה‬ ‫משתני‬ ‫בין‬ ‫ערך‬ ‫תחזיר‬ ‫השוואה‬ .‫אובייקטים‬ ‫בין‬ )==( ‫השוואה‬ ‫על‬ ‫לדבר‬ ‫כן‬ ‫אם‬ ‫ניתן‬ ,‫האופן‬ ‫באותו‬‫אמת‬‫המושווים‬ ‫הרפרנסים‬ ‫אם‬ ‫ורק‬ ‫אך‬ , ‫התייחסו‬ ‫מבלי‬ ,‫זהים‬‫ערך‬ ‫תחזיר‬ ‫השוואה‬ ,‫כלומר‬ ,‫עצמו‬ ‫לתוכן‬ ‫ת‬‫שקר‬‫בעלי‬ ‫אך‬ ,‫התוכן‬ ‫מבחינת‬ ‫זהים‬ ‫האובייקטים‬ ‫אם‬ ‫גם‬ .‫שונה‬ ‫רפרנס‬ ‫מהמחלקה‬ ‫אוטומטי‬ ‫באופן‬ ‫יורשות‬ ‫המחלקות‬ ‫וכל‬ ‫היות‬Object‫ב‬ ‫להשתמש‬ ‫ניתן‬ ,-equals‫בין‬ ‫ההשוואה‬ ‫ביצוע‬ ‫לצורך‬ ‫המתודה‬ ‫של‬ ‫הדפולטיבי‬ ‫פעולתה‬ ‫אופן‬ ‫בין‬ ‫הבדל‬ ‫אין‬ .‫אובייקטים‬equals‫בין‬ ‫הבדל‬ ‫יש‬ ‫אך‬ ,== ‫האופרטור‬ ‫של‬ ‫פעולתו‬ ‫לאופי‬ ( ‫בג'אווה‬ ‫אופרטורים‬ ‫העמסת‬ ‫לבצע‬ ‫ניתן‬ ‫שלא‬ ‫בכך‬ ‫השניים‬‫ב‬ ‫אופרטורים‬ ‫העמסת‬ ‫לבצע‬ ‫ניתן‬ :‫טיפ‬-Groovy‫שפה‬ ‫שזו‬ , ‫מבוססת‬JVM‫לג'אווה‬ ‫דומה‬‫של‬ ‫פעולתה‬ ‫אופן‬ ‫את‬ ‫לשנות‬ ‫שניתן‬ ,‫ומכאן‬ ‫מתודות‬ ‫דריסת‬ ‫לבצע‬ ‫ניתן‬ ‫כן‬ ‫אך‬ ,)equals‫כך‬ , :‫המחדל‬ ‫ברירת‬ ‫בדרך‬ ‫עושה‬ ‫שהיא‬ ‫כפי‬ ,‫הרפרנס‬ ‫לפי‬ ‫ולא‬ ‫התוכן‬ ‫לפי‬ ‫ההשוואה‬ ‫את‬ ‫שתבצע‬ public boolean equals(Object obj) { /*New logic goes here*/ } ‫ה‬ ‫ברירת‬ ‫ערך‬ ‫את‬ ‫יקבל‬ ‫מחלקה‬ ‫מטיפוס‬ ‫משתנה‬‫מחדל‬null‫בוצע‬ ‫לא‬ ‫באם‬ ,instantiation‫לגבי‬ ‫אינדיקציה‬ ‫זוהי‬ ,‫כלומר‬ , ‫של‬ ‫הצבה‬ ‫לבצע‬ ‫גם‬ ‫(ניתן‬ ‫אובייקט‬ ‫לאף‬ ‫ברפרנס‬ ‫מחזיק‬ ‫לא‬ ‫זה‬ ‫שמשתנה‬ ‫העובדה‬null‫במשתנה‬ ‫לשימוש‬ ‫ניסיון‬ .)‫יזום‬ ‫באופן‬ ‫המכיל‬ ‫מחלקה‬ ‫מסוג‬null.‫ריצה‬ ‫לשגיאת‬ ‫יגרום‬ , ‫ר‬ ‫מכיל‬ ‫מחלקה‬ ‫מסוג‬ ‫משתנה‬ ‫האם‬ ‫בדיקה‬ ‫לבצע‬ ‫ניתן‬‫הוא‬ ‫האם‬ ‫בדיקה‬ ‫ע"י‬ ‫לא‬ ‫או‬ ‫לאובייקט‬ ‫פרנס‬==null‫או‬!=null