מחלקו ת פני מיות (מקונ נו ת) Inner (Nested) Classes אוהד ברזילי תכנות מ תקד ם בשפת Java אוניברסיטת ת ל אביב 1
מחלקה פנימית היא מחלקה שהוגדרה בתחום Scope) בין המסולסל יים) של מחלקה public class class House House { private String address; public class class Room Room { private double width; private double height; } } אחרת דוגמא: שימוש לב! Room אינה שדה של המחלקה House 2
מחלקו ת פני מיות הגדרת מחלקה כפנימית מרמזת על היחס בין המחלקה הפנימית והמחלקה העוטפת: למחלקה הפנימית יש משמעות רק בהקשר של המחלקה החיצונית למחלקה הפנימית יש הכרות אינטימית עם המחלקה החיצונית המחלקה הפנימית היא מחלקת עזר של המחלקה החיצונית דוגמאות: Iterator ו- Collection Brain ו- Body 3
ב Java כל מופע של עצם מטיפוס המחלקה הפנימית צריך להיות משויך לעצם מטיפוס המחלקה העוטפת השל כות תחביר מיוחד ל בנאי לעצם מטיפוס המחלק ה הפ נימית יש שדה ה פ נייה שמיוצר אוטומטית לעצם מהמחלק ה העוטפת כתוצאה לכך יש למחלה הפנימית גישה פרטיים!) של המחלקה העוטפת לשרותים (אפילו 4
public class House { private String address; public class Room { // // hidden reference to to a House private double width; private double height; public String tostring(){ return "Room inside: " + address; } } } 5
public class class House Inner {{ Classes private String address; private double height; public class class Room { Height of House { // // hidden reference to to a House Height of Room private double height; public String tostring(){ return Room height: + height + House height: + House.this.height; Height of Room Same as this.height 6
יציר ת מופעים כאשר המחלקה החיצונית יוצרת מופע של ע צם מטיפוס המחלקה הפנימית אזי העצם יווצר בהקשר של הע צם היוצר כאשר עצם מטיפוס המחלקה הפנימית נוצר מחוץ למחלקה העוטפת, יש צורך בתחביר מיוחד 7
יציר ת מופע ע"י ה מחלקה ה ח יצונ ית public class class House {{ private String address; public void void test(){ Room r r = new new Room(); System.out.println( r r ); ); public class class Room {{ 8
יציר ת מופע שלא ע"י המחל ק ה ה ח יצונ ית public class class Test Test {{ public static void void main(string[] args){ House h = new new House(); House.Room r r = h.new Room(); outerobject.new InnerClassName 9
Static Nested Classes ניתן ל הגדיר מ חלק ה פנימית כ static ובכך ל ציין ש הי א אינה קש ור ה ל מ ופע מ סויי ם ש ל ה מ חלק ה העוט פת הדבר אנלוגי למחלקה שכל שרותיה הוגדרו כ static והיא משמשת כמחלקת עזר (מחלקת שרות) עבור מחלקה מסוימת בשפת ++C יחס ז ה מו שג ע"י הגדרת יחס friend 10
public class class House {{ private String address; public static class class Room {{ public String tostring(){ return Room + address; A static nested class is not related to any outer instance. public class class Test Test {{ public static void void main(string[] args){ House.Room r r = new new House.Room(); Error: this room is not related to any house Not related to any house new OuterClassName.InnerClassName 11
הג נה על מח לקות פנימיות סטאטיות אם המחלקה הפנימית אינה ציבורית (אינה מוגדרת,(public הטיפוס שלה מוסתר, אבל עצמים מהמחלקה אינם מוסתרים אם יש התייחסות אליהם public class Outer { private static class Inner implement Inter { } public static Inter getinner() { return new Inner (); } Inter i = new Outer.Inner(); //error Inter i = Outer.getInner(); // ok 12
מחל קות מקומיות - מחלוק ת פני מיות בת וך מתודו ת ניתן להגדיר מחלקה פנימית המחלקה החיצונית בתו ך מתודה של הדבר מגביל את תחום ההכרה של אותה מחלקה ל תחום אותה המתודה בלבד המחלקה הפנימית תוכל ל השתמ ש במשתנים מקומיים של המתודה רק אם הם הוגדרו כ final (מדוע?) 13
public class class Test Test {{ public void void test test () (){{ class class Info Info {{ private int intx; x; public Info(int x) x) {this.x=x;} public String tostring() {return ** ** + x + ** ** ;};} }; }; Info Info inf1 inf1 = new new Info(0); System.out.println(inf1); 14
שימוש במשת ני ם מקומיים public class class Test Test {{ public void void test test (int (intx) x) {{ final final int inty = x+3; x+3; class class Info Info {{ public String tostring(){ return ** ** + y + *** ; }; }; System.out.println( new new Info()); 15
מחלקו ת אנונימיות בע ז רת מחלקות פנימיות ניתן להגדיר מחלקות אנונימיות מחלקות ל לא שם מחלקות אנונימיות שימושיות מאוד במערכות מונחות ארועים (כגון (GUI וילמדו בהמשך הקורס 16
הי ד ור של מחל קות פני מיות המהדר (קומפיילר) יוצר קובץ.class עבור כל מחלקה. מחלקה פנימית אינה שונה במובן זה ממחלקה רגילה ש ם ה מח לק ה הפנימית יהיה Outer$Inner.class אם המחלקה הפנימית אנונימית שם המחלקה שיוצר הקומפיילר יהיה Outer$1.class 17