המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

המשך תכנות מונחה עצמים תרגול מס' 9.

מצגות קשורות


מצגת בנושא: "המשך תכנות מונחה עצמים תרגול מס' 9."— תמליל מצגת:

1 המשך תכנות מונחה עצמים תרגול מס' 9

2 היום בתרגול this שיטות מיוחדות חריגות (Exceptions)
Shallow Copy, Deep Copy שיטות מיוחדות חריגות (Exceptions)

3 תזכורת: מחלקות ואובייקטים
הנה המחלקה MyString: public class MyString { //class fields private char[] elements; private int length; //class method public int length(){ return length; } שדות – מייצגים מצב של האובייקט שיטה – מתארת התנהגות של האובייקט

4 תזכורת: מחלקות ואובייקטים
על מנת ליצור אובייקט מסוג MyString, נשתמש במילה new: אך כיצד ניתן לשים ערכים בתוך המחרוזת שלנו? לשם כך נגדיר בנאי, שבעזרתו נאתחל את שדה האובייקט MyString s = new MyString();

5 תזכורת: בנאי (constructor)
בנאי – שיטה מיוחדת עבור מחלקה שתפקידה לייצר אובייקט ולאתחל את שדותיו public class MyString { //class fields private char[] elements; private int length; //constructor with a parameter public MyString(char[] otherElements){ length = otherElements.length; elements = new char[length]; for (int i = 0; i < otherElements.length; i++) { elements[i] = otherElements[i]; } ... השם זהה לשם המחלקה ואין ערך החזרה

6 מה היתרון בשימוש בדרך זו?
this ראינו כי ניתן להגדיר מספר בנאים למחלקה בעזרת העמסה (Overloading) ניתן לקרוא מבנאי אחד לבנאי אחר בעזרת המילה השמורה: לדוגמה: הקריאה חייבת להתבצע בשורה הראשונה של הבנאי this public MyString(MyString other){ this(other.elements); } ( ) מה היתרון בשימוש בדרך זו?

7 this דוגמה נוספת: מה עושה הבנאי השני? public class MyString{
private char[] elements;   private int length; public MyString(String s) { } public MyString() { this("");

8 this ניתן להשתמש ב - this על מנת להבדיל בין שדה לבין פרמטר או משתנה לוקאלי בעלי אותו שם . לדוגמה: בעזרת האופרטור (.) public class MyString{ private char[] elements; private int length; public MyString(char[] elements, int length) { this.length = length; this.elements = new char[this.length]; for (int i = 0; i < this.length; i=i+1) this.elements[i] = elements[i]; }

9 תזכורת תזכורת (מההרצאות) – המחלקות Point ו- Circle:
public class Point { public double x; public double y; public Point() { x = 0; y = 0; } public Point(Point p) { x = p.x; y = p.y; בנאי חסר פרמטרים בנאי מעתיק

10 תזכורת בנאי חסר פרמטרים בנאי המקבל את כל השדות public class Circle{
public Point center; public double radius; //constructors public Circle() { center = new Point(); radius = 0; } public Circle(Point cen, double rad) { center = new Point(cen); if (rad >= 0) radius = rad; else rad = 0; }//Circle בנאי חסר פרמטרים בנאי המקבל את כל השדות

11 Deep Copy ו- Shallow Copy
בנאי מעתיק אפשרי ל- Circle: מה יקרה אם נבצע את הפעולות הבאות: הבנאי המעתיק משתמש בגישת ה- Shallow Copy. public Circle(Circle other) { center = other.center; radius = other.radius; } Copy constructor public static void main(String[] args){ Circle circ1 = new Circle(); Circle circ2 = new Circle(circ1); circ2.center.x = 4; }

12 Deep Copy ו- Shallow Copy
בנאי מעתיק אפשרי ל- Circle: מה יקרה עכשיו אם נבצע את הפעולות הבאות: הבנאי המעתיק משתמש בגישת ה- Deep Copy. public Circle(Circle other) { center = new Point(other.center); radius = other.radius; } public static void main(String[] args){ Circle circ1 = new Circle(); Circle circ2 = new Circle(circ1); circ2.center.x = 4; }

13 המחלקה Object במחלקה Object מוגדרים מימושי ברירת המחדל לשיטות המשותפות לכל האובייקטים. למשל ... public String toString() כאשר ממשנו שיטה זו במחלקות שייצרנו ביצענו דריסה לשיטת ברירת המחדל שירשנו מהמחלקה Object. שיטה משותפת נוספת הינה public boolean equals(Object obj) אשר מבצעת השוואה לוגית בין שני אובייקטים (כמו שראינו ב- String). שימו לב כי שוויון לוגי אינו בהכרח השוואה של כל שדות האובייקט.

14 שיטות משותפות לכל האובייקטים: toString
עד עתה כשרצינו להדפיס ערך כלשהו השתמשנו בפונקציה מהמשפחה של System.out.print כיצד נוכל להדפיס אובייקט מסוג Complex? ב- Java לכל אובייקט יש שיטה בשם toString, המחזירה String כמו שהמתכנת של המחלקה מחליט public class Point{ public double x; public double y; public String toString() { return "(" + x + " , " + y + ")"; }

15 שיטות משותפות לכל האובייקטים: toString
כעת, כשנדפיס אובייקט מסוג Point (באופן הבא): שימו לב כי ניתן היה (אך לא חובה) לקרוא לשיטה כך: במקרה השני, הפונקציה println מפעילה את שיטת ה toString של האובייקט Point p1 = new Point(5, 7); System.out.println(p1.toString()); (5.0 , 7.0) Point p1 = new Point(5, 7); System.out.println(p1);

16 השיטה equals נרצה לממש את השיטה equals עבור Point :
מה יקרה כאשר other הוא null ? שגיאה בזמן ריצה: NullPointerException public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans; Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); return ans; }

17 השיטה equals נרצה לממש את השיטה equals עבור Point :
מה יקרה כאשר other הוא אינו מטיפוס Point ? שגיאה בזמן ריצה: ClassCastException public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans; Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); return ans; }

18 מחזיר true רק כאשר other אינו null ומטיפוס Point
השיטה equals נרצה לממש את השיטה equals עבור Point : public class Point { public double x; public double y; // ... public boolean equals(Object other) { boolean ans = false; if(other instanceof Point) { Point otherPoint = (Point)other; ans = (x==otherPoint.x) && (y==otherPoint.y); } return ans; מחזיר true רק כאשר other אינו null ומטיפוס Point

19 השוואה בין כתובות (הערך בטבלת המשתנים)
equals השיטה אם לא היינו מממשים את (מבצעים דריסה של) השיטה equals במחלקה Point, בעת הקריאה לשיטה equals היינו פונים לשיטה equals הממומשת ב-Object אשר משווה כתובות. public boolean equals(Object other){ return this == other; } השוואה בין כתובות (הערך בטבלת המשתנים)

20 equals השיטה אם לא היינו מממשים את (מבצעים דריסה של) השיטה equals במחלקה Point, בעת הקריאה לשיטה equals היינו פונים לשיטה equals הממומשת ב-Object אשר משווה כתובות. public boolean equals(Object other){ return this == other; } ?? מה יקרה אם נגדיר עבור מחלקה Point את השיטה הבאה: ?? public boolean equals(Point other) !! לא ביצענו דריסה של השיטה equals של מחלקת האב Object, מאחר והחתימה שונה.

21 חריגות (Exceptions) חריגה היא אירוע המתרחש במהלך תוכנית המפר את תהליך הריצה הנורמאלי של פקודות התוכנית. לעיתים חריגות מתרחשות בגלל תקלות בלתי צפויות, כגון בעיה בקובץ אליו כותבים (למשל אין הרשאות כתיבה), ולעיתים בגלל תקלות תוכנה, כגון שליחת פרמטר לא מתאים לפונקציה. 22

22 כבר נתקלנו ב-RuntimeExceptions
ArithmeticException: ניסיון חלוקה באפס IndexOutOfBoundsException: חריגה ממערך NullPointerException: ניסיון לפעול על משתנה שאינו פרימיטיבי בעל ערך null וראינו כי ניתן לזרוק RuntimeException באמצעות throw 23

23 Throw RuntimeException
public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; public void setSpeed(int speed){ if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new RuntimeException(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); car.setSpeed(300); } Output: Exception in thread "main" java.lang.RuntimeException: Illegal Speed at Car.setSpeed(Car.java:11) at Car.main(Car.java:17)

24 NullPointerException
סוגי Exceptions Object Exception IOException RuntimeException NullPointerException 25

25 Exception ניתן לייצר חריגה ע"י פקודת throw המייצרת את אירוע החריגה.
ישנן שתי דרכים לטפל בחריגה: לתפוס את ה- Exception על ידי שימוש במילים השמורות try ו-catch להעביר את ה- Exception הלאה על ידי שימוש במילה השמורה throws בכותרת הפונקציה שאנו כותבים. (טיפול בחריגות לא הכרחי עבור (RuntimeExceptions חריגת זמן ריצה מעידה על באג בתוכנית, לכן גם לא חייבים להודיע אם לא תופסים אותה. בתוכנית תקינה חריגת זמן ריצה לא צריכה להיזרק. חריגות אחרות (למשל חריגות קלט\פלט נובעות מגורמים שלתוכנית אין שליטה עליהם (תקלת תקשורת למשל). תכנית הכתובה היטב צריכה להיות מוכנה לאירועים כאלו ולכן הצורך לתפוס חריגות או במפורש להשאיר את המשימה הזו למי שקרא לשיטה.

26 Throw and Catch Exceptions
public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; public void setSpeed(int speed) throws Exception { if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new Exception(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); car.setSpeed(100); } Compilation Error

27 Throw and Catch Exceptions
public class Car { private final int MAX_SPEED = 210; private final int MIN_SPEED = -20; private int speed; public void setSpeed(int speed) throws Exception { if ((speed >= MIN_SPEED) && (speed <= MAX_SPEED)) this.speed = speed; else throw new Exception(“Illegal speed”); } public static void main(String[] args) { Car car = new Car(); try{ car.setSpeed(300); System.out.println("Broke the speed limit !"); } catch(Exception e){ System.err.println("Caught Exception: "+e.getMessage()); } System.out.println("Current speed is "+car.getSpeed()+” km/h); Output: Caught Exception: Illegal Speed Current speed is 0 km/h


הורד את "ppt "המשך תכנות מונחה עצמים תרגול מס' 9.

מצגות קשורות


מודעות Google