public class Math Wizard returns the square root
דוגמא public class Math. Wizard {. . . /** returns the square root of num * @pre epsilon >= 10 ^(-6) * @post abs($ret*$ret – num) <= epsilon */ double sqrt(int num, double epsilon); . . . } Java בשפת 1 תוכנה אוניברסיטת תל אביב 12
דוגמא public class Accurate. Math. Wizard extends Math. Wizard {. . . /** returns the square root of num * @pre epsilon >= 10^(-20) * @post abs($ret*$ret – num) <= epsilon/2 */ double sqrt(int num, double epsilon); . . . } ( בדוגמא תנאי הקדם חלש יותר )מרשה יותר ערכי אפסילון n ( ותנאי הבתר יותר חזק )מבטיח דיוק רב יותר Java בשפת 1 תוכנה אוניברסיטת תל אביב 13
is-a חס מתק י י ם י לא מלבן לא יורש מריבוע public class Square { protected double length; public class Rectangle extends Square { protected double width; public double get. Length(){ return length; } public double get. Width(){ return width; } public double get. Width(){ return length; } public double area(){ return length*length; }. . . } public double area(){ return length*width; }. . . } Rectangle is NOT a Square – ברור כי העיצוב לקוי n get. Length()==get. Width() צריך להכיל את Square למשל המשתמר של n לא שומר על כך Rectangle וברור כי n Java בשפת 1 תוכנה אוניברסיטת תל אביב 26
public class Base { private void priv() { System. out. println("priv in Base"); } public void pub() { System. out. println("pub in Base"); } public void foo() { priv(); pub(); } } public class Sub extends Base { private void priv() { System. out. println("priv in Sub"); } public void pub() { System. out. println("pub in Sub"); } } public class Test { public static void main(String[] args) { Base b = new Sub(); b. foo(); } ? מה יודפס } priv in Base pub in Sub Java בשפת 1 תוכנה אוניברסיטת תל אביב 29
הורשה וקישור סטטי , שדות גם קומפילציה של התייחסויות לשדות מתבצעת בצורה סטטית n מחלקה יורשת יכולה להגדיר שדה גם אם שדה בשם זה היה קיים במחלקת n ( הבסיס )מאותו טיפוס אחר public class Base { public int i = 5; } public class Test { public static void main(String[] args) { Base bb = new Base(); Sub ss = new Sub(); Base bs = new Sub(); public class Sub extends Base { public String i = "five"; } 5 five 5 System. out. println(bb. i); System. out. println(ss. i); System. out. println(bs. i); } } Java בשפת 1 תוכנה אוניברסיטת תל אביב ? מה יודפס 30
העמסה והורשה ( איזו גרסה לא תרוץ : במקרים של העמסה הקומפיילר מחליט איזו גרסה תרוץ )יותר נכון n : (java. lang. String זה נראה סביר )הפרוצדורות מתוך n static String value. Of(double d) static String value. Of(boolean b) {…} ? אבל מה עם זה n , הקומפיילר יכול להחליט , לא נורא n overloaded(Rectangle x) {…} overloaded(Colored. Rectangle x) {…} Rectangle r = new Colored. Rectangle (); Colored. Rectangle cr = new Colored. Rectangle (); overloaded(r); // we must use the more general method overloaded(cr); // The more specific method applies Java בשפת 1 תוכנה אוניברסיטת תל אביב 31
העמסה והורשה : אבל זה כבר מוגזם n over. The. Top(Rectangle x, Colored. Rectangle y) {…} over. The. Top(Colored. Rectangle x, Rectangle y) {…} Colored. Rectangle a = new Colored. Rectangle (); Colored. Rectangle b = new Colored. Rectangle (); over. The. Top(a, b); ? b או a ? (אבל של איזה פרמטר casting) ברור שנדרשת המרה n אין דרך להחליט; הפעלת השגרה לא חוקית בג'אווה n Java בשפת 1 תוכנה אוניברסיטת תל אביב 32
יותר גרוע - העמסה והורשה class B { overloaded(Rectangle } x) {…} class S extends B { overloaded(Rectangle x) {…} // override overloaded(Colored. Rectangle x) {…} // overload but no override! } S o = new S(); Colored. Rectangle cr =. . . o. overloaded( cr ); // invoke the purple ((B) o). overloaded( cr ) // What to invoke? Java בשפת 1 תוכנה אוניברסיטת תל אביב 35
public static int compares. Counter; public static void main(String[] args) { List<Integer> ints = Arrays. as. List(5, 4, 3, 2, 1, 6); ints. stream(). filter(x->x%2==0). peek(x->{System. out. println("peek " + x); }). sorted((x, y)->{ compares. Counter++; System. out. println("comparing: " + x + ", " + y); return Integer. compare(x, y); }). for. Each(System. out: : println); System. out. println("num of compares: " + compares. Counter); } output: peek 4 peek 2 peek 6 comparing: 2, 4 comparing: 6, 2 comparing: 6, 4 2 4 6 num of compares: 3 , ובנוסף , מחזירה את הזרם עליו היא מופעלת peek הפעולה . מפעילה על כל איברי הזרם את הפעולה שקיבלה כפרמטר , על מנת לבצע אותה. אינה פעולה שגרתית sorted הפעולה ! יש לאסוף את כל אברי הזרם עליו היא מופעלת Java בשפת 1 תוכנה אוניברסיטת תל אביב מה ישתנה אם נבצע filter את פעולת ה אחרי פעולת ה ? sort 39
public class Test{ public static void main(String[] args) { func("abc"); } public static Simple. Class func(Object i) { try { String str = (String)i; finally האם בלוק ה return new Simple. Class(str); ? יתבצע } ! כמובן finally { ? מתי : נשאלת השאלה System. out. println("finally!"); לפני שהמחסנית משחררת } ערך. את הפונקציה ההחזרה נוצר לפני . finally שמתבצע בלוק ה } public static class Simple. Class{ public Simple. Class(String str) { System. out. println("*: " + str); } } } Java בשפת 1 תוכנה אוניברסיטת תל אביב 40
/** * @inv !is. Empty() implies top() != null */ public class Section. A { private final Linked. List<Object> elements = new Linked. List<>(); /** * @post !is. Empty() * @post top() == o */ public void push(Object o){ elements. add(o); } : 6 שאלה מתרגיל בית אילו מבין הפונקציות מפרות את שמורת ? המחלקה /** * @pre !is. Empty() * @post @return == @prev(top()) */ public Object pop(){ final Object popped = top(); elements. remove. Last(); return popped; } Java בשפת 1 תוכנה אוניברסיטת תל אביב מפרה push הפונקציה . את השמורה push לאחר השימוש ב יכול להיווצר מצב שבו למרות null מחזירה top שהמחסנית אינה ריקה 41
/** * @inv !is. Empty() implies top() != null */ public class Section. A { //previous methods //*** /** * @pre !is. Empty() * @post @return != null */ public Object top(){ return elements. get. Last(); } תפר את top ’ הפונק null השמורה רק אם יש . במחסנית ? הגיע לשם null איך ה , ממומשת נכון push אם . זה לא יכול לקרות החוזה מתייחס למימוש post תנאי ה , לכן , הפנימי צריך להיות מומר ב post_impl /** * * @post @return == true iff elements. size() == 0 */ public boolean is. Empty(){ return elements. size() == 0; } } Java בשפת 1 תוכנה אוניברסיטת תל אביב 42
מחלקות פנימיות בתוך מתודות public class Test { public void test(int num) { יכולה to. String האם final int x = num+3; int y = num*2; ? num לגשת גם ל int z= num-1; class Info{ public String to. String() { return "**" + x + "**" + y + "**" + z; } } z = 4; System. out. println(new Info()); מה יקרה לקוד לאחר ? הוספת שורה זו } public static void main(String[] args) { Test t = new Test(); t. test(5); } } Java בשפת 1 תוכנה אוניברסיטת תל אביב 44
Hash. Set class Point{ int x; int y; } public Point(int x, int y) { this. x = x; Set<Point> points = new this. y = y; Hash. Set<>(); } Point p 1 = new Point(1, 2); Point p 2 = new Point(1, 2); points. add(p 1); points. add(p 2); System. out. println(points. size()); Output: 2 Java בשפת 1 תוכנה אוניברסיטת תל אביב 46
Hash. Set ? Hash. Set איך עובדת הכנסה ל n 0 Point: 1, 4 Point: 9, 3 Point: 3, 0 1 Point: 9, 3 ? 2 Point: 2, 5 3 4 5 5 Point: 3, 9 Java בשפת 1 תוכנה אוניברסיטת תל אביב Point: 5, 2 47
Hash. Set ? Hash. Set איך עובדת הכנסה ל n hash. Code 0 Point: 1, 4 Point: 9, 3 Point: 3, 0 1 2 Point: 9, 3 Point: 2, 5 3 4 5 5 Point: 3, 9 Java בשפת 1 תוכנה אוניברסיטת תל אביב Point: 5, 2 48
Hash. Set ? Hash. Set איך עובדת הכנסה ל n Point: 9, 3 equals 0 Point: 1, 4 Point: 9, 3 Point: 3, 0 1 2 Point: 2, 5 3 4 5 5 Point: 3, 9 Java בשפת 1 תוכנה אוניברסיטת תל אביב Point: 5, 2 49
Tree. Set<Point> points = new Tree. Set<>( (a, b)->Integer. compare(a. x, b. x)); Point p 1 = new Point(1, 2); Point p 2 = new Point(1, 2); points. add(p 1); points. add(p 2); System. out. println(points. size()); Output: 1 חייבים לשלוח כיוון ש Comparator אינה Point Comparable Java בשפת 1 תוכנה אוניברסיטת תל אביב 52
Tree. Set<Point> points = new Tree. Set<>( (a, b)->Integer. compare(a. x, b. x)); Point p 1 = new Point(1, 2); Point p 2 = new Point(1, 2); Point p 3 = new Point(1, 3); points. add(p 1); points. add(p 2); points. add(p 3); System. out. println(points. size()); Output: 1 Java בשפת 1 תוכנה אוניברסיטת תל אביב 53
- Slides: 56