class Car private int position 0 public void
class Car { private int position = 0; public void set. Position(int position){ this. position = position; } public int get. Position(){ return position; } public void move(){ position ++ ; } } class Moving. Car 5 { public static void main(String args[]){ Car my. Car = new Car(); my. Car. set. Position(10); my. Car. move(); System. out. println(my. Car. get. Position()); } }
class Car { private int position = 0; public boolean set. Position(int position){ if (position < 0){ return false; } this. position = position; return true; } public int get. Position(){ return position; } public void move(){ position ++ ; } } class Moving. Car 9 { public static void main(String args[]){ Car my. Car = new Car(); boolean check = my. Car. set. Position(-1); if (!check){ System. out. println("position not set"); } } }
Παράδειγμα class Person { private String name; public Person(String name){ this. name = name; } Constructor: μια μέθοδος με το ίδιο όνομα όπως και η κλάση και χωρίς τύπο (ούτε void) Αρχικοποιεί την μεταβλητή name public void speak(String s){ System. out. println(name+": "+s); } } public class Hello. World 3 { public static void main(String[] args){ Person alice = new Person("Alice"); alice. speak("Hello World"); } } Constructor: καλείται όταν δημιουργείται το αντικείμενο με την new και μόνο τότε
Μια συνομιλία class Person { private String name; public Person(String name){ this. name = name; } public void speak(String s){ System. out. println(name+": "+s); } } public class Conversation { public static void main(String[] args){ Person alice = new Person("Alice"); Person bob = new Person(“Bob"); alice. speak("Hi Bob"); bob. speak(“Hi Alice”); } }
Παράδειγμα class Car { private int position; public Car(int position){ this. position = position; } public void move(int delta){ position += delta ; } public void print. Position(){ System. out. println("Car is at position "+position); } } class Moving. Car 9 { public static void main(String args[]){ Car my. Car 1 = new Car(1); Car my. Car 2 = new Car(-1); my. Car 1. move(-1); my. Car 1. print. Position(); my. Car 2. move(1); my. Car 2. print. Position(); } }
Παράδειγμα Η εκτέλεση αυτών των αρχικοποιήσεων γίνεται πριν εκτελεστούν οι εντολές στον constructor class Car { private int position=0; private int ACCELERATOR = 2; public Car(int position){ this. position = position; } public void move(int delta){ position += ACCELERATOR * delta ; } H τελική τιμή του position θα είναι αυτή που δίνεται σαν όρισμα public void print. Position(){ System. out. println("Car is at position "+position); } } class Moving. Car 10 { public static void main(String args[]){ Car my. Car 1 = new Car(1); Car my. Car 2 = new Car(-1); my. Car 1. move(-1); my. Car 1. print. Position(); my. Car 2. move(1); my. Car 2. print. Position(); } }
class Date { private int day = 1; int month = 1; int year = 2014; String[] month. Names = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; public Date(int day, int month, int year) { if (day <= 0 || day > 31 || month <= 0 || month >12 ){ return; } this. day = day; this. month = month; this. year = year; } public void print. Date(){ System. out. println(day + " " + month. Names[month-1] + " " + year); } } class Date. Example { public static void main(String args[]) { Date my. Date = new Date(7, 3, 2013); my. Date. print. Date(); } } Αν η εντολή set εξυπηρετεί μόνο την αρχικοποίηση μπορούμε να την αποφύγουμε
class Car { private int position; public Car(int position){ this. position = position; } public void move(){ position ++ ; } public void move(int delta){ position += delta ; } } class Moving. Car 11 { public static void main(String args[]){ Car my. Car = new Car(1); my. Car. move(-1); } }
class Car { private int position; public Car(){ this. position = 0; } public Car(int position){ this. position = position; } public void move(){ position ++ ; } public void move(int delta){ position += delta ; } } class Moving. Car 12 { public static void main(String args[]){ Car my. Car 1 = new Car(1); my. Car 1. move(); Car my. Car 2= new Car(); my. Car 2. move(-1); } }
class Car { private int position = 0; public Car(){} Κενός κώδικας, χρειάζεται για να οριστεί ο “default” constructor public Car(int position){ this. position = position; } Γενικά είναι καλό να ορίζετε και ένα constructor χωρίς ορίσματα public void move(){ position ++ ; } public void move(int delta){ position += delta ; } } class Moving. Car 12 { public static void main(String args[]){ Car my. Car 1 = new Car(1); my. Car 1. move(); Car my. Car 2= new Car(); my. Car 2. move(-1); } }
class Car { private int position = 0; public Car(int position){ this. position = position; } public void move(){ position ++ ; } public void move(int delta){ position += delta ; } } class Moving. Car 12 { public static void main(String args[]){ Car my. Car 1 = new Car(1); my. Car 1. move(); Car my. Car 2= new Car(); my. Car 2. move(-1); } } Θα χτυπήσει λάθος ότι δεν υπάρχει constructor χωρίς ορίσματα
Α class Some. Class { public int a. Method(int x, double y){ System. out. println("int double"); return 1; } Β public double a. Method(int x, double y){ System. out. println("int double"); return 1; } C public int a. Method(double x, int y){ System. out. println("double int"); return 1; } public double a. Method(double x, int y){ System. out. println("double int"); return 1; } D } Ποιοι συνδυασμοί είναι αποδεκτοί? Α Β Α C Α D Β C Β D C D
class Some. Class { public int a. Method(int x, int y){ System. out. println("int int"); return 1; } public float a. Method(float x, float y){ System. out. println(“float"); return 1; } public double a. Method(double x, double y){ System. out. println("double"); return 1; } } class Overloading. Example { public static void main(String args[]) { Some. Class an. Object = new Some. Class(); an. Object. a. Method(1, 1); } } Τι θα τυπώσει η κλήση της μεθόδου? Τυπώνει “int int” γιατί ταιριάζει ακριβώς με τις παραμέτρους που δώσαμε
class Some. Class { /* public int a. Method(int x, int y){ System. out. println("int int"); return 1; } */ public float a. Method(float x, float y){ System. out. println(“float"); return 1; } public double a. Method(double x, double y){ System. out. println("double"); return 1; } } class Overloading. Example { public static void main(String args[]) { Some. Class an. Object = new Some. Class(); an. Object. a. Method(1, 1); } } Τι θα τυπώσει η κλήση της μεθόδου? Τυπώνει “float” γιατί είναι πιο κοντά ακριβώς με τις παραμέτρους που δώσαμε
Ασάφεια class Some. Class { public double a. Method(int x, double y){ System. out. println("int double"); return 1; } public int a. Method(double x, int y){ System. out. println("double int"); return 1; } } Τι θα τυπώσει η κλήση της μεθόδου σε κάθε περίπτωση? class Overloading. Example { public static void main(String args[]) { Some. Class an. Object = new Some. Class(); an. Object. a. Method(1. 0, 1); an. Object. a. Method(1, 1); } Ο compiler μας } Τυπώνει “double int” πετάει λάθος γιατί η κλήση είναι ασαφής (ambiguous)
class Car { private int position = 0; public Car(int position){ this. position = position; } public int get. Position() { return position; } public void move(int delta){ position += delta ; } } class Moving. Car. Distance 1 { Μια μέθοδος ή ένα πεδίο που public static void main(String args[]){ χρησιμοποιείται σε μία static μέθοδο Car my. Car 1 = new Car(1); Car my. Car 2 = new Car(0); πρέπει να είναι επίσης static my. Car 2. move(2); System. out. println("Distance of Car 1 from Car 2: " + compute. Distance(my. Car 1, my. Car 2 )); System. out. println("Distance of Car 2 from Car 1: " + compute. Distance(my. Car 2, my. Car 1) ); } private static int compute. Distance(Car car 1, Car car 2){ return car 1. get. Position() – car 2. get. Position() ; } } Η μέθοδος compute. Distance παίρνει σαν όρισμα δύο αντικείμενα τύπου Car
class Car { private int position = 0; public Car(int position){ this. position = position; } Συνήθως προτιμούμε όποια μέθοδος έχει σχέση με την κλάση να την ορίζουμε ως public μέθοδο της κλάσης. Έχουμε επιπλέον ευελιξία γιατί έχουμε πρόσβαση σε όλα τα πεδία της κλάσης public void move(int delta){ position += delta ; } public int distance. From(Car other){ return this. position - other. position ; } } Αν και το πεδίο position είναι private μπορούμε να το προσπελάσουμε γιατί είμαστε μέσα στην κλάση Car. Μία κλάση μπορεί να προσπελάσει τα ιδιωτικά μέλη όλων των αντικειμένων της κλάσης class Moving. Car. Distance 2 { public static void main(String args[]){ Car my. Car 1 = new Car(1); Car my. Car 2 = new Car(0); my. Car 2. move(2); System. out. println("Distance of Car 1 from Car 2: " + my. Car 1. distance. From(my. Car 2) ); System. out. println("Distance of Car 2 from Car 1: " + my. Car 2. distance. From(my. Car 1) ); }
class Traffic. Light { boolean is. Light. Red = false; public void change(){ is. Light. Red = !is. Light. Red; } public int print. Position() { System. out. println(“Car at “+ position); } public boolean is. Red(){ return is. Light. Red; } public void move(Traffic. Light light){ if (!light. is. Red()){ position ++; } } public void print. Status(){ if (is. Light. Red){ System. out. println( "Traffic light is red"); }else{ System. out. println( "Traffic light is green"); } } class Car { private int position = 0; } class Traffic. Simulation { public static void main(String[] args){ Traffic. Light light = new Traffic. Light(); Car my. Car = new Car(); for (int i = 0; i < 10; i ++){ light. print. Status(); my. Car. print. Position(); my. Car. move(light); light. change(); } } }
- Slides: 32