Mais conteúdo relacionado ג'אווה - תכנות מונחה עצמים - מחלקות פנימיות - רגילות, אנונימיות וסטטיות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.העוטפת במחלקה
בטווח לכלול צורך לנו יש האם עצמנו את נשאל ,לא או סטטית שלנו הפנימית המחלקה תהיה באם בהחלטה מקדים כשיקול
ל נוכל ,כן באם ,)לה (החיצונית העוטפת למחלקה השייכים סטטיים שאינם מתודות או משתנים זו מחלקה של ההכרההבין
כ ולהגדירה לנסות שלאסטטית.קומפילציה שגיאת נקבל שהרי
לזכור יש–היא ,לוגית מבחינה היררכיה בראש שיושבת עצמאית למחלקה נחשבת סטטית מחלקה ,היררכית מבחינה
.ונוחיות סדר לשם רק אחרת מחלקה של הכרה בתחום ממוקמת