Software Development · CN4001
Εβδομάδα 8: Μέθοδοι, κλάσεις και αντικείμενα
Σημειώσεις μελέτης βασισμένες στο «Learn Programming with Java – Lesson 4». Οι διαφάνειες, με τα παραδείγματα κώδικα και τις ασκήσεις τους, βρίσκονται στο Moodle.
Όσο μεγαλώνει ένα πρόγραμμα, τόσο πιο δύσκολα «χωράει» ολόκληρο μέσα στη main.
Αυτή την εβδομάδα βλέπουμε δύο τρόπους να το οργανώσεις: τις στατικές
μεθόδους, για κομμάτια κώδικα που επαναλαμβάνονται, και τις κλάσεις με τα
αντικείμενά τους, για να περιγράψεις πράγματα του πραγματικού κόσμου.
Στατικές μέθοδοι
Ας πούμε ότι πρέπει να υπολογίσεις το εμβαδό πολλών κύκλων. Αντί να γράφεις τον τύπο ξανά και ξανά, τον γράφεις μία φορά σε μια μέθοδο και την καλείς όσες φορές θέλεις:
public class Geometry {
// Δέχεται την ακτίνα, επιστρέφει το εμβαδό.
public static double circleArea(double radius) {
return Math.PI * radius * radius;
}
public static void main(String[] args) {
System.out.printf("%.2f%n", circleArea(1.0)); // 3.14
System.out.printf("%.2f%n", circleArea(2.5)); // 19.63
}
}
Η επικεφαλίδα public static double circleArea(double radius) λέει:
static: η μέθοδος ανήκει στην κλάση, οπότε την καλείς χωρίς να φτιάξεις αντικείμενο.double: ο τύπος επιστροφής· μεreturnστέλνεις πίσω το αποτέλεσμα. Αν μια μέθοδος δεν επιστρέφει τίποτα, γράφειςvoid.circleArea: το όνομα, συνήθως ρήμα ή περιγραφή του τι κάνει.(double radius): οι παράμετροι, οι τιμές που δέχεται. Όταν την καλείς, δίνεις τα ορίσματα, π.χ.circleArea(2.5).
Μια μέθοδος μπορεί να δέχεται και πίνακα:
public static double average(int[] values) {
int sum = 0;
for (int v : values) {
sum += v;
}
return (double) sum / values.length;
}
Τα κέρδη είναι ότι γράφεις κάτι μία φορά και το χρησιμοποιείς πολλές, ο κώδικας διαβάζεται πιο εύκολα, και αν βρεις λάθος, το διορθώνεις σε ένα σημείο.
Αντικειμενοστραφής προγραμματισμός
Ο αντικειμενοστραφής προγραμματισμός (OOP) οργανώνει το πρόγραμμα γύρω από αντικείμενα. Κάθε αντικείμενο αντιστοιχεί σε κάτι πραγματικό (έναν φοιτητή, ένα προϊόν, ένα αυτοκίνητο) και έχει δεδομένα (ιδιότητες) και συμπεριφορά (μεθόδους). Στηρίζεται σε τέσσερις αρχές:
| Αρχή | Τι σημαίνει |
|---|---|
| Ενθυλάκωση (encapsulation) | τα δεδομένα ενός αντικειμένου είναι κρυμμένα, και αλλάζουν μόνο μέσα από τις μεθόδους του |
| Αφαίρεση (abstraction) | φαίνονται μόνο όσα χρειάζεται ο χρήστης· οι λεπτομέρειες μένουν κρυφές |
| Κληρονομικότητα (inheritance) | μια κλάση-παιδί παίρνει τις ιδιότητες και τις μεθόδους μιας κλάσης-γονέα |
| Πολυμορφισμός (polymorphism) | αντικείμενα διαφορετικών κλάσεων χρησιμοποιούνται με τον ίδιο τρόπο, μέσω της κοινής τους κλάσης-γονέα |
Κλάσεις και αντικείμενα
Μια κλάση είναι το καλούπι· ένα αντικείμενο είναι κάτι που φτιάχνεις από αυτό το καλούπι, με τις δικές του τιμές.
public class Book {
// Ιδιότητες: κάθε βιβλίο έχει τις δικές του τιμές.
private String title;
private int pages;
// Κατασκευαστής: εκτελείται όταν φτιάχνεις ένα νέο βιβλίο.
public Book(String title, int pages) {
this.title = title;
this.pages = pages;
}
// Μέθοδοι: τι μπορεί να κάνει ένα βιβλίο.
public boolean isLong() {
return pages > 400;
}
public void printDetails() {
System.out.println(title + " (" + pages + " σελίδες)");
}
}
public class Main {
public static void main(String[] args) {
Book a = new Book("Οδύσσεια", 560);
Book b = new Book("Ο μικρός πρίγκιπας", 96);
a.printDetails(); // Οδύσσεια (560 σελίδες)
System.out.println(b.isLong()); // false
}
}
- Οι ιδιότητες (
title,pages) είναι μεταβλητές που ανήκουν σε κάθε αντικείμενο χωριστά. Το βιβλίοaκαι το βιβλίοbέχουν διαφορετικές τιμές. - Ο κατασκευαστής (constructor) έχει το ίδιο όνομα με την κλάση και κανέναν
τύπο επιστροφής. Ορίζει τις αρχικές τιμές όταν γράφεις
new Book(...). - Το
thisσημαίνει «αυτό το αντικείμενο». Στοthis.title = titleξεχωρίζει την ιδιότητα από την παράμετρο που έχει το ίδιο όνομα. - Οι μέθοδοι δεν είναι
static: καλούνται πάνω σε ένα συγκεκριμένο αντικείμενο, π.χ.a.printDetails(), και χρησιμοποιούν τα δικά του δεδομένα.
Ενθυλάκωση με private, getters και setters
Επειδή οι ιδιότητες είναι private, κανείς έξω από την κλάση δεν μπορεί να
γράψει a.pages = -5. Αν χρειάζεται πρόσβαση, η κλάση δίνει μεθόδους που
ελέγχουν τι επιτρέπεται:
public int getPages() {
return pages;
}
public void setPages(int pages) {
if (pages > 0) { // δεχόμαστε μόνο λογικές τιμές
this.pages = pages;
}
}
Έτσι η κλάση προστατεύει τα δεδομένα της. Αυτό είναι η ενθυλάκωση.
Ερωτήσεις αυτοαξιολόγησης
1. Τι σημαίνει ότι μια μέθοδος είναι void;
Ότι δεν επιστρέφει τιμή. Κάνει κάτι, π.χ. τυπώνει, αλλά δεν στέλνει αποτέλεσμα πίσω σε όποιον την κάλεσε.
2. Ποια είναι η διαφορά ανάμεσα σε κλάση και αντικείμενο;
Η κλάση είναι το σχέδιο: ορίζει ποιες ιδιότητες και μεθόδους υπάρχουν. Το αντικείμενο είναι ένα συγκεκριμένο «κομμάτι» φτιαγμένο από αυτό το σχέδιο, με τις δικές του τιμές.
3. Γιατί ο κατασκευαστής δεν έχει τύπο επιστροφής;
Γιατί δεν τον καλείς για να πάρεις μια τιμή, αλλά για να αρχικοποιήσει ένα νέο
αντικείμενο. Το new είναι αυτό που επιστρέφει το αντικείμενο.
4. Τι κερδίζεις κάνοντας τις ιδιότητες private και δίνοντας setters;
Ελέγχεις ποιες τιμές επιτρέπονται, π.χ. αρνητικές σελίδες απορρίπτονται. Επίσης, μπορείς να αλλάξεις τον εσωτερικό τρόπο αποθήκευσης χωρίς να επηρεαστεί ο κώδικας που χρησιμοποιεί την κλάση.
5. Γράψε μια στατική μέθοδο max που δέχεται δύο ακέραιους και επιστρέφει τον μεγαλύτερο.
public static int max(int a, int b) {
return a > b ? a : b;
}
Πηγές: «Learn Programming with Java – Lesson 4» του μαθήματος· Oracle Java Tutorials.
Ασκήσεις της εβδομάδας
8th Weekly Task
- Προθεσμία
- Χωρίς προθεσμία — για εξάσκηση
Εκφώνηση
Ερώτημα 1
Δημιουργήστε έναν πίνακα τύπου double που περιέχει θερμοκρασίες σε βαθμούς Κελσίου. Υπολογίστε τον μέσο όρο των θερμοκρασιών, μετατρέψτε τις σε Φαρενάιτ και υπολογίστε ξανά τον μέσο όρο για τις θερμοκρασίες σε Φαρενάιτ.
Οδηγίες:
- Δημιουργήστε έναν πίνακα τύπου double που περιέχει θερμοκρασίες σε βαθμούς Κελσίου.
- Υπολογίστε και εκτυπώστε τον μέσο όρο των θερμοκρασιών σε βαθμούς Κελσίου.
- Μετατρέψτε κάθε θερμοκρασία σε Φαρενάιτ.
- Υπολογίστε και εκτυπώστε τον μέσο όρο των θερμοκρασιών σε Φαρενάιτ.
- Μαθηματικός τύπος: °F = (°C × 9/5) + 32
Παράδειγμα εισόδου:
[15.0, 20.0, 25.0, 30.0]
Παράδειγμα εξόδου:
Average in Celsius: 22.50
Average in Fahrenheit: 72.50
Ερώτημα 2
Δημιουργήστε έναν πίνακα συμβολοσειρών (String) και έναν πίνακα ακέραιων (int). Εκτυπώστε τα δεδομένα των πινάκων, ενημερώστε ορισμένες τιμές στον πίνακα int και εκτυπώστε ξανά τα δεδομένα.
Οδηγίες:
- Δημιουργήστε έναν πίνακα τύπου String με ονόματα.
- Δημιουργήστε έναν πίνακα τύπου int με ηλικίες.
- Εκτυπώστε τα δεδομένα των δύο πινάκων.
- Αλλάξτε δύο τιμές στον πίνακα int.
- Εκτυπώστε ξανά τα δεδομένα των δύο πινάκων.
Παράδειγμα εισόδου:
["Alice", "Bob", "Charlie"]
[20, 25, 30]
Παράδειγμα εξόδου:
Alice: 20
Bob: 25
Charlie: 30
Updated Data:
Alice: 20
Bob: 26
Charlie: 32
Ερώτημα 3
Χρησιμοποιήστε έναν δισδιάστατο πίνακα (2D array) για να αποθηκεύσετε δεδομένα και εκτελέστε εργασίες, όπως την εύρεση του μέγιστου στοιχείου και τον υπολογισμό του αθροίσματος.
Οδηγίες:
- Δημιουργήστε έναν πίνακα 2 διαστάσεων (int) που περιέχει προϊόντα και τις τιμές τους.
- Εκτυπώστε τα δεδομένα του πίνακα.
- Υπολογίστε και εκτυπώστε το άθροισμα όλων των τιμών.
- Εντοπίστε και εκτυπώστε την υψηλότερη τιμή στον πίνακα.
Παράδειγμα εισόδου:
[
[1, 10], // Product 1, Price 10
[2, 20], // Product 2, Price 20
[3, 30] // Product 3, Price 30
]
Παράδειγμα εξόδου:
Total Price: 60
Highest Price: 30
Ερώτημα 4
Μεταφέρετε τον υπολογισμό της μετατροπής θερμοκρασίας από το Ερώτημα 1 σε μια ξεχωριστή στατική μέθοδο.
Οδηγίες:
- Δημιουργήστε μια στατική μέθοδο convertToFahrenheit που θα μετατρέπει βαθμούς Κελσίου σε Φαρενάιτ.
- Επαναχρησιμοποιήστε τη μέθοδο στην κύρια κλάση για να μετατρέψετε τις θερμοκρασίες του πίνακα.
- Εκτυπώστε τις μετατρεπόμενες θερμοκρασίες.
Παράδειγμα εισόδου:
[10.0, 15.0, 20.0]
Παράδειγμα εξόδου:
Temperatures in Fahrenheit: [50.0, 59.0, 68.0]
Ερώτημα 5
Δημιουργήστε μια μέθοδο που θα υπολογίζει και θα επιστρέφει τη μέση τιμή ενός πίνακα double.
Οδηγίες:
- Δημιουργήστε μια στατική μέθοδο calculateAverage που θα υπολογίζει τη μέση τιμή ενός πίνακα double.
- Επιστρέψτε τη μέση τιμή και εκτυπώστε την στην κύρια μέθοδο.
Παράδειγμα εισόδου:
[5.0, 10.0, 15.0]
Παράδειγμα εξόδου:
Average: 10.0
Ερώτημα 6
Δημιουργήστε μια μέθοδο που θα βρίσκει τη μέγιστη τιμή σε έναν πίνακα int.
Οδηγίες:
- Δημιουργήστε μια στατική μέθοδο findMax που θα επιστρέφει το μέγιστο στοιχείο ενός πίνακα int.
- Επιστρέψτε και εκτυπώστε τη μέγιστη τιμή στην κύρια μέθοδο.
Παράδειγμα εισόδου:
[1, 3, 7, 2, 9]
Παράδειγμα εξόδου:
Maximum Value: 9
Ερώτημα 7
Δημιουργήστε έναν πίνακα και τουλάχιστον τρεις στατικές μεθόδους: μία για να υπολογίζει το άθροισμα, μία για να βρίσκει τη μέγιστη τιμή, και μία για να υπολογίζει τη μέση τιμή του πίνακα.
Οδηγίες:
- Δημιουργήστε έναν πίνακα int με αριθμητικά δεδομένα.
- Δημιουργήστε μια στατική μέθοδο calculateSum για να υπολογίζει το άθροισμα των στοιχείων του πίνακα.
- Δημιουργήστε μια στατική μέθοδο findMax για να βρίσκει τη μέγιστη τιμή.
- Δημιουργήστε μια στατική μέθοδο calculateAverage για να υπολογίζει τη μέση τιμή.
- Χρησιμοποιήστε τις μεθόδους στην κύρια μέθοδο και εκτυπώστε τα αποτελέσματα.
Παράδειγμα εισόδου:
[5, 10, 15, 20]
Παράδειγμα εξόδου:
Sum: 50
Maximum Value: 20
Average: 12.50
Ερώτημα 8
Δημιουργήστε έναν πίνακα τιμών και στατικές μεθόδους για να προσθέσετε φόρο σε κάθε τιμή, να υπολογίσετε το συνολικό ποσό, και να εκτυπώσετε τις ενημερωμένες τιμές.
Οδηγίες:
- Δημιουργήστε έναν πίνακα double με αρχικές τιμές προϊόντων.
- Δημιουργήστε μια μέθοδο applyTax που θα προσθέτει έναν σταθερό φόρο (π.χ. 24%) σε κάθε τιμή.
- Δημιουργήστε μια μέθοδο calculateTotal για να υπολογίζει το συνολικό ποσό.
- Δημιουργήστε μια μέθοδο printPrices για να εκτυπώνει τις ενημερωμένες τιμές.
- Χρησιμοποιήστε τις μεθόδους στην κύρια μέθοδο.
- Μαθηματικός τύπος: Price with Tax = Price + (Price × Tax Rate / 100)
Παράδειγμα εισόδου:
[10.0, 20.0, 30.0]
Παράδειγμα εξόδου:
Prices after Tax: [12.40, 24.80, 37.20]
Total Price: 74.40
Ερώτημα 9
Δημιουργήστε έναν πίνακα με θερμοκρασίες και στατικές μεθόδους για να εκτελέσετε πολλαπλές λειτουργίες, όπως μετατροπή σε άλλες μονάδες, εύρεση ελάχιστης τιμής, και υπολογισμό του εύρους θερμοκρασιών.
Οδηγίες:
- Δημιουργήστε έναν πίνακα double με θερμοκρασίες σε βαθμούς Κελσίου.
- Δημιουργήστε μια μέθοδο convertToFahrenheit για να μετατρέπετε κάθε θερμοκρασία σε Φαρενάιτ.
- Δημιουργήστε μια μέθοδο findMin για να βρίσκει την ελάχιστη τιμή στον πίνακα.
- Δημιουργήστε μια μέθοδο calculateRange για να υπολογίζει το εύρος θερμοκρασιών (μέγιστο - ελάχιστο).
- Εκτυπώστε τα αποτελέσματα στην κύρια μέθοδο.
Παράδειγμα εισόδου:
[15.0, 20.0, 25.0, 30.0]
Παράδειγμα εξόδου:
Temperatures in Fahrenheit: [59.0, 68.0, 77.0, 86.0]
Minimum Temperature: 15.0
Temperature Range: 15.0
Ερώτημα 10
Δημιουργήστε έναν πίνακα με αριθμούς και στατικές μεθόδους για να ελέγξετε αν οι αριθμοί είναι ζυγοί ή μονοί, να υπολογίσετε το πλήθος των ζυγών αριθμών, και να προσθέσετε έναν αριθμό σε κάθε στοιχείο.
Οδηγίες:
- Δημιουργήστε έναν πίνακα int με αριθμητικά δεδομένα.
- Δημιουργήστε μια μέθοδο isEven για να ελέγχει αν ένας αριθμός είναι ζυγός ή μονοός.
- Δημιουργήστε μια μέθοδο countEvens για να υπολογίζει το πλήθος των ζυγών αριθμών στον πίνακα.
- Δημιουργήστε μια μέθοδο addNumberToArray για να προσθέτει έναν σταθερό αριθμό σε κάθε στοιχείο του πίνακα.
- Εκτυπώστε τα αποτελέσματα στην κύρια μέθοδο.
Παράδειγμα εισόδου:
[1, 2, 3, 4, 5]
Προσθήκη: 2
Παράδειγμα εξόδου:
Even Numbers: 2
Updated Array: [3, 4, 5, 6, 7]