Η δημιουργία ενός στιγμιότυπου μιας κλάσης γίνεται καλώντας τον κατασκευαστή της μέσω του τελεστή new.
Ένας κατασκευαστής είναι ένας ειδικός τύπος μεθόδου, με σκοπό να αρχικοποιήσει ένα στιγμιότυπο που μόλις δημιουργήθηκε.
Οι κατασκευαστές μοιάζουν με τις κανονικές μεθόδους, αλλά δεν έχουν τύπο επιστροφής και το όνομά τους ταιριάζει με το όνομα της κλάσης.
class Library {
private int books;
public Library() {
// Initialize the books field
this.books = 10;
}
}
// This will call the constructor
var library = new Library();
Όπως οι κανονικές μέθοδοι, έτσι και οι κατασκευαστές μπορούν να έχουν παραμέτρους. Οι παράμετροι του κατασκευαστή συνήθως αποθηκεύονται ως (ιδιωτικά) πεδία για να χρησιμοποιηθούν αργότερα, ή αλλιώς χρησιμοποιούνται σε κάποιον υπολογισμό που γίνεται μία φορά. Μπορείς να περάσεις ορίσματα σε έναν κατασκευαστή, ακριβώς όπως περνάς ορίσματα σε κανονικές μεθόδους.
class Building {
private int numberOfStories;
private int totalHeight;
public Building(int numberOfStories, double storyHeight) {
this.numberOfStories = numberOfStories;
this.totalHeight = numberOfStories * storyHeight;
}
}
// Call a constructor with two arguments
var largeBuilding = new Building(55, 6.2);
Σε αυτήν την άσκηση, θα οργανώσεις αγώνες ανάμεσα σε διάφορους τύπους τηλεχειριζόμενων αυτοκινήτων. Κάθε αυτοκίνητο έχει τη δική του ταχύτητα και τα δικά του χαρακτηριστικά κατανάλωσης μπαταρίας.
Τα αυτοκίνητα ξεκινούν με γεμάτες μπαταρίες (100%). Κάθε φορά που οδηγείς το αυτοκίνητο με το τηλεχειριστήριο, αυτό διανύει σε μέτρα όσο είναι η ταχύτητα του αυτοκινήτου και μειώνει το υπόλοιπο ποσοστό μπαταρίας κατά την κατανάλωση μπαταρίας του.
Αν η μπαταρία ενός αυτοκινήτου είναι κάτω από το ποσοστό κατανάλωσης μπαταρίας του, δε μπορείς πια να οδηγήσεις το αυτοκίνητο.
Κάθε πίστα αγώνων έχει τη δική της απόσταση. Τα αυτοκίνητα δοκιμάζονται ελέγχοντας αν μπορούν να τερματίσουν την πίστα χωρίς να ξεμείνουν από μπαταρία.
Έχεις έξι εργασίες, καθεμία από τις οποίες θα δουλέψει με στιγμιότυπα τηλεχειριζόμενων αυτοκινήτων.
Επίτρεψε τη δημιουργία ενός τηλεχειριζόμενου αυτοκινήτου ορίζοντας έναν κατασκευαστή για την κλάση NeedForSpeed που παίρνει ως δύο παραμέτρους την ταχύτητα του αυτοκινήτου σε μέτρα και το ποσοστό κατανάλωσης μπαταρίας (και οι δύο τύπου int):
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
Επίτρεψε τη δημιουργία μιας πίστας αγώνων ορίζοντας έναν κατασκευαστή για την κλάση RaceTrack που παίρνει ως μοναδική παράμετρο την απόσταση της πίστας σε μέτρα (η οποία είναι τύπου int):
int distance = 800;
var raceTrack = new RaceTrack(distance);
Υλοποίησε τη μέθοδο NeedForSpeed.drive() που ενημερώνει τον αριθμό των μέτρων που έχουν διανυθεί με βάση την ταχύτητα του αυτοκινήτου. Επίσης, υλοποίησε τη μέθοδο NeedForSpeed.distanceDriven() ώστε να επιστρέφει τον αριθμό των μέτρων που έχει διανύσει το αυτοκίνητο:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
car.drive();
car.distanceDriven();
// => 5
Ενημέρωσε τη μέθοδο NeedForSpeed.drive() ώστε να καταναλώνει μπαταρία με βάση την κατανάλωση μπαταρίας του αυτοκινήτου. Επίσης, υλοποίησε τη μέθοδο NeedForSpeed.batteryDrained() που δείχνει αν η μπαταρία έχει εξαντληθεί τόσο ώστε να μην μπορεί να οδηγηθεί το αυτοκίνητο:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
car.drive();
car.batteryDrained();
// => false
Το τηλεχειριζόμενο αυτοκίνητο με τις περισσότερες πωλήσεις είναι το Nitro, που έχει εντυπωσιακή μέγιστη ταχύτητα 50 μέτρων με κατανάλωση μπαταρίας 4%. Υλοποίησε τη (στατική) μέθοδο NeedForSpeed.nitro() ώστε να επιστρέφει αυτόν τον τύπο αυτοκινήτου:
var car = NeedForSpeed.nitro();
car.drive();
car.distanceDriven();
// => 50
Για να τερματίσει έναν αγώνα, ένα αυτοκίνητο πρέπει να μπορεί να διανύσει την απόσταση του αγώνα. Αυτό σημαίνει να μην εξαντλήσει την μπαταρία του πριν διασχίσει τη γραμμή τερματισμού. Υλοποίησε τη μέθοδο RaceTrack.canFinishRace() που παίρνει ως παράμετρο ένα στιγμιότυπο NeedForSpeed και επιστρέφει true αν το αυτοκίνητο μπορεί να τερματίσει τον αγώνα, αλλιώς επιστρέφει false:
int speed = 5;
int batteryDrain = 2;
var car = new NeedForSpeed(speed, batteryDrain);
int distance1 = 100;
var race1 = new RaceTrack(distance1);
int distance2 = 300;
var race2 = new RaceTrack(distance2);
race1.canFinishRace(car);
// => true
race2.canFinishRace(car);
// => false
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.