public class Animal public static void hide System
public class Animal { public static void hide() { System. out. format("The hide method in Animal. %n"); } public void override() { System. out. format("The override method in Animal. %n"); } } public class Cat extends Animal { public static void hide() { System. out. format("The hide method in Cat. %n"); } public void override() { System. out. format("The override method in Cat. %n"); } } public class Client{ public static void main(String[] args) { Cat my. Cat = new Cat(); Animal my. Animal = my. Cat; //my. Animal. hide(); //BAD STYLE Animal. hide(); //Better! my. Animal. override(); } The hide } ? מה יודפס method in Animal. 15 override method in Cat. Java The בשפת 1 תוכנה אוניברסיטת תל אביב
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 תוכנה אוניברסיטת תל אביב ? מה יודפס 16
הורשה וקישור סטטי , שדות גם קומפילציה של התייחסויות לשדות מתבצעת בצורה סטטית 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 תוכנה אוניברסיטת תל אביב ? מה יודפס 17
העמסה והורשה ( איזו גרסה לא תרוץ : במקרים של העמסה הקומפיילר מחליט איזו גרסה תרוץ )יותר נכון 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 תוכנה אוניברסיטת תל אביב 18
העמסה והורשה : אבל זה כבר מוגזם 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 תוכנה אוניברסיטת תל אביב 19
יותר גרוע - העמסה והורשה 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 תוכנה אוניברסיטת תל אביב 21
- Slides: 23