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ä.
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();
}
}javaTulostus näyttää suunnilleen tältä:
Main.java:6: error: cannot inherit from final FinalClass
class AdditionalClass extends FinalClass
^
1 errorjavaLopulliset 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:
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();
}
}javaJos käytät tätä koodia nyt, saat virheilmoituksen:
Main.java:9: error myTitle() in King cannot override myTitle() in Emperor public final void myTitle() {
^
overridden method is finaljavaLopulliset 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ä:
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);
}
}javaKun käytämme Java-komentoa System.out.println tuloksen näyttämiseen, saamme seuraavan virheilmoituksen:
Main.java:6: error: cannot assign a value to final variable x
newValue.x = 10;
^
1 errorjavaLuo 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:
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);
}
}javaJos suoritat tämän koodin, saat seuraavan lauseen tulosteena:
Here is your message.java