SlideShare uma empresa Scribd logo
1 de 7
Baixar para ler offline
‫פנימיות‬ ‫מחלקות‬–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.‫העוטפת‬ ‫במחלקה‬
‫בטווח‬ ‫לכלול‬ ‫צורך‬ ‫לנו‬ ‫יש‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫נשאל‬ ,‫לא‬ ‫או‬ ‫סטטית‬ ‫שלנו‬ ‫הפנימית‬ ‫המחלקה‬ ‫תהיה‬ ‫באם‬ ‫בהחלטה‬ ‫מקדים‬ ‫כשיקול‬
‫ל‬ ‫נוכל‬ ,‫כן‬ ‫באם‬ ,)‫לה‬ ‫(החיצונית‬ ‫העוטפת‬ ‫למחלקה‬ ‫השייכים‬ ‫סטטיים‬ ‫שאינם‬ ‫מתודות‬ ‫או‬ ‫משתנים‬ ‫זו‬ ‫מחלקה‬ ‫של‬ ‫ההכרה‬‫הבין‬
‫כ‬ ‫ולהגדירה‬ ‫לנסות‬ ‫שלא‬‫סטטית‬.‫קומפילציה‬ ‫שגיאת‬ ‫נקבל‬ ‫שהרי‬
‫לזכור‬ ‫יש‬–‫היא‬ ,‫לוגית‬ ‫מבחינה‬ ‫היררכיה‬ ‫בראש‬ ‫שיושבת‬ ‫עצמאית‬ ‫למחלקה‬ ‫נחשבת‬ ‫סטטית‬ ‫מחלקה‬ ,‫היררכית‬ ‫מבחינה‬
.‫ונוחיות‬ ‫סדר‬ ‫לשם‬ ‫רק‬ ‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫הכרה‬ ‫בתחום‬ ‫ממוקמת‬

Mais conteúdo relacionado

Mais procurados

Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
Sergey Nemchinsky
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UML
Sergey Nemchinsky
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
Doncho Minkov
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
Sergey Nemchinsky
 

Mais procurados (20)

Functions in c++
Functions in c++Functions in c++
Functions in c++
 
polymorphism
polymorphism polymorphism
polymorphism
 
Chapter 9 Abstract Class
Chapter 9 Abstract ClassChapter 9 Abstract Class
Chapter 9 Abstract Class
 
Chapter 05 classes and objects
Chapter 05 classes and objectsChapter 05 classes and objects
Chapter 05 classes and objects
 
Inheritance C#
Inheritance C#Inheritance C#
Inheritance C#
 
Object Oriented Solved Practice Programs C++ Exams
Object Oriented Solved Practice Programs C++ ExamsObject Oriented Solved Practice Programs C++ Exams
Object Oriented Solved Practice Programs C++ Exams
 
Classes and objects in c++
Classes and objects in c++Classes and objects in c++
Classes and objects in c++
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Java access modifiers
Java access modifiersJava access modifiers
Java access modifiers
 
Шаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UMLШаблоны разработки ПО. Часть 2. ООП и UML
Шаблоны разработки ПО. Часть 2. ООП и UML
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
Classes objects in java
Classes objects in javaClasses objects in java
Classes objects in java
 
Lect 1-java object-classes
Lect 1-java object-classesLect 1-java object-classes
Lect 1-java object-classes
 
Шаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASPШаблоны разработки ПО. Шаблоны GRASP
Шаблоны разработки ПО. Шаблоны GRASP
 
Friend function & friend class
Friend function & friend classFriend function & friend class
Friend function & friend class
 
Class and object in c++
Class and object in c++Class and object in c++
Class and object in c++
 
Database Basics Theory
Database Basics TheoryDatabase Basics Theory
Database Basics Theory
 
Generics C#
Generics C#Generics C#
Generics C#
 
Java - Packages Concepts
Java - Packages ConceptsJava - Packages Concepts
Java - Packages Concepts
 

Mais de מורן אלקובי

Mais de מורן אלקובי (20)

ג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיותג'אווה - תכנות מונחה עצמים - רב צורתיות
ג'אווה - תכנות מונחה עצמים - רב צורתיות
 
ג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשהג'אווה - תכנות מונחה עצמים - הורשה
ג'אווה - תכנות מונחה עצמים - הורשה
 
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפהג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
ג'אווה - תכנות מונחה עצמים - מצייני גישה/רמות חשיפה
 
MySQL - מילון השאילתא
MySQL - מילון השאילתאMySQL - מילון השאילתא
MySQL - מילון השאילתא
 
SQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתוניםSQL - שפת הגדרת הנתונים
SQL - שפת הגדרת הנתונים
 
SQL - מודל הנתונים
SQL - מודל הנתוניםSQL - מודל הנתונים
SQL - מודל הנתונים
 
SQL - אלגברה של יחסים
SQL - אלגברה של יחסיםSQL - אלגברה של יחסים
SQL - אלגברה של יחסים
 
SQL - מודל ישויות קשרים
SQL - מודל ישויות קשריםSQL - מודל ישויות קשרים
SQL - מודל ישויות קשרים
 
MySQL - מרכיבי השאילתא
MySQL - מרכיבי השאילתאMySQL - מרכיבי השאילתא
MySQL - מרכיבי השאילתא
 
בדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtualבדרך לפולימורפיזם - Using Virtual/Pure Virtual
בדרך לפולימורפיזם - Using Virtual/Pure Virtual
 
הורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקותהורשה והיררכיה של מחלקות
הורשה והיררכיה של מחלקות
 
תכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקותתכנות מונחה עצמים - מחלקות
תכנות מונחה עצמים - מחלקות
 
טורי חזקה
טורי חזקהטורי חזקה
טורי חזקה
 
כלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטיםכלים מתמטיים - הוכחות משפטים
כלים מתמטיים - הוכחות משפטים
 
DLL מדריך לעבודה עם
DLL מדריך לעבודה עםDLL מדריך לעבודה עם
DLL מדריך לעבודה עם
 
עבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סיעבודה עם קבצים בשפת סי
עבודה עם קבצים בשפת סי
 
מצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשבמצגת בלוגיקה למדעי המחשב
מצגת בלוגיקה למדעי המחשב
 
מצגת לוגיקה מלאה חלק 3 מתוך 3
מצגת לוגיקה מלאה חלק 3 מתוך 3מצגת לוגיקה מלאה חלק 3 מתוך 3
מצגת לוגיקה מלאה חלק 3 מתוך 3
 
מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3מצגת לוגיקה מלאה חלק 2 מתוך 3
מצגת לוגיקה מלאה חלק 2 מתוך 3
 
מצגת לוגיקה מלאה חלק 1 מתוך 3
מצגת לוגיקה מלאה חלק 1 מתוך 3מצגת לוגיקה מלאה חלק 1 מתוך 3
מצגת לוגיקה מלאה חלק 1 מתוך 3
 

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

  • 1.
  • 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. ‫סטטיות‬ ‫פנימיות‬ ‫מחלקות‬–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.‫העוטפת‬ ‫במחלקה‬ ‫בטווח‬ ‫לכלול‬ ‫צורך‬ ‫לנו‬ ‫יש‬ ‫האם‬ ‫עצמנו‬ ‫את‬ ‫נשאל‬ ,‫לא‬ ‫או‬ ‫סטטית‬ ‫שלנו‬ ‫הפנימית‬ ‫המחלקה‬ ‫תהיה‬ ‫באם‬ ‫בהחלטה‬ ‫מקדים‬ ‫כשיקול‬ ‫ל‬ ‫נוכל‬ ,‫כן‬ ‫באם‬ ,)‫לה‬ ‫(החיצונית‬ ‫העוטפת‬ ‫למחלקה‬ ‫השייכים‬ ‫סטטיים‬ ‫שאינם‬ ‫מתודות‬ ‫או‬ ‫משתנים‬ ‫זו‬ ‫מחלקה‬ ‫של‬ ‫ההכרה‬‫הבין‬ ‫כ‬ ‫ולהגדירה‬ ‫לנסות‬ ‫שלא‬‫סטטית‬.‫קומפילציה‬ ‫שגיאת‬ ‫נקבל‬ ‫שהרי‬ ‫לזכור‬ ‫יש‬–‫היא‬ ,‫לוגית‬ ‫מבחינה‬ ‫היררכיה‬ ‫בראש‬ ‫שיושבת‬ ‫עצמאית‬ ‫למחלקה‬ ‫נחשבת‬ ‫סטטית‬ ‫מחלקה‬ ,‫היררכית‬ ‫מבחינה‬ .‫ונוחיות‬ ‫סדר‬ ‫לשם‬ ‫רק‬ ‫אחרת‬ ‫מחלקה‬ ‫של‬ ‫הכרה‬ ‫בתחום‬ ‫ממוקמת‬