# Πώς να χρησιμοποιήσετε το Java final για κλάσεις, μεθόδους και μεταβλητές

Η λέξη-κλειδί `final` χρησιμοποιείται στη Java για τη δημιουργία στοιχείων που δεν μπορούν να αλλάξουν. Μπορείτε να εφαρμόσετε αυτόν τον τροποποιητή σε κλάσεις, μεθόδους και μεταβλητές. Συγκεκριμένα, χρησιμοποιείται για την αποφυγή σφαλμάτων και σκόπιμης κακής χρήσης εντός του κώδικα.

## Τι είναι το Java `final`;

Οι περισσότερες γλώσσες προγραμματισμού επιτρέπουν την τροποποίηση και επέκταση του υπάρχοντος κώδικα όπως επιθυμείτε. Στην Java, αυτό είναι επίσης δυνατό, αλλά υπάρχουν περιπτώσεις όπου είναι ζωτικής σημασίας ένα στοιχείο να **οριστεί ως αμετάβλητο**. Στην Java, μπορείτε να το κάνετε αυτό χρησιμοποιώντας τον τροποποιητή `final`. Αυτός ο τροποποιητής χρησιμοποιείται για να περιορίσει την πρόσβαση σε μια κλάση, μια μέθοδο ή μια μεταβλητή. Μόλις μια μεταβλητή δηλωθεί ως τελική, η τιμή της δεν μπορεί να αλλάξει. Μια τελική κλάση δεν μπορεί να επεκταθεί και μια τελική μέθοδος δεν μπορεί να αντικατασταθεί. Αυτό βοηθά στην προστασία από την κατάχρηση αυτού του τμήματος του κώδικα.

## Τελικές τάξεις

Εάν χρησιμοποιείτε Java `final` για μια κλάση, αυτή δεν μπορεί πλέον να επεκταθεί. Αυτή η προσέγγιση είναι πολύ συνηθισμένη και, σε πολλές περιπτώσεις, χρησιμοποιείται για να αποτρέψει την **παράγωγο μιας υποκλάσης**. Αυτό ισχύει για βασικούς τύπους δεδομένων όπως `java.lang.Math` ή `java.lang.String`, οι οποίοι δηλώνονται πάντα ως τελικοί. Ακόμα και αν θέλετε να αποτρέψετε την παράγωγο υποκλάσεων μιας κύριας κλάσης για άλλους λόγους, η χρήση Java `final` είναι ο καλύτερος τρόπος. Στο παρακάτω παράδειγμα, θα δημιουργήσουμε μια τελική κλάση και μια δεύτερη κλάση που θεωρητικά θα πρέπει να την επεκτείνει. Μετά από αυτό, ακολουθεί η κύρια κλάση με τη μέθοδο main.

```java
final class FinalClass {
	public void exampleMethod() {
		System.out.println("This is a method within the final class.");
	}
}
class AdditionalClass extends FinalClass {
	public void exampleMethod() {
		System.out.println("The method is now also available in the additional class.");
	}
}
public class Main {
	public static void main(String[] args) {
		AdditionalClass ourAdditionalClass = new AdditionalClass();
		ourAdditionalClass.exampleMethod();
	}
}
```

Το αποτέλεσμα που θα λάβετε θα πρέπει να μοιάζει με αυτό:

```java
Main.java:6: error: cannot inherit from final FinalClass
class AdditionalClass extends FinalClass
       ^
1 error
```

## Τελικές μέθοδοι

Εάν επισημάνετε μια μέθοδο ως τελική, δεν μπορεί να αντικατασταθεί. Αυτό εξασφαλίζει ότι μια μέθοδος σε μια υποκλάση δεν μπορεί να αλλάξει την προβλεπόμενη συμπεριφορά της. Για να το επιτύχετε αυτό, δηλώστε τη μέθοδο με τον τροποποιητή Java `final`. Για παράδειγμα, σκεφτείτε μια κλάση με το όνομα «Emperor» που περιλαμβάνει μια τελική μέθοδο με το όνομα «myTitle». Μια άλλη κλάση, η «King», η οποία επεκτείνει την «Emperor», προσπαθεί να αντικαταστήσει τη μέθοδο «myTitle». Στην κύρια μέθοδο, χρησιμοποιούμε μια παρουσία της «Prince» για να αποκτήσουμε πρόσβαση στη μέθοδο. Ο κώδικας έχει ως εξής:

```java
public class Emperor {
	public final void myTitle() {
		System.out.println("I am the emperor.");
	}
}
public class King extends Emperor {
	public final void myTitle() {
		System.out.println("I am the king.");
	}
}
public class Prince {
	public static void main(String[] args) {
		King myTitle = new King();
		King.myTitle();
	}
}
```

Εάν εφαρμόσετε τώρα αυτόν τον κώδικα, θα λάβετε ένα μήνυμα σφάλματος:

```java
Main.java:9: error myTitle() in King cannot override myTitle() in Emperor public final void myTitle() {
		^
overridden method is final
```

## Τελικές μεταβλητές

Η Java `final` χρησιμοποιείται επίσης για τη δημιουργία μεταβλητών με **τιμές που δεν μπορούν να αλλάξουν στη συνέχεια**. Αυτό είναι ιδιαίτερα σημαντικό εάν ορισμένες μεταβλητές πρέπει να παραμείνουν σταθερές εντός του κώδικα. Στο παρακάτω παράδειγμα, θα δημιουργήσουμε τη μεταβλητή x, η οποία έχει την τιμή 5. Στη συνέχεια, θα προσπαθήσουμε να εισαγάγουμε αυτή τη μεταβλητή και να της εκχωρήσουμε μια νέα τιμή. Ο κώδικας έχει την εξής μορφή:

```java
public class Main {
	final int x = 5;
public static void main(String[] args) {
	Main newValue = new Main();
	newValue.x = 10;
	System.out.println(newValue.x);
	}
}
```

Όταν χρησιμοποιούμε την εντολή Java `System.out.println` για να εμφανίσουμε το αποτέλεσμα, λαμβάνουμε το ακόλουθο μήνυμα σφάλματος:

```java
Main.java:6: error: cannot assign a value to final variable x
	newValue.x = 10;
		     ^
1 error
```

### Δημιουργία κενών τελικών μεταβλητών

Οι μεταβλητές πρέπει πάντα να αρχικοποιούνται στη Java. Ωστόσο, αν δηλώσετε μια κενή τελική μεταβλητή, μπορείτε να την αρχικοποιήσετε με έναν κατασκευαστή κλάσης. Ο κώδικας έχει την εξής μορφή:

```java
public class Example {
	final String exampleText;
	Example() {
		exampleText = "Here is your message.";
	}
	public static void main(String[] args) {
		Example newObject = new Example();
		System.out.println(newObject.exampleText);
	}
}
```

Εάν εκτελέσετε αυτόν τον κώδικα, θα λάβετε την ακόλουθη πρόταση ως έξοδο:

```java
Here is your message.
```


This is a markdown version of: [https://www.ionos.com/el-gr/digitalguide/istoselides/anaptyxi-istoselidon/teliki-ekdosi-java/](https://www.ionos.com/el-gr/digitalguide/istoselides/anaptyxi-istoselidon/teliki-ekdosi-java/) for AI/LLM consumption.