# Kuinka käyttää Java final -sanaa luokissa, metodeissa ja muuttujissa

Avainsanaa `final` käytetään Java-kielessä luomaan elementtejä, joita ei voi muuttaa. Tätä muokkaajaa voi käyttää luokkiin, menetelmiin ja muuttujiin. Sitä käytetään erityisesti estämään virheitä ja tahallista väärinkäyttöä koodissa.

## Mikä on Java `final`?

Useimmat ohjelmointikielet sallivat olemassa olevan koodin muokkaamisen ja laajentamisen halutulla tavalla. Java-kielessä tämä on myös mahdollista, mutta joissakin tapauksissa on tärkeää, että elementti **määritetään muuttumattomaksi**. Java-kielessä tämä voidaan tehdä käyttämällä `final`. Tätä modifikaattoria käytetään rajoittamaan pääsyä luokkaan, metodiin tai muuttujaan. Kun muuttuja on määritetty lopulliseksi, sen arvoa ei voi muuttaa. Final-luokkaa ei voi laajentaa, eikä final-metodia voi ohittaa. Tämä auttaa suojautumaan kyseisen koodiosan väärinkäytöltä.

## Lopulliset luokat

Jos käytät Java `final` luokalle, sitä ei voi enää laajentaa. Tämä lähestymistapa on hyvin yleinen, ja monissa tapauksissa sitä käytetään estämään **alaluokan johdanto**. Tämä koskee perusdatatyyppejä, kuten `java.lang.Math` tai `java.lang.String`, jotka on aina määritelty lopullisiksi. Vaikka haluat estää pääluokan alaluokkien johdannon muista syistä, Java `final` käyttö on paras tapa. Seuraavassa esimerkissä luomme lopullisen luokan ja toisen luokan, jonka pitäisi teoriassa laajentaa sitä. Sen jälkeen tulee pääluokka päämenetelmällä.

```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();
	}
}
```

Tulostus näyttää suunnilleen tältä:

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

## Lopulliset menetelmät

Jos merkitset menetelmän lopulliseksi, sitä ei voi ohittaa. Tämä varmistaa, että alaluokan menetelmä ei voi muuttaa sen tarkoitettua käyttäytymistä. Saavuttaaksesi tämän, ilmoita menetelmä Java `final` -muokkaimella. Otetaan esimerkiksi luokka nimeltä “Emperor”, joka sisältää lopullisen menetelmän nimeltä “myTitle”. Toinen luokka, “King”, joka laajentaa luokkaa “Emperor”, yrittää ohittaa menetelmän “myTitle”. Päämenetelmässä käytämme instanssia “Prince” päästääksemme käsiksi menetelmään. Koodi näyttää seuraavalta:

```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();
	}
}
```

Jos käytät tätä koodia nyt, saat virheilmoituksen:

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

## Lopulliset muuttujat

Java `final` käytetään myös luomaan muuttujia, **joiden arvoja ei voi myöhemmin muuttaa**. Tämä on erityisen tärkeää, jos tietyt muuttujat on pidettävä vakioina koodissa. Seuraavassa esimerkissä luomme muuttujan x, jonka arvo on 5. Yritämme sitten lisätä tämän muuttujan ja määrittää sille uuden arvon. Koodi näyttää tältä:

```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);
	}
}
```

Kun käytämme Java-komentoa `System.out.println` tuloksen näyttämiseen, saamme seuraavan virheilmoituksen:

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

### Luo tyhjät lopulliset muuttujat

Muuttujat on aina alustettava Java-kielessä. Jos kuitenkin määrität tyhjän lopullisen muuttujan, voit alustaa sen luokkakonstruktorilla. Koodi näyttää seuraavalta:

```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);
	}
}
```

Jos suoritat tämän koodin, saat seuraavan lauseen tulosteena:

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


This is a markdown version of: [https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-lopullinen/](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-lopullinen/) for AI/LLM consumption.