‫פנימיות‬ ‫מחלקות‬–Inner Classes
‫האובייקט‬ ‫של‬ ‫ולמתודות‬ ‫למשתנים‬ ‫גישה‬ ‫שלה‬ ‫למופע‬ ‫יש‬ ‫כן‬ ‫ועל‬ ‫אחרת‬ ‫מחלקה‬ ‫בתוך‬ ‫שמוגדרת‬ ‫מחלקה‬ ‫היא‬ ‫פנימית‬ ‫מחלקה‬
‫הגישה‬ ‫מציין‬ ‫בעלי‬ ‫לאלו‬ ‫גם‬ ,‫נוצר‬ ‫הוא‬ ‫שבנוכחותו‬private‫זו‬ ‫מחלקה‬ ‫תשמש‬ ‫לרוב‬ .‫בה‬ ‫החיצונית‬ ‫למחלקה‬ ‫עזר‬ ‫כמחלקת‬
:‫הבא‬ ‫באופן‬ ‫תוגדר‬ ‫פנימית‬ ‫מחלקה‬ .‫מוגדרת‬ ‫היא‬
public class OuterClass {
class InnerClass {
}
}
‫אותה‬ ‫מגדירים‬ ‫כן‬ ‫אם‬ ‫אלא‬ ,‫המכילה‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫של‬ ‫נוכחות‬ ‫אותה‬ ‫מבלי‬ ‫פנימית‬ ‫מחלקה‬ ‫של‬ ‫מופע‬ ‫ליצור‬ ‫ניתן‬ ‫לא‬
.‫מתאפשר‬ ‫הדבר‬ ‫ואז‬ ‫כסטטית‬
‫ני‬:‫דרכים‬ ‫בשלוש‬ ‫זו‬ ‫נוכחות‬ ‫להשיג‬ ‫תן‬
‫הראשונה‬‫האובייקט‬ ‫הוא‬ ‫מי‬ ‫ברור‬ ‫(ואז‬ ‫החיצונית‬ ‫המחלקה‬ ‫של‬ ‫בקונסטרקטור‬ ‫הפנימית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫יצירת‬ ‫ע"י‬ ,
:‫הקונסטרקטור‬ ‫של‬ ‫ההכרה‬ ‫בטווח‬ ‫גישה‬ ‫לנו‬ ‫תהיה‬ ‫זה‬ ‫לאובייקט‬ ,)‫החיצוני‬
public class OuterClass {
public OuterClass() {
InnerClass innerObject1=new InnerClass();
}
class InnerClass {
}
}
‫השניה‬‫האובייקט‬ ‫מיהו‬ ‫ברור‬ ‫אז‬ ‫(וגם‬ ‫החיצוני‬ ‫האובייקט‬ ‫של‬ ‫מופע‬ ‫מתודת‬ ‫בתוך‬ ‫הפנימית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫יצירת‬ ‫ע"י‬ ,
:‫פנימית‬ ‫מחלקה‬ ‫אובייקט‬ ‫לאותו‬ ‫ברפרנס‬ ‫ולהחזיק‬ ‫להמשיך‬ ‫ניתן‬ ‫גם‬ ‫אז‬ ,)‫החיצוני‬
public class OuterClass {
public InnerClass getInnerObj() {
return new InnerClass();
}
class InnerClass {
}
}
OuterClass outerObject=new OuterClass(); //In
OuterClass.InnerClass innerObject2=outerObject.getInnerObj(); //Main...
‫השלישית‬‫שימוש‬ ‫ע"י‬ ,‫החיצונית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫אותו‬ ‫מיהו‬ ‫ברור‬ ‫כמובן‬ ‫כאן‬ ‫(גם‬ ‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬ ‫ברפרנס‬
:)‫נוצר‬ ‫הוא‬ ‫בנוכחותו‬
OuterClass.InnerClass innerObject3=outerObject.new InnerClass(); //In Main...
OR
OuterClass.InnerClass innerObject4=new OuterClass().new InnerClass(); //In Main...
‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬ ‫ברפרנס‬ ‫טמון‬ ‫החיצונית‬ ‫המחלקה‬ ‫של‬ ‫זה‬ ‫לבין‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫האובייקט‬ ‫בין‬ ‫הקשר‬
.‫הקלעים‬ ‫מאחורי‬ ‫נסתרת‬ ‫בצורה‬ ‫מחזיק‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫שהאובייקט‬
‫לאפש‬ ,‫לדוגמה‬ ‫ובכך‬ ‫הקיימים‬ ‫הגישה‬ ‫מצייני‬ ‫בכל‬ ‫להשתמש‬ ‫ניתן‬ ,‫פנימיות‬ ‫מחלקות‬ ‫עבור‬‫מציין‬ ‫ע"י‬ ‫המחלקה‬ ‫של‬ ‫הסתרה‬ ‫ר‬
‫הגישה‬private,‫מכיר‬ ‫שהוא‬ ‫המחלקה‬ ‫של‬ ‫ההגדרה‬ ‫בטווח‬ ‫המתחולל‬ ‫על‬ ‫כלל‬ ‫ידע‬ ‫לא‬ ‫החיצונית‬ ‫במחלקה‬ ‫שהמשתמש‬ ‫כך‬ ,
.‫כלל‬ ‫עליה‬ ‫ידע‬ ‫בה‬ ‫שהמשתמש‬ ‫מבלי‬ ‫החיצונית‬ ‫של‬ ‫פעולתה‬ ‫על‬ ‫להקל‬ ‫תבוא‬ ‫ולרוב‬ ‫מוסתרת‬ ‫תהיה‬ ‫הפנימית‬ ‫המחלקה‬ ‫פעולת‬
‫במתו‬ ‫פנימית‬ ‫מחלקה‬ ‫להגדיר‬ ‫ניתן‬‫המתודה‬ ‫לאותה‬ ‫יהיה‬ ‫שלה‬ ‫ההכרה‬ ‫וטווח‬ ‫בלבד‬ ‫המתודה‬ ‫של‬ ‫לפעולתה‬ ‫שתעזור‬ ‫כזו‬ ,‫דה‬
‫כקבוע‬ ‫הוגדר‬ ‫הוא‬ ‫אם‬ ‫רק‬ ‫המתודה‬ ‫של‬ ‫למשתנה‬ ‫גישה‬ ‫תתאפשר‬ ‫במתודה‬ ‫פנימית‬ ‫למחלקה‬ ,‫זאת‬ ‫עם‬ ,‫בלבד‬ ‫הוגדרה‬ ‫היא‬ ‫בה‬
final‫המש‬ ‫של‬ ‫עותק‬ ‫נוצר‬ ‫המתודה‬ ‫בתוך‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫היצירה‬ ‫ובעת‬ ‫היות‬ ,‫חלה‬ ‫זו‬ ‫דרישה‬ .‫עבור‬ ‫המקומיים‬ ‫תנים‬
‫בין‬ ‫קשר‬ ‫יהיה‬ ‫לא‬ ‫ואז‬ ‫המתודה‬ ‫פעולת‬ ‫במהלך‬ ‫להשתנות‬ ‫מהם‬ ‫מניעה‬ ‫אין‬ ,‫כסופיים‬ ‫יוגדרו‬ ‫לא‬ ‫אלו‬ ‫אם‬ .‫הפנימית‬ ‫המחלקה‬
‫של‬ ‫לאופיים‬ ‫הודות‬ !‫זהים‬ ‫להיות‬ ‫אמורים‬ ‫שהם‬ ‫והרי‬ ,‫למתודה‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫למשתנה‬ ‫המתודה‬ ‫של‬ ‫המשתנה‬
‫פני‬ ‫ממחלקה‬ ‫שנוצר‬ ‫אובייקט‬ ,‫סופיים‬ ‫משתנים‬‫מטווח‬ ‫ביציאה‬ ‫גם‬ ‫הסופי‬ ‫המקומי‬ ‫המשתנה‬ ‫את‬ ‫יכיר‬ ‫זו‬ ‫מית‬‫של‬ ‫ההכרה‬
!‫המתודה‬
public class OuterClass {
public void defineMethodInnerClass() {
int var=0;
final int finalVar=0;
class methodInnerClass {
public methodInnerClass() {
//System.out.println(var); *ERROR*
System.out.println(finalVar); //*OK*
}
}
}
}
‫השמורה‬ ‫במילה‬ ‫להשתמש‬ ‫ניתן‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫מתודות‬ ‫בתוך‬this‫או‬ ,‫שנוצר‬ ‫הפנימי‬ ‫לאובייקט‬ ‫רפרנס‬ ‫לקבל‬ ‫ע"מ‬
‫ואז‬ ‫נקודה‬ ,‫החיצונית‬ ‫המחלקה‬ ‫בשם‬this‫רפרנס‬ ‫לקבל‬ ‫ע"מ‬:‫נוצר‬ ‫הפנימית‬ ‫של‬ ‫האובייקט‬ ‫בנוכחותו‬ ‫החיצוני‬ ‫לאובייקט‬
public class OuterClass {
private int sum=0;
public void setSum(int sum) {
this.sum=sum;
}
class InnerClass {
private int sum=0;
public void incInnerSum() {
this.sum++;
}
public void incOuterSum() {
OuterClass.this.sum++;
}
}
}
,‫בשמה‬ ‫הפנימית‬ ‫למחלקה‬ ‫לקרוא‬ ‫מספיק‬ ,‫העוטפת‬ ‫המחלקה‬ ‫של‬ ‫ההכרה‬ ‫בטווח‬ ‫נמצאים‬ ‫אנו‬ ‫כאשר‬ ,‫המחלקה‬ ‫שם‬ ‫מבחינת‬
‫ונקודה‬ ‫שמה‬ ‫לפני‬ ‫החיצונית‬ ‫המחלקה‬ ‫שם‬ ‫בצירוף‬ ‫הפנימית‬ ‫למחלקה‬ ‫לקרוא‬ ‫יש‬ ,‫זה‬ ‫הכרה‬ ‫לטווח‬ ‫מחוץ‬ ‫כאשר‬ ‫אך‬‫מפרידה‬
(Full Qualified Name.)
.‫הפניה‬ ‫אופן‬ ‫את‬ ‫לקצר‬ ‫דרך‬ ‫יש‬ ,)‫בהמשך‬ ‫(נסביר‬ ‫סטטיות‬ ‫פנימיות‬ ‫במחלקות‬ ‫מדובר‬ ‫כאשר‬
‫שם‬ ‫במבנה‬ ‫קטן‬ ‫שינוי‬ ‫מלבד‬ ‫הרגילות‬ ‫המחלקות‬ ‫קבצי‬ ‫לבין‬ ‫הפנימיות‬ ‫המחלקות‬ ‫קבצי‬ ‫בין‬ ‫הבדל‬ ‫אין‬ ,‫המחלקה‬ ‫קובץ‬ ‫מבחינת‬
‫ה‬ ‫ומבחינת‬ ‫היות‬ ‫זאת‬ ,‫הקובץ‬-JVM‫מ‬ ‫בין‬ ‫הבדל‬ ‫אין‬ ,:‫חיצונית‬ ‫מחלקה‬ ‫לבין‬ ‫פנימית‬ ‫חלקה‬
‫החיצונית‬ ‫המחלקה‬ ‫קובץ‬OuterClass:‫כך‬ ‫ייראה‬OuterClass.class
‫הפנימית‬ ‫המחלקה‬ ‫קובץ‬InnerClass:‫כך‬ ‫ייראה‬ ‫בתוכה‬ ‫שמוגדרת‬OuterClass$InnerClass.class.
‫שיקוף‬ ‫נבצע‬ ‫כאשר‬ ‫זה‬ ‫בעניין‬ ‫נעמיק‬-Reflection-.‫בהמשך‬ ‫לפרטים‬ ‫שיוסבר‬ ‫נושא‬
‫מחלקות‬‫אנונימיות‬ ‫פנימיות‬–Anonymous Inner Classes
‫ולא‬ ,‫ויחיד‬ ‫אחד‬ ‫אובייקט‬ ‫ממנה‬ ‫נוצר‬ ‫שלרוב‬ ,)‫(קונסטרקטור‬ ‫בונה‬ ‫פונקציה‬ ‫וחסרת‬ ‫שם‬ ‫חסרת‬ ‫להיות‬ ‫יכולה‬ ‫פנימית‬ ‫מחלקה‬
‫מוגדרת‬ "‫מזדמנת‬ ‫"עבודה‬ ‫מבצעת‬ ‫שלרוב‬ ‫מסוים‬ ‫במובן‬ "‫"מנוונת‬ ‫מחלקה‬ ‫זוהי‬ .‫שלה‬ ‫נוספים‬ ‫מופעים‬ ‫ידני‬ ‫באופן‬ ‫לייצר‬ ‫ניתן‬
.‫מראש‬
‫להשתמש‬ ‫נבחר‬ ‫בהם‬ ‫המקרים‬ ‫אותם‬ ‫בכל‬ ‫רגילה‬ ‫פנימית‬ ‫במחלקה‬ ‫להשתמש‬ ‫בעיה‬ ‫טכנית‬ ‫מבחינה‬ ‫שאין‬ ,‫ראשית‬ ‫נציין‬
‫"כדת‬ ‫מחלקה‬ ‫להגדיר‬ ‫מיותר‬ ‫זה‬ ‫יהיה‬ ,‫זאת‬ ‫עם‬ ,‫לרוב‬ .‫אחר‬ ‫דבר‬ ‫מכל‬ ‫יותר‬ ‫אסטטי‬ ‫עניין‬ ‫זהו‬ ,‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬
‫מחלקה‬ ‫דורשת‬ ‫שאינה‬ ‫פעמית‬ ‫חד‬ ‫משימה‬ ‫ביצוע‬ ‫לצורך‬ "‫וכדין‬.‫שכזו‬
:‫נרשום‬ ‫אנונימית‬ ‫פנימית‬ ‫מחלקה‬ ‫אובייקט‬ ‫אותו‬ ‫את‬ ‫לייצר‬ ‫ע"מ‬
new Type(/*ARGUMENTS*/) {
/*Methods and Variables that extend/implement class/interface Type*/
};
‫מסוג‬ ‫במשתנה‬ ‫נציב‬ ‫אותו‬ ‫אנונימית‬ ‫מחלקה‬ ‫מאותה‬ ‫שנוצר‬ ‫חדש‬ ‫לאובייקט‬ ‫רפרנס‬ ‫חזרה‬ ‫ונקבל‬Type.
‫המשתנה‬ ‫דרך‬‫החד‬ ‫החדש‬ ‫בטיפוס‬ ‫שהגדרנו‬ ‫למשתנים/מתודות‬ ‫לפנות‬ ‫נוכל‬ ‫לא‬ ‫אנחנו‬ ,‫הזה‬-‫מכיר‬ ‫לא‬ ‫הוא‬ ‫שהרי‬ ‫כמובן‬ ‫פעמי‬
‫אותנו‬ ‫ששימש‬ ‫מהטיפוס‬ ‫אחת‬ ‫מתודה‬ ‫לפחות‬ ,‫חדש‬ ‫טיפוס‬ ‫באותו‬ ‫להשתמש‬ ‫שנוכל‬ ‫ע"מ‬ ,‫ולכן‬ ,‫אותם‬ ‫לראות‬ ‫יכול‬ ‫ולא‬ ‫אותם‬
‫המתודות‬ ‫בכל‬ ‫להשתמש‬ ‫כבר‬ ‫ניתן‬ ‫זו‬ ‫מתודה‬ ‫דרך‬ .‫להידרס‬ ‫צריכה‬ ‫כבסיס‬.‫שהגדרנו‬ ‫והמשתנים‬ ‫החדשות‬
Type‫ו‬ ,)‫ארגומנטים‬ ‫שולחים‬ ‫לא‬ ‫אז‬ ‫(אבל‬ ‫מיישמת‬ ‫האנונימית‬ ‫הפנימית‬ ‫שהמחלקה‬ ‫אינטרפייס‬ ‫מטיפוס‬ ‫להיות‬ ‫יכול‬-Type‫גם‬
.‫מרחיבה‬ ‫האנונימית‬ ‫הפנימית‬ ‫שהמחלקה‬ ‫מחלקה‬ ‫להיות‬ ‫יכול‬
.‫אנונימית‬ ‫פנימית‬ ‫מחלקה‬ ‫של‬ ‫למימוש‬ ‫דוגמה‬ ‫נראה‬
‫היררכיית‬ ‫את‬ ‫נבחן‬:‫המחלקות‬ ‫והגדרת‬
public class Human {
public void cout() {
System.out.println("I'm a Human!");
}
}
public class Person extends Human {
public void use() {
Human human1=new Human();
Human human2=new Human(/*No Arguments - Default Constructor @ class Human*/) {
/*Variables that extend class Human*/
int unique=10;
/*Methods that extend class Human*/
public void cout() {
super.cout();
System.out.println("But not just a Human...");
cantAccessDirectly(unique);
}
public void cantAccessDirectly(int u) {
System.out.println("I'm a special kind of Human!");
System.out.println("My Unique ID is: "+u);
}
};
System.out.println("******************************");
System.out.println("cout of human1:");
human1.cout();
System.out.println("******************************");
System.out.println("cout of human2:");
human2.cout();
System.out.println("******************************");
}
}
‫ב‬ ‫ניצור‬-main‫מטיפוס‬ ‫אובייקט‬Person‫את‬ ‫עליו‬ ‫נפעיל‬ ,use():‫הבא‬ ‫הפלט‬ ‫את‬ ‫ונקבל‬
******************************
cout of human1:
I'm a Human!
******************************
cout of human2:
I'm a Human!
But not just a Human...
I'm a special kind of Human!
My Unique ID is: 10
******************************
‫האובייקט‬ ‫יצירת‬ ‫בין‬ ‫להבדלים‬ ‫לב‬ ‫נשים‬human1‫ו‬-human2‫מהמחלקה‬ ‫נוצר‬ ‫הראשון‬ ,Human‫פנימית‬ ‫ממחלקה‬ ‫והשני‬
‫המחלקה‬ ‫את‬ ‫רגעי‬ ‫באופן‬ ‫מרחיבה‬ ‫אשר‬ ,‫אנונימית‬Human.
‫המתודה‬ ‫את‬ ‫לדרוס‬ ‫דאגנו‬ ‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬cout()‫של‬ ‫הפעלה‬ ‫לאפשר‬ ‫ע"מ‬ ‫זאת‬ ,‫מהמחלקה‬ ‫מוכרת‬ ‫מתודה‬
Human‫את‬ ‫להפעיל‬ ‫נרצה‬ ‫שכאשר‬ ‫כך‬ ,cout()‫דרך‬human1‫את‬ ‫נפעיל‬ ,cout()‫של‬Human‫נפעיל‬ ‫כאשר‬ ‫אך‬ ,‫הסטנדרטית‬
‫את‬cout()‫של‬human2.‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬ ‫שנדרסה‬ ‫זו‬ ‫את‬ ‫נפעיל‬ ,
‫המתודה‬ ‫דרך‬ ,‫זה‬ ‫באופן‬cout()‫שהוגדרו‬ ‫נוספות‬ ‫מתודות‬ ‫להפעיל‬ ‫נוכל‬ ,‫הדרוסה‬‫לדוגמה‬ ,‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬
cantAccessDirectly()‫המחלקה‬ ‫מופע‬ ‫דרך‬ ‫ישיר‬ ‫באופן‬ ‫אליה‬ ‫לגשת‬ ‫נוכל‬ ‫שלא‬ ‫מתודה‬ ,‫היא‬ ‫כן‬ ‫שכשמה‬ ,human2‫רק‬ ‫אלא‬ ,
‫ובראשן‬ ‫במחלקה‬ ‫האחרות‬ ‫המתודות‬ ‫דרך‬cout().
‫ע‬ ‫שאנו‬ ‫האובייקט‬ ‫בהם‬ ‫במצבים‬ ‫תהיה‬ ‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬ ‫שימוש‬ ‫לבצע‬ ‫ההעדפה‬ ,‫כאמור‬‫הוא‬ ‫שימוש‬ ‫בו‬ ‫ושים‬
‫"חד‬ ‫אובייקט‬-‫אין‬ ‫אך‬ ,‫התכנית‬ ‫כל‬ ‫משך‬ ‫שרץ‬ ‫כזה‬ ‫אפילו‬ ‫או‬ ,‫יותר‬ ‫בו‬ ‫צריך‬ ‫ולא‬ ‫מסוימת‬ ‫עבודה‬ ‫שעושה‬ ‫כזה‬ ‫אובייקט‬ ,"‫פעמי‬
.‫כזה‬ ‫אחד‬ ‫מאובייקט‬ ‫ביותר‬ ‫להחזיק‬ ‫לוגי‬ ‫או‬ ‫ממשי‬ ‫צורך‬
‫חוטים‬ ‫בשני‬ ‫להחזיק‬ ‫וברצוננו‬ ‫מחשב‬ ‫משחק‬ ‫המהווה‬ ‫תכנית‬ ‫כותבים‬ ‫אנו‬ ‫בו‬ ‫מקרה‬ ‫לדוגמה‬ ‫ניקח‬-‫ת‬( ‫הליכונים‬threads‫הרצים‬ )
‫המחשב‬ ‫של‬ ‫המהלכים‬ ‫חישובי‬ ‫של‬ ‫הלוגיקה‬ ‫להרצת‬ ‫אחראי‬ ‫והשני‬ ‫הגרפי‬ ‫המשתמש‬ ‫ממשק‬ ‫את‬ ‫מריץ‬ ,‫האחד‬ :‫במקביל‬
.)‫המשתמש‬ ‫של‬ ‫התור‬ ‫בזמן‬ ‫משלו‬ ‫מהלכים‬ ‫יחשב‬ ‫(המחשב‬
‫ג‬ ,‫ולכן‬ ‫העבודה‬ ‫אותה‬ ‫את‬ ‫שיעשה‬ ‫תהליכון‬ ‫בעוד‬ ‫צורך‬ ‫ואין‬ ,‫ספציפי‬ ‫תהליכון‬ ‫זהו‬ ,"‫"חושב‬ ‫שהמחשב‬ ‫בזמן‬‫אמתי‬ ‫צורך‬ ‫אין‬ ‫ם‬
‫מ‬ ‫שתירש‬ ‫מחלקה‬ ‫של‬ ‫יצירה‬ ‫על‬ ‫לוותר‬ ‫ניתן‬ ,‫כאלו‬ ‫במקרים‬ .‫התהליכון‬ ‫את‬ ‫שתייצג‬ ‫במחלקה‬-thread‫רק‬ ‫בה‬ ‫שנשתמש‬ ‫כדי‬
‫עוד‬ ‫אין‬ ,‫סיימנו‬ ‫ובזאת‬ ‫לתהליכון‬ ‫נשלח‬ ‫שאותו‬ ‫פעמי‬ ‫חד‬ ‫אובייקט‬ ‫ליצור‬ ‫לנו‬ ‫מספיק‬ ,‫זה‬ ‫במקום‬ ,‫ההרצה‬ ‫בתחילת‬ ‫אחת‬ ‫פעם‬
‫התכני‬ ‫סוף‬ ‫עד‬ ‫כאלו‬ ‫באובייקטים‬ ‫צורך‬...‫ת‬
‫ל‬ ‫רוצים‬ ‫אנו‬ ‫בהם‬ ‫למקרים‬ ‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬ ‫הצורך‬ ‫את‬ ‫לשייך‬ ‫ניתן‬ ,‫לסיכום‬‫ייצר‬‫יותר‬ ,‫ממחלקה‬ ‫אובייקט‬
.‫אובייקטים‬ ‫לייצר‬ ‫ניתן‬ ‫ממנה‬ ‫מחלקה‬ ‫מאשר‬
‫סטטיות‬ ‫פנימיות‬ ‫מחלקות‬–Static Nested Classes
.)‫רגילה‬ ‫למחלקה‬ ‫(בניגוד‬ ‫כסטטית‬ ‫להגדרה‬ ‫ניתנת‬ ‫פנימית‬ ‫מחלקה‬
‫זו‬ ‫מחלקה‬ ‫מסוג‬ ‫אובייקט‬ ‫כלומר‬ ,‫המכילה‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫של‬ ‫נוכחות‬ ‫ללא‬ ‫גם‬ ‫אובייקט‬ ‫יווצר‬ ‫סטטית‬ ‫פנימית‬ ‫ממחלקה‬
.‫כזה‬ ‫לאובייקט‬ ‫רפרנס‬ ‫יכיל‬ ‫ולא‬ ‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬ ‫קשור‬ ‫אינו‬
‫המחלקה‬ ‫של‬ ‫אובייקט‬ ‫(לדוגמה‬ ‫פנימית‬ ‫מחלקה‬ ‫של‬ ‫אובייקט‬ ‫לייצר‬ ‫נרצה‬ ‫באם‬StaticNestedClass‫בהמשך‬‫מתודה‬ ‫דרך‬ )
‫במתודת‬ ‫לדוגמת‬ ,‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫סטטית‬main:‫הבא‬ ‫באופן‬ ,‫כסטטית‬ ‫מוגדרת‬ ‫להיות‬ ‫הפנימית‬ ‫המחלקה‬ ‫על‬ ,
public class OuterClass {
static class StaticNestedClass {
public void staticNestedMethod() {
}
}
}
‫ב‬ ‫האובייקט‬ ‫יצירת‬-main:‫כך‬ ‫תתבצע‬
OuterClass.StaticNestedClass staticNestedObject1=new OuterClass.StaticNestedClass();
staticNestedObject1.staticNestedMethod();
‫ב‬ ‫משימוש‬ ‫להימנע‬ ‫ניתן‬ ,‫כאמור‬-Full Qualified Name‫של‬ ‫ביצוע‬ ‫ע"י‬ ,import‫המחלקה‬ ‫לקובץ‬ ‫הסטטית‬ ‫המחלקה‬ ‫של‬
‫ה‬ ‫מתודת‬ ‫נמצאת‬ ‫(בה‬ ‫המריצה‬-main.)
.‫הדפולטיבית‬ ‫מהחבילה‬ ‫שונה‬ ‫לחבילה‬ ‫להשתייך‬ ‫צריכות‬ ‫המחלקות‬ ,‫סטטית‬ ‫מחלקה‬ ‫של‬ ‫ייבוא‬ ‫ביצוע‬ ‫שלשם‬ ‫לציין‬ ‫יש‬
:‫כך‬ ‫ייבוא‬ ‫ונבצע‬ ‫לחבילות‬ ‫הקבצים‬ ‫את‬ ‫נשייך‬ ,‫כן‬ ‫על‬
package somepackage;
import staticimport.OuterClass.StaticNestedClass;
,‫הרגע‬ ‫ומאותו‬‫הפ‬ ‫למחלקה‬ ‫לפנות‬ ‫יהיה‬ ‫ניתן‬:‫ההיררכיה‬ ‫במעלה‬ ‫הייתה‬ ‫כאילו‬ ‫הסטטית‬ ‫נימית‬
StaticNestedClass staticNestedObject2=new StaticNestedClass();
staticNestedObject2.staticNestedMethod();
‫שנייצר‬ ‫אובייקט‬ ‫בהם‬ ‫במקרים‬ ‫בה‬ ‫לשימוש‬ ‫יתרון‬ ‫יש‬ .‫ייחודיים‬ ‫די‬ ‫מקרים‬ ‫הם‬ ,‫סטטית‬ ‫פנימית‬ ‫במחלקה‬ ‫נשתמש‬ ‫בהם‬ ‫המקרים‬
‫ממנה‬‫כ‬ ‫שהוגדר‬ ‫סטטי‬ ‫לשדה‬ ‫לגשת‬ ‫צריך‬-private.‫העוטפת‬ ‫במחלקה‬
‫בטווח‬ ‫לכלול‬ ‫צורך‬ ‫לנו‬ ‫יש‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫נשאל‬ ,‫לא‬ ‫או‬ ‫סטטית‬ ‫שלנו‬ ‫הפנימית‬ ‫המחלקה‬ ‫תהיה‬ ‫באם‬ ‫בהחלטה‬ ‫מקדים‬ ‫כשיקול‬
‫ל‬ ‫נוכל‬ ,‫כן‬ ‫באם‬ ,)‫לה‬ ‫(החיצונית‬ ‫העוטפת‬ ‫למחלקה‬ ‫השייכים‬ ‫סטטיים‬ ‫שאינם‬ ‫מתודות‬ ‫או‬ ‫משתנים‬ ‫זו‬ ‫מחלקה‬ ‫של‬ ‫ההכרה‬‫הבין‬
‫כ‬ ‫ולהגדירה‬ ‫לנסות‬ ‫שלא‬‫סטטית‬.‫קומפילציה‬ ‫שגיאת‬ ‫נקבל‬ ‫שהרי‬
‫לזכור‬ ‫יש‬–‫היא‬ ,‫לוגית‬ ‫מבחינה‬ ‫היררכיה‬ ‫בראש‬ ‫שיושבת‬ ‫עצמאית‬ ‫למחלקה‬ ‫נחשבת‬ ‫סטטית‬ ‫מחלקה‬ ,‫היררכית‬ ‫מבחינה‬
.‫ונוחיות‬ ‫סדר‬ ‫לשם‬ ‫רק‬ ‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫הכרה‬ ‫בתחום‬ ‫ממוקמת‬

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

  • 2.
    ‫פנימיות‬ ‫מחלקות‬–Inner Classes ‫האובייקט‬‫של‬ ‫ולמתודות‬ ‫למשתנים‬ ‫גישה‬ ‫שלה‬ ‫למופע‬ ‫יש‬ ‫כן‬ ‫ועל‬ ‫אחרת‬ ‫מחלקה‬ ‫בתוך‬ ‫שמוגדרת‬ ‫מחלקה‬ ‫היא‬ ‫פנימית‬ ‫מחלקה‬ ‫הגישה‬ ‫מציין‬ ‫בעלי‬ ‫לאלו‬ ‫גם‬ ,‫נוצר‬ ‫הוא‬ ‫שבנוכחותו‬private‫זו‬ ‫מחלקה‬ ‫תשמש‬ ‫לרוב‬ .‫בה‬ ‫החיצונית‬ ‫למחלקה‬ ‫עזר‬ ‫כמחלקת‬ :‫הבא‬ ‫באופן‬ ‫תוגדר‬ ‫פנימית‬ ‫מחלקה‬ .‫מוגדרת‬ ‫היא‬ public class OuterClass { class InnerClass { } } ‫אותה‬ ‫מגדירים‬ ‫כן‬ ‫אם‬ ‫אלא‬ ,‫המכילה‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫של‬ ‫נוכחות‬ ‫אותה‬ ‫מבלי‬ ‫פנימית‬ ‫מחלקה‬ ‫של‬ ‫מופע‬ ‫ליצור‬ ‫ניתן‬ ‫לא‬ .‫מתאפשר‬ ‫הדבר‬ ‫ואז‬ ‫כסטטית‬ ‫ני‬:‫דרכים‬ ‫בשלוש‬ ‫זו‬ ‫נוכחות‬ ‫להשיג‬ ‫תן‬ ‫הראשונה‬‫האובייקט‬ ‫הוא‬ ‫מי‬ ‫ברור‬ ‫(ואז‬ ‫החיצונית‬ ‫המחלקה‬ ‫של‬ ‫בקונסטרקטור‬ ‫הפנימית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫יצירת‬ ‫ע"י‬ , :‫הקונסטרקטור‬ ‫של‬ ‫ההכרה‬ ‫בטווח‬ ‫גישה‬ ‫לנו‬ ‫תהיה‬ ‫זה‬ ‫לאובייקט‬ ,)‫החיצוני‬ public class OuterClass { public OuterClass() { InnerClass innerObject1=new InnerClass(); } class InnerClass { } } ‫השניה‬‫האובייקט‬ ‫מיהו‬ ‫ברור‬ ‫אז‬ ‫(וגם‬ ‫החיצוני‬ ‫האובייקט‬ ‫של‬ ‫מופע‬ ‫מתודת‬ ‫בתוך‬ ‫הפנימית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫יצירת‬ ‫ע"י‬ , :‫פנימית‬ ‫מחלקה‬ ‫אובייקט‬ ‫לאותו‬ ‫ברפרנס‬ ‫ולהחזיק‬ ‫להמשיך‬ ‫ניתן‬ ‫גם‬ ‫אז‬ ,)‫החיצוני‬ public class OuterClass { public InnerClass getInnerObj() { return new InnerClass(); } class InnerClass { } } OuterClass outerObject=new OuterClass(); //In OuterClass.InnerClass innerObject2=outerObject.getInnerObj(); //Main... ‫השלישית‬‫שימוש‬ ‫ע"י‬ ,‫החיצונית‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫אותו‬ ‫מיהו‬ ‫ברור‬ ‫כמובן‬ ‫כאן‬ ‫(גם‬ ‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬ ‫ברפרנס‬ :)‫נוצר‬ ‫הוא‬ ‫בנוכחותו‬ OuterClass.InnerClass innerObject3=outerObject.new InnerClass(); //In Main... OR OuterClass.InnerClass innerObject4=new OuterClass().new InnerClass(); //In Main...
  • 3.
    ‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬‫ברפרנס‬ ‫טמון‬ ‫החיצונית‬ ‫המחלקה‬ ‫של‬ ‫זה‬ ‫לבין‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫האובייקט‬ ‫בין‬ ‫הקשר‬ .‫הקלעים‬ ‫מאחורי‬ ‫נסתרת‬ ‫בצורה‬ ‫מחזיק‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫שהאובייקט‬ ‫לאפש‬ ,‫לדוגמה‬ ‫ובכך‬ ‫הקיימים‬ ‫הגישה‬ ‫מצייני‬ ‫בכל‬ ‫להשתמש‬ ‫ניתן‬ ,‫פנימיות‬ ‫מחלקות‬ ‫עבור‬‫מציין‬ ‫ע"י‬ ‫המחלקה‬ ‫של‬ ‫הסתרה‬ ‫ר‬ ‫הגישה‬private,‫מכיר‬ ‫שהוא‬ ‫המחלקה‬ ‫של‬ ‫ההגדרה‬ ‫בטווח‬ ‫המתחולל‬ ‫על‬ ‫כלל‬ ‫ידע‬ ‫לא‬ ‫החיצונית‬ ‫במחלקה‬ ‫שהמשתמש‬ ‫כך‬ , .‫כלל‬ ‫עליה‬ ‫ידע‬ ‫בה‬ ‫שהמשתמש‬ ‫מבלי‬ ‫החיצונית‬ ‫של‬ ‫פעולתה‬ ‫על‬ ‫להקל‬ ‫תבוא‬ ‫ולרוב‬ ‫מוסתרת‬ ‫תהיה‬ ‫הפנימית‬ ‫המחלקה‬ ‫פעולת‬ ‫במתו‬ ‫פנימית‬ ‫מחלקה‬ ‫להגדיר‬ ‫ניתן‬‫המתודה‬ ‫לאותה‬ ‫יהיה‬ ‫שלה‬ ‫ההכרה‬ ‫וטווח‬ ‫בלבד‬ ‫המתודה‬ ‫של‬ ‫לפעולתה‬ ‫שתעזור‬ ‫כזו‬ ,‫דה‬ ‫כקבוע‬ ‫הוגדר‬ ‫הוא‬ ‫אם‬ ‫רק‬ ‫המתודה‬ ‫של‬ ‫למשתנה‬ ‫גישה‬ ‫תתאפשר‬ ‫במתודה‬ ‫פנימית‬ ‫למחלקה‬ ,‫זאת‬ ‫עם‬ ,‫בלבד‬ ‫הוגדרה‬ ‫היא‬ ‫בה‬ final‫המש‬ ‫של‬ ‫עותק‬ ‫נוצר‬ ‫המתודה‬ ‫בתוך‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫היצירה‬ ‫ובעת‬ ‫היות‬ ,‫חלה‬ ‫זו‬ ‫דרישה‬ .‫עבור‬ ‫המקומיים‬ ‫תנים‬ ‫בין‬ ‫קשר‬ ‫יהיה‬ ‫לא‬ ‫ואז‬ ‫המתודה‬ ‫פעולת‬ ‫במהלך‬ ‫להשתנות‬ ‫מהם‬ ‫מניעה‬ ‫אין‬ ,‫כסופיים‬ ‫יוגדרו‬ ‫לא‬ ‫אלו‬ ‫אם‬ .‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫לאופיים‬ ‫הודות‬ !‫זהים‬ ‫להיות‬ ‫אמורים‬ ‫שהם‬ ‫והרי‬ ,‫למתודה‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫למשתנה‬ ‫המתודה‬ ‫של‬ ‫המשתנה‬ ‫פני‬ ‫ממחלקה‬ ‫שנוצר‬ ‫אובייקט‬ ,‫סופיים‬ ‫משתנים‬‫מטווח‬ ‫ביציאה‬ ‫גם‬ ‫הסופי‬ ‫המקומי‬ ‫המשתנה‬ ‫את‬ ‫יכיר‬ ‫זו‬ ‫מית‬‫של‬ ‫ההכרה‬ !‫המתודה‬ public class OuterClass { public void defineMethodInnerClass() { int var=0; final int finalVar=0; class methodInnerClass { public methodInnerClass() { //System.out.println(var); *ERROR* System.out.println(finalVar); //*OK* } } } } ‫השמורה‬ ‫במילה‬ ‫להשתמש‬ ‫ניתן‬ ‫הפנימית‬ ‫המחלקה‬ ‫של‬ ‫מתודות‬ ‫בתוך‬this‫או‬ ,‫שנוצר‬ ‫הפנימי‬ ‫לאובייקט‬ ‫רפרנס‬ ‫לקבל‬ ‫ע"מ‬ ‫ואז‬ ‫נקודה‬ ,‫החיצונית‬ ‫המחלקה‬ ‫בשם‬this‫רפרנס‬ ‫לקבל‬ ‫ע"מ‬:‫נוצר‬ ‫הפנימית‬ ‫של‬ ‫האובייקט‬ ‫בנוכחותו‬ ‫החיצוני‬ ‫לאובייקט‬ public class OuterClass { private int sum=0; public void setSum(int sum) { this.sum=sum; } class InnerClass { private int sum=0; public void incInnerSum() { this.sum++; } public void incOuterSum() { OuterClass.this.sum++; } } }
  • 4.
    ,‫בשמה‬ ‫הפנימית‬ ‫למחלקה‬‫לקרוא‬ ‫מספיק‬ ,‫העוטפת‬ ‫המחלקה‬ ‫של‬ ‫ההכרה‬ ‫בטווח‬ ‫נמצאים‬ ‫אנו‬ ‫כאשר‬ ,‫המחלקה‬ ‫שם‬ ‫מבחינת‬ ‫ונקודה‬ ‫שמה‬ ‫לפני‬ ‫החיצונית‬ ‫המחלקה‬ ‫שם‬ ‫בצירוף‬ ‫הפנימית‬ ‫למחלקה‬ ‫לקרוא‬ ‫יש‬ ,‫זה‬ ‫הכרה‬ ‫לטווח‬ ‫מחוץ‬ ‫כאשר‬ ‫אך‬‫מפרידה‬ (Full Qualified Name.) .‫הפניה‬ ‫אופן‬ ‫את‬ ‫לקצר‬ ‫דרך‬ ‫יש‬ ,)‫בהמשך‬ ‫(נסביר‬ ‫סטטיות‬ ‫פנימיות‬ ‫במחלקות‬ ‫מדובר‬ ‫כאשר‬ ‫שם‬ ‫במבנה‬ ‫קטן‬ ‫שינוי‬ ‫מלבד‬ ‫הרגילות‬ ‫המחלקות‬ ‫קבצי‬ ‫לבין‬ ‫הפנימיות‬ ‫המחלקות‬ ‫קבצי‬ ‫בין‬ ‫הבדל‬ ‫אין‬ ,‫המחלקה‬ ‫קובץ‬ ‫מבחינת‬ ‫ה‬ ‫ומבחינת‬ ‫היות‬ ‫זאת‬ ,‫הקובץ‬-JVM‫מ‬ ‫בין‬ ‫הבדל‬ ‫אין‬ ,:‫חיצונית‬ ‫מחלקה‬ ‫לבין‬ ‫פנימית‬ ‫חלקה‬ ‫החיצונית‬ ‫המחלקה‬ ‫קובץ‬OuterClass:‫כך‬ ‫ייראה‬OuterClass.class ‫הפנימית‬ ‫המחלקה‬ ‫קובץ‬InnerClass:‫כך‬ ‫ייראה‬ ‫בתוכה‬ ‫שמוגדרת‬OuterClass$InnerClass.class. ‫שיקוף‬ ‫נבצע‬ ‫כאשר‬ ‫זה‬ ‫בעניין‬ ‫נעמיק‬-Reflection-.‫בהמשך‬ ‫לפרטים‬ ‫שיוסבר‬ ‫נושא‬ ‫מחלקות‬‫אנונימיות‬ ‫פנימיות‬–Anonymous Inner Classes ‫ולא‬ ,‫ויחיד‬ ‫אחד‬ ‫אובייקט‬ ‫ממנה‬ ‫נוצר‬ ‫שלרוב‬ ,)‫(קונסטרקטור‬ ‫בונה‬ ‫פונקציה‬ ‫וחסרת‬ ‫שם‬ ‫חסרת‬ ‫להיות‬ ‫יכולה‬ ‫פנימית‬ ‫מחלקה‬ ‫מוגדרת‬ "‫מזדמנת‬ ‫"עבודה‬ ‫מבצעת‬ ‫שלרוב‬ ‫מסוים‬ ‫במובן‬ "‫"מנוונת‬ ‫מחלקה‬ ‫זוהי‬ .‫שלה‬ ‫נוספים‬ ‫מופעים‬ ‫ידני‬ ‫באופן‬ ‫לייצר‬ ‫ניתן‬ .‫מראש‬ ‫להשתמש‬ ‫נבחר‬ ‫בהם‬ ‫המקרים‬ ‫אותם‬ ‫בכל‬ ‫רגילה‬ ‫פנימית‬ ‫במחלקה‬ ‫להשתמש‬ ‫בעיה‬ ‫טכנית‬ ‫מבחינה‬ ‫שאין‬ ,‫ראשית‬ ‫נציין‬ ‫"כדת‬ ‫מחלקה‬ ‫להגדיר‬ ‫מיותר‬ ‫זה‬ ‫יהיה‬ ,‫זאת‬ ‫עם‬ ,‫לרוב‬ .‫אחר‬ ‫דבר‬ ‫מכל‬ ‫יותר‬ ‫אסטטי‬ ‫עניין‬ ‫זהו‬ ,‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬ ‫מחלקה‬ ‫דורשת‬ ‫שאינה‬ ‫פעמית‬ ‫חד‬ ‫משימה‬ ‫ביצוע‬ ‫לצורך‬ "‫וכדין‬.‫שכזו‬ :‫נרשום‬ ‫אנונימית‬ ‫פנימית‬ ‫מחלקה‬ ‫אובייקט‬ ‫אותו‬ ‫את‬ ‫לייצר‬ ‫ע"מ‬ new Type(/*ARGUMENTS*/) { /*Methods and Variables that extend/implement class/interface Type*/ }; ‫מסוג‬ ‫במשתנה‬ ‫נציב‬ ‫אותו‬ ‫אנונימית‬ ‫מחלקה‬ ‫מאותה‬ ‫שנוצר‬ ‫חדש‬ ‫לאובייקט‬ ‫רפרנס‬ ‫חזרה‬ ‫ונקבל‬Type. ‫המשתנה‬ ‫דרך‬‫החד‬ ‫החדש‬ ‫בטיפוס‬ ‫שהגדרנו‬ ‫למשתנים/מתודות‬ ‫לפנות‬ ‫נוכל‬ ‫לא‬ ‫אנחנו‬ ,‫הזה‬-‫מכיר‬ ‫לא‬ ‫הוא‬ ‫שהרי‬ ‫כמובן‬ ‫פעמי‬ ‫אותנו‬ ‫ששימש‬ ‫מהטיפוס‬ ‫אחת‬ ‫מתודה‬ ‫לפחות‬ ,‫חדש‬ ‫טיפוס‬ ‫באותו‬ ‫להשתמש‬ ‫שנוכל‬ ‫ע"מ‬ ,‫ולכן‬ ,‫אותם‬ ‫לראות‬ ‫יכול‬ ‫ולא‬ ‫אותם‬ ‫המתודות‬ ‫בכל‬ ‫להשתמש‬ ‫כבר‬ ‫ניתן‬ ‫זו‬ ‫מתודה‬ ‫דרך‬ .‫להידרס‬ ‫צריכה‬ ‫כבסיס‬.‫שהגדרנו‬ ‫והמשתנים‬ ‫החדשות‬ Type‫ו‬ ,)‫ארגומנטים‬ ‫שולחים‬ ‫לא‬ ‫אז‬ ‫(אבל‬ ‫מיישמת‬ ‫האנונימית‬ ‫הפנימית‬ ‫שהמחלקה‬ ‫אינטרפייס‬ ‫מטיפוס‬ ‫להיות‬ ‫יכול‬-Type‫גם‬ .‫מרחיבה‬ ‫האנונימית‬ ‫הפנימית‬ ‫שהמחלקה‬ ‫מחלקה‬ ‫להיות‬ ‫יכול‬
  • 5.
    .‫אנונימית‬ ‫פנימית‬ ‫מחלקה‬‫של‬ ‫למימוש‬ ‫דוגמה‬ ‫נראה‬ ‫היררכיית‬ ‫את‬ ‫נבחן‬:‫המחלקות‬ ‫והגדרת‬ public class Human { public void cout() { System.out.println("I'm a Human!"); } } public class Person extends Human { public void use() { Human human1=new Human(); Human human2=new Human(/*No Arguments - Default Constructor @ class Human*/) { /*Variables that extend class Human*/ int unique=10; /*Methods that extend class Human*/ public void cout() { super.cout(); System.out.println("But not just a Human..."); cantAccessDirectly(unique); } public void cantAccessDirectly(int u) { System.out.println("I'm a special kind of Human!"); System.out.println("My Unique ID is: "+u); } }; System.out.println("******************************"); System.out.println("cout of human1:"); human1.cout(); System.out.println("******************************"); System.out.println("cout of human2:"); human2.cout(); System.out.println("******************************"); } }
  • 6.
    ‫ב‬ ‫ניצור‬-main‫מטיפוס‬ ‫אובייקט‬Person‫את‬‫עליו‬ ‫נפעיל‬ ,use():‫הבא‬ ‫הפלט‬ ‫את‬ ‫ונקבל‬ ****************************** cout of human1: I'm a Human! ****************************** cout of human2: I'm a Human! But not just a Human... I'm a special kind of Human! My Unique ID is: 10 ****************************** ‫האובייקט‬ ‫יצירת‬ ‫בין‬ ‫להבדלים‬ ‫לב‬ ‫נשים‬human1‫ו‬-human2‫מהמחלקה‬ ‫נוצר‬ ‫הראשון‬ ,Human‫פנימית‬ ‫ממחלקה‬ ‫והשני‬ ‫המחלקה‬ ‫את‬ ‫רגעי‬ ‫באופן‬ ‫מרחיבה‬ ‫אשר‬ ,‫אנונימית‬Human. ‫המתודה‬ ‫את‬ ‫לדרוס‬ ‫דאגנו‬ ‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬cout()‫של‬ ‫הפעלה‬ ‫לאפשר‬ ‫ע"מ‬ ‫זאת‬ ,‫מהמחלקה‬ ‫מוכרת‬ ‫מתודה‬ Human‫את‬ ‫להפעיל‬ ‫נרצה‬ ‫שכאשר‬ ‫כך‬ ,cout()‫דרך‬human1‫את‬ ‫נפעיל‬ ,cout()‫של‬Human‫נפעיל‬ ‫כאשר‬ ‫אך‬ ,‫הסטנדרטית‬ ‫את‬cout()‫של‬human2.‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬ ‫שנדרסה‬ ‫זו‬ ‫את‬ ‫נפעיל‬ , ‫המתודה‬ ‫דרך‬ ,‫זה‬ ‫באופן‬cout()‫שהוגדרו‬ ‫נוספות‬ ‫מתודות‬ ‫להפעיל‬ ‫נוכל‬ ,‫הדרוסה‬‫לדוגמה‬ ,‫האנונימית‬ ‫הפנימית‬ ‫במחלקה‬ cantAccessDirectly()‫המחלקה‬ ‫מופע‬ ‫דרך‬ ‫ישיר‬ ‫באופן‬ ‫אליה‬ ‫לגשת‬ ‫נוכל‬ ‫שלא‬ ‫מתודה‬ ,‫היא‬ ‫כן‬ ‫שכשמה‬ ,human2‫רק‬ ‫אלא‬ , ‫ובראשן‬ ‫במחלקה‬ ‫האחרות‬ ‫המתודות‬ ‫דרך‬cout(). ‫ע‬ ‫שאנו‬ ‫האובייקט‬ ‫בהם‬ ‫במצבים‬ ‫תהיה‬ ‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬ ‫שימוש‬ ‫לבצע‬ ‫ההעדפה‬ ,‫כאמור‬‫הוא‬ ‫שימוש‬ ‫בו‬ ‫ושים‬ ‫"חד‬ ‫אובייקט‬-‫אין‬ ‫אך‬ ,‫התכנית‬ ‫כל‬ ‫משך‬ ‫שרץ‬ ‫כזה‬ ‫אפילו‬ ‫או‬ ,‫יותר‬ ‫בו‬ ‫צריך‬ ‫ולא‬ ‫מסוימת‬ ‫עבודה‬ ‫שעושה‬ ‫כזה‬ ‫אובייקט‬ ,"‫פעמי‬ .‫כזה‬ ‫אחד‬ ‫מאובייקט‬ ‫ביותר‬ ‫להחזיק‬ ‫לוגי‬ ‫או‬ ‫ממשי‬ ‫צורך‬ ‫חוטים‬ ‫בשני‬ ‫להחזיק‬ ‫וברצוננו‬ ‫מחשב‬ ‫משחק‬ ‫המהווה‬ ‫תכנית‬ ‫כותבים‬ ‫אנו‬ ‫בו‬ ‫מקרה‬ ‫לדוגמה‬ ‫ניקח‬-‫ת‬( ‫הליכונים‬threads‫הרצים‬ ) ‫המחשב‬ ‫של‬ ‫המהלכים‬ ‫חישובי‬ ‫של‬ ‫הלוגיקה‬ ‫להרצת‬ ‫אחראי‬ ‫והשני‬ ‫הגרפי‬ ‫המשתמש‬ ‫ממשק‬ ‫את‬ ‫מריץ‬ ,‫האחד‬ :‫במקביל‬ .)‫המשתמש‬ ‫של‬ ‫התור‬ ‫בזמן‬ ‫משלו‬ ‫מהלכים‬ ‫יחשב‬ ‫(המחשב‬ ‫ג‬ ,‫ולכן‬ ‫העבודה‬ ‫אותה‬ ‫את‬ ‫שיעשה‬ ‫תהליכון‬ ‫בעוד‬ ‫צורך‬ ‫ואין‬ ,‫ספציפי‬ ‫תהליכון‬ ‫זהו‬ ,"‫"חושב‬ ‫שהמחשב‬ ‫בזמן‬‫אמתי‬ ‫צורך‬ ‫אין‬ ‫ם‬ ‫מ‬ ‫שתירש‬ ‫מחלקה‬ ‫של‬ ‫יצירה‬ ‫על‬ ‫לוותר‬ ‫ניתן‬ ,‫כאלו‬ ‫במקרים‬ .‫התהליכון‬ ‫את‬ ‫שתייצג‬ ‫במחלקה‬-thread‫רק‬ ‫בה‬ ‫שנשתמש‬ ‫כדי‬ ‫עוד‬ ‫אין‬ ,‫סיימנו‬ ‫ובזאת‬ ‫לתהליכון‬ ‫נשלח‬ ‫שאותו‬ ‫פעמי‬ ‫חד‬ ‫אובייקט‬ ‫ליצור‬ ‫לנו‬ ‫מספיק‬ ,‫זה‬ ‫במקום‬ ,‫ההרצה‬ ‫בתחילת‬ ‫אחת‬ ‫פעם‬ ‫התכני‬ ‫סוף‬ ‫עד‬ ‫כאלו‬ ‫באובייקטים‬ ‫צורך‬...‫ת‬ ‫ל‬ ‫רוצים‬ ‫אנו‬ ‫בהם‬ ‫למקרים‬ ‫אנונימית‬ ‫פנימית‬ ‫במחלקה‬ ‫הצורך‬ ‫את‬ ‫לשייך‬ ‫ניתן‬ ,‫לסיכום‬‫ייצר‬‫יותר‬ ,‫ממחלקה‬ ‫אובייקט‬ .‫אובייקטים‬ ‫לייצר‬ ‫ניתן‬ ‫ממנה‬ ‫מחלקה‬ ‫מאשר‬
  • 7.
    ‫סטטיות‬ ‫פנימיות‬ ‫מחלקות‬–StaticNested Classes .)‫רגילה‬ ‫למחלקה‬ ‫(בניגוד‬ ‫כסטטית‬ ‫להגדרה‬ ‫ניתנת‬ ‫פנימית‬ ‫מחלקה‬ ‫זו‬ ‫מחלקה‬ ‫מסוג‬ ‫אובייקט‬ ‫כלומר‬ ,‫המכילה‬ ‫מהמחלקה‬ ‫אובייקט‬ ‫של‬ ‫נוכחות‬ ‫ללא‬ ‫גם‬ ‫אובייקט‬ ‫יווצר‬ ‫סטטית‬ ‫פנימית‬ ‫ממחלקה‬ .‫כזה‬ ‫לאובייקט‬ ‫רפרנס‬ ‫יכיל‬ ‫ולא‬ ‫החיצונית‬ ‫מהמחלקה‬ ‫לאובייקט‬ ‫קשור‬ ‫אינו‬ ‫המחלקה‬ ‫של‬ ‫אובייקט‬ ‫(לדוגמה‬ ‫פנימית‬ ‫מחלקה‬ ‫של‬ ‫אובייקט‬ ‫לייצר‬ ‫נרצה‬ ‫באם‬StaticNestedClass‫בהמשך‬‫מתודה‬ ‫דרך‬ ) ‫במתודת‬ ‫לדוגמת‬ ,‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫סטטית‬main:‫הבא‬ ‫באופן‬ ,‫כסטטית‬ ‫מוגדרת‬ ‫להיות‬ ‫הפנימית‬ ‫המחלקה‬ ‫על‬ , public class OuterClass { static class StaticNestedClass { public void staticNestedMethod() { } } } ‫ב‬ ‫האובייקט‬ ‫יצירת‬-main:‫כך‬ ‫תתבצע‬ OuterClass.StaticNestedClass staticNestedObject1=new OuterClass.StaticNestedClass(); staticNestedObject1.staticNestedMethod(); ‫ב‬ ‫משימוש‬ ‫להימנע‬ ‫ניתן‬ ,‫כאמור‬-Full Qualified Name‫של‬ ‫ביצוע‬ ‫ע"י‬ ,import‫המחלקה‬ ‫לקובץ‬ ‫הסטטית‬ ‫המחלקה‬ ‫של‬ ‫ה‬ ‫מתודת‬ ‫נמצאת‬ ‫(בה‬ ‫המריצה‬-main.) .‫הדפולטיבית‬ ‫מהחבילה‬ ‫שונה‬ ‫לחבילה‬ ‫להשתייך‬ ‫צריכות‬ ‫המחלקות‬ ,‫סטטית‬ ‫מחלקה‬ ‫של‬ ‫ייבוא‬ ‫ביצוע‬ ‫שלשם‬ ‫לציין‬ ‫יש‬ :‫כך‬ ‫ייבוא‬ ‫ונבצע‬ ‫לחבילות‬ ‫הקבצים‬ ‫את‬ ‫נשייך‬ ,‫כן‬ ‫על‬ package somepackage; import staticimport.OuterClass.StaticNestedClass; ,‫הרגע‬ ‫ומאותו‬‫הפ‬ ‫למחלקה‬ ‫לפנות‬ ‫יהיה‬ ‫ניתן‬:‫ההיררכיה‬ ‫במעלה‬ ‫הייתה‬ ‫כאילו‬ ‫הסטטית‬ ‫נימית‬ StaticNestedClass staticNestedObject2=new StaticNestedClass(); staticNestedObject2.staticNestedMethod(); ‫שנייצר‬ ‫אובייקט‬ ‫בהם‬ ‫במקרים‬ ‫בה‬ ‫לשימוש‬ ‫יתרון‬ ‫יש‬ .‫ייחודיים‬ ‫די‬ ‫מקרים‬ ‫הם‬ ,‫סטטית‬ ‫פנימית‬ ‫במחלקה‬ ‫נשתמש‬ ‫בהם‬ ‫המקרים‬ ‫ממנה‬‫כ‬ ‫שהוגדר‬ ‫סטטי‬ ‫לשדה‬ ‫לגשת‬ ‫צריך‬-private.‫העוטפת‬ ‫במחלקה‬ ‫בטווח‬ ‫לכלול‬ ‫צורך‬ ‫לנו‬ ‫יש‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫נשאל‬ ,‫לא‬ ‫או‬ ‫סטטית‬ ‫שלנו‬ ‫הפנימית‬ ‫המחלקה‬ ‫תהיה‬ ‫באם‬ ‫בהחלטה‬ ‫מקדים‬ ‫כשיקול‬ ‫ל‬ ‫נוכל‬ ,‫כן‬ ‫באם‬ ,)‫לה‬ ‫(החיצונית‬ ‫העוטפת‬ ‫למחלקה‬ ‫השייכים‬ ‫סטטיים‬ ‫שאינם‬ ‫מתודות‬ ‫או‬ ‫משתנים‬ ‫זו‬ ‫מחלקה‬ ‫של‬ ‫ההכרה‬‫הבין‬ ‫כ‬ ‫ולהגדירה‬ ‫לנסות‬ ‫שלא‬‫סטטית‬.‫קומפילציה‬ ‫שגיאת‬ ‫נקבל‬ ‫שהרי‬ ‫לזכור‬ ‫יש‬–‫היא‬ ,‫לוגית‬ ‫מבחינה‬ ‫היררכיה‬ ‫בראש‬ ‫שיושבת‬ ‫עצמאית‬ ‫למחלקה‬ ‫נחשבת‬ ‫סטטית‬ ‫מחלקה‬ ,‫היררכית‬ ‫מבחינה‬ .‫ונוחיות‬ ‫סדר‬ ‫לשם‬ ‫רק‬ ‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫הכרה‬ ‫בתחום‬ ‫ממוקמת‬