Private-muuttuja
Pyyhkäise näyttääksesi valikon
Kuinka piilottaa kentät ja metodit toiselta luokalta
Pääsynrajoittimet (access modifiers) määrittävät muuttujien ja metodien näkyvyyden ja saavutettavuuden Javassa. Niiden avulla voidaan määritellä jäsenten näkyvyysalue ja rajoittaa pääsyä tiettyihin luokan jäseniin.
Olemme jo käsitelleet pääsynrajoittimia edellisessä osiossa. Nyt tarkastelemme tarkemmin yleisimmin käytettyä pääsynrajoitinta - private.
Kuten tiedät, private-pääsynrajoittimella kenttään/metodiin pääsee vain siinä luokassa, jossa se on määritelty. Katsotaan esimerkkiä private-rajoittimen käytöstä:
Jos emme halua, että muuttuja yhdessä luokassa on näkyvissä tai käytettävissä toisesta luokasta, voimme käyttää private-pääsynrajoitinta:
Main.java
123456789101112131415package com.example; public class Main { public static void main(String[] args) { Person bob = new Person(); bob.name = "Bob"; System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; }
Olemme määritelleet Person-luokan kentät private-muuttujiksi. Kun yritämme alustaa kentän suoraan, saamme virheilmoituksen, joka kertoo, että name-kentällä on private-pääsynrajoitin eikä siihen voi viitata tai sitä muuttaa pääohjelmassa.
Kuinka alustaa private-kenttä
Yksinkertaisin tapa kiertää suojaus on käyttää alustusta konstruktorin kautta. Tällä tavoin voimme ainoastaan alustaa olioiden kentät, mutta emme pääse käsiksi näihin kenttiin. Katsotaan esimerkkiä:
Main.java
123456789101112131415161718package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } }
Pystyimme alustamaan name-kentän konstruktorin kautta, mutta emme silti voi käyttää tätä kenttää tai tulostaa sitä System.out.println()-komennolla. Tämän kiertämiseksi voimme ylikirjoittaa toString()-metodin, jotta kun kutsumme System.out.println(bob);, se näyttää tietoa olion kentistä.
Tarkastellaan esimerkkiä:
Main.java
1234567891011121314151617181920212223package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
Onnistuimme lopulta näyttämään name-olion bob-kentän arvon. Tämä saavutettiin käyttämällä ylikirjoitettua toString()-metodia, jossa toteutimme logiikan name-kentän näyttämiseksi.
Herää kysymys, miksi tarvitsemme tätä näkyvyysmuodinta, jos joudumme kirjoittamaan niin paljon ylimääräistä koodia?
Joskus eri luokissa on samannimisiä muuttujia, ja tällaisissa tapauksissa on tarpeen piilottaa näiden luokkien muuttujat, jotta muut luokat eivät pääse käsiksi tarpeettomiin kenttiin. Tämä parantaa merkittävästi koodin kirjoittamisen selkeyttä, kun ymmärtää, mihin luokkaan kukin kenttä kuuluu.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme