public class Person private String name private int
public class Person { private String name; private int number; public Person(String init. Name, int init. Number){ name = init. Name; number = init. Number; } public void set(String new. Name, int new. Number){ name = new. Name; number = new. Number; } public String to. String( ){ return (name + " " + number); } }
Αναθέσεις μεταξύ αντικειμένων var. P 1 Διεύθυνση μνήμης Περιεχόμενο μνήμης 0000 0010 0001 0010 0011 Person var. P 1 = new Person(“Bob”, 1); Person var. P 2; var. P 2 = var. P 1; var. P 2. set(“Ann”, 2); System. out. println(var. P 1); “Bob” 0100 0101 0110 0111 1
Αναθέσεις μεταξύ αντικειμένων Διεύθυνση μνήμης Περιεχόμενο μνήμης var. P 1 0000 0010 var. P 2 0001 null 0010 0011 Person var. P 1 = new Person(“Bob”, 1); Person var. P 2; var. P 2 = var. P 1; var. P 2. set(“Ann”, 2); System. out. println(var. P 1); “Bob” 0100 0101 0110 0111 1
Παράδειγμα public void method 1(){ int x = 10; method 2(x); } method 1 x 10
Παράδειγμα public void method 1(){ int x = 10; method 2(x); } public void method 2(int b){ boolean x = true; method 3(); } method 2 b 10 x true method 1 x 10
Παράδειγμα method 3 public void method 1(){ int x = 10; method 2(x); } public void method 2(int b){ boolean x = true; method 3(); } public void method 3() {…} method 2 b 10 x true method 1 x 10
Παράδειγμα public void method 1(){ int x = 10; method 2(x); method 3(); } method 1 x 10
Παράδειγμα public void method 1(){ int x = 10; method 2(x); method 3() } public void method 2(int b){ boolean x = (b==10); . . . } method 2 b 10 x true method 1 x 10
Παράδειγμα public void method 1(){ int x = 10; method 2(x); } method 3 public void method 3() {…} method 1 x 10
public class Person { private String name; private int number; public Person(String init. Name, int init. Number){ name = init. Name; number = init. Number; } public void set(String name, int number){ this. name = name; this. number = number; } public String to. String( ){ return (name + " " + number); } }
Παράδειγμα public void method 3() { Person x = new Person(“bob”, 1); } method 3 x 0 x 0010 method 2 b 10 x true method 1 x 10 name “bob” number 1
Παράδειγμα public Person method 3() { Person x = new Person(“bob”, 1); return x; } method 3 x 0 x 0010 method 2 b 10 x null method 1 x 10 name “bob” number 1
Kλήση μεθόδου από αντικείμενο public class Object. Method. Call. Demo { public static void main(String[] args) { Person p = new Person(“Bob", 1); p. set(“Alice”, 2); System. out. println(p); } }
Εξέλιξη του προγράμματος p. set(“Alice”, 2); Τα this. name, this. number αναφέρονται στα πεδία του αντικειμένου ενώ τα name, number στις τοπικές μεταβλητές. set name “Alice” number 2 this 0 x 0010 main p this. name = name; this. number = number; 0 x 0010 name “Alice” number 2
public class Person { private String name; private int number; public Person(String init. Name, int init. Number){ name = init. Name; number = init. Number; } public void set(String new. Name, int new. Number){ name = new. Name; number = new. Number; } public void copier(Person other) { other. name = name; other. number = number; } public String to. String( ){ return (name + " " + number); } }
Παράδειγμα public class Class. Parameter. Demo { public static void main(String[] args) { Person p 1 = new Person(“Bob", 1); Person p 2 = new Person(“Ann", 2); p 2. copier(p 1); System. out. println(p 1); } }
Εξέλιξη του προγράμματος name Bob number 1 name Ann number 2 main p 1 0 x 0010 p 2 0 x 0020
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other. name = this. name; other. number = this. number; } copier other 0 x 0010 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2 Η παράμετρος this περνιέται αυτόματα σε κάθε κλήση μεθόδου του αντικειμένου. H other κρατάει την αναφορά του p 1.
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other. name = this. name; other. number = this. number; } copier other 0 x 0010 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Ann number 2 Η παράμετρος other έχει την αναφορά p 1. Οι αλλαγές στα περιεχόμενα της other αλλάζουν και τα περιεχόμενα της p 1.
Εξέλιξη του προγράμματος H main τυπώνει “Ann 2” main p 1 0 x 0010 p 2 0 x 0020 name Ann number 2
Μια άλλη υλοποίηση της copier public void copier( Person other) { other = this; } public class Class. Parameter. Demo { public static void main(String[] args) { Person p 1 = new Person(“Bob", 1); Person p 2 = new Person(“Ann", 2); p 2. copier(p 1); System. out. println(p 1); } Τι } θα τυπώσει?
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other = this; } copier other 0 x 0010 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other = this; } copier other 0 x 0020 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2
Εξέλιξη του προγράμματος H main τυπώνει “Bob 1” main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2
Μια ακόμη υλοποίηση της copier public void copier( Person other) { other = new Person(this. name, this. number); } public class Class. Parameter. Demo { public static void main(String[] args) { Person p 1 = new Person(“Bob", 1); Person p 2 = new Person(“Ann", 2); p 2. copier(p 1); System. out. println(p 1); } Τι } θα τυπώσει?
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other = new Person(this. name, this. number); } copier other 0 x 0010 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2
Εξέλιξη του προγράμματος p 2. copier(p 1); public void copier( Person other) { other = new Person(this. name, this. number); } copier other 0 x 0030 this 0 x 0020 main p 1 0 x 0010 p 2 0 x 0020 name Ann number 2 name Bob number 1 name Ann number 2
Εξέλιξη του προγράμματος H main τυπώνει “Bob 1” main p 1 0 x 0010 p 2 0 x 0020 name Bob number 1 name Ann number 2
class Array. Var{ public static void main(String[] args){ int[] array = {1, 2, 3}; int x = 5; increment(array); for (int i = 0; i < array. length; i ++){ System. out. print(array[i] + " "); } System. out. println(""); increment(x); System. out. println("x: " + x); increment(array[0]); System. out. println(“array[0] = " + array[0]); } public static void increment(int[] array){ for (int i = 0; i < array. length; i ++){ array[i] ++; System. out. print(array[i] + " "); } System. out. println(""); } public static void increment(int x) { x ++ ; System. out. println("x: " + x); } } Τι θα τυπώσει?
Πέρασμα παραμέτρων increment(array) public static void increment(int[] array){ for (int i = 0; i < array. length; i ++){ array[i] ++; System. out. print(array[i] + " "); } System. out. println(""); } increment array 0 x 0010 1 2 main array 0 x 0010 x 5 3
Πέρασμα παραμέτρων increment(array) public static void increment(int[] array){ for (int i = 0; i < array. length; i ++){ array[i] ++; System. out. print(array[i] + " "); } System. out. println(""); } increment array 0 x 0010 2 3 main array 0 x 0010 x 5 4
Πέρασμα παραμέτρων increment(x) public static void increment(int x){ x ++; System. out. println(“x: “ + x); } increment x 5 2 3 main array 0 x 0010 x 5 4
Πέρασμα παραμέτρων increment(x) public static void increment(int x){ x ++; System. out. println(“x: “ + x); } increment x 6 2 3 main array 0 x 0010 x 5 4
Πέρασμα παραμέτρων increment(array[0]) public static void increment(int x){ x ++; System. out. println(“x: “ + x); } increment x 2 2 3 main array 0 x 0010 x 5 4
Πέρασμα παραμέτρων increment(array[0]) public static void increment(int x){ x ++; System. out. println(“x: “ + x); } increment x 3 2 3 main array 0 x 0010 x 5 4
Άλλο ένα παράδειγμα public class String. Parameter. Demo { public static void main(String[] args) { String s = “Bob“; change. String(s); System. out. println(s); } public static void change. String(String param) { System. out. println(param); param = param + “ + Ann”; System. out. println(param); } } Τι θα τυπώσει?
Εξέλιξη του προγράμματος public static void change. String(Strin { System. out. println(param); param = param + “ + Ann”; System. out. println(param); } copier param 0 x 0010 main s 0 x 0010 “Bob”
Εξέλιξη του προγράμματος public static void change. String(Strin { System. out. println(param); param = param + “ + Ann”; System. out. println(param); } Τα Strings είναι μη μεταλλάξιμα αντικείμενα (immutable objects) copier param 0 x 0020 “Bob + Ann” 0 x 0010 “Bob” main s H αλλαγή σε ένα String έχει ως αποτέλεσμα τη δημιουργία ενός καινούριου αντικειμένου
Ισότητα String Τι θα εκτυπωθεί? import java. util. Scanner; class String. Equality{ public static void main(String[] args){ Scanner input = new Scanner(System. in); String x = input. next(); String z = new String("java"); String y = "java“; 1. false 2. true System. out. println("1. System. out. println("2. System. out. println("3. System. out. println("4. System. out. println("5. System. out. println("6. } } "+ "+ "+ (x == "java")); (y == "java")); (z == "java")); x. equals("java")); y. equals("java")); z. equals("java")); 3. false 4. true 5. true 6. true Για την σύγκριση Strings ΠΑΝΤΑ χρησιμοποιούμε την μέθοδο equals.
public class Person { private String name; private int number; public Person(String init. Name, int init. Number){ name = init. Name; number = init. Number; } public void set(String new. Name, int new. Number){ name = new. Name; number = new. Number; } public boolean equals(Person other){ return this. name. equals(other. name) && this. number == other. number; } public void copier(Person other) { other. name = name; other. number = number; } public String to. String( ){ return (name + " " + number); } }
Παράδειγμα • Τι θα τυπώσει ο παρακάτω κώδικας? Person one = new Person(“Alice”, 1); Person two = new Person(“Alice”, 1); Person three = two; System. out. println(one == two); System. out. println(two == three); System. out. println(one. equals(two)); System. out. println(two. equals(three)); System. out. println(one. equals(three)); false true
class String. Class { String s = "abc"; } H ανάθεση String σταθεράς έχει αποτέλεσμα την δημιουργία ενός intern string στο οποίο δείχνουν όλα τα strings στα οποία ανατίθεται η σταθερά. public void change. Object(String. Class other){ if (this. s == other. s){ System. out. println("Same"); }else { System. out. println(“Different"); H ανάθεση String σταθεράς } είναι διαφορετική από τη String local = new String("local"); δημιουργία αντικειμένου με other. s = local; new local = “local"; s = local; H σταθερά δημιουργεί if (this. s == other. s){ ένα νέο intern String System. out. println("Same"); }else { System. out. println(“Different"); } } class String. Test{ public static void main(String[] args){ String. Class obj 1 = new String. Class(); Τι θα τυπώσει? String. Class obj 2 = new String. Class(); obj 2. change. Object(obj 1); } }
Εξέλιξη του προγράμματος change. Object other 0 x 0010 local null this 0 x 0020 Το πρώτο if τυπώνει “Same” Intern string s 0 x 0050 “abc” main obj 1 0 x 0010 obj 2 0 x 0020 s 0 x 0050
Εξέλιξη του προγράμματος Το δεύτερο if τυπώνει “Different” String local = new String("local"); other. s = local; change. Object other 0 x 0010 local 0 x 0055 this 0 x 0020 “local” s 0 x 0055 “abc” main obj 1 0 x 0010 obj 2 0 x 0020 s 0 x 0050 Intern string
Εξέλιξη του προγράμματος Το δεύτερο if τυπώνει “Different” local = “local"; s = local; change. Object other 0 x 0010 local 0 x 0075 this 0 x 0020 “local” Intern string “local” s 0 x 0055 “abc” main obj 1 0 x 0010 obj 2 0 x 0020 s 0 x 0075
- Slides: 84