Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Private-Muuttuja | Luokat Jatko
Java Laajennettu

bookPrivate-Muuttuja

Kuinka piilottaa kentät ja metodit toiselta luokalta

Pääsynmäärittäjät (access modifiers) käytetään määrittämään muuttujien ja metodien näkyvyys ja saavutettavuus Javassa. Niiden avulla voidaan rajata jäsenen käyttöaluetta ja rajoittaa pääsyä tiettyihin luokan jäseniin.

Olemme jo käsitelleet pääsynmäärittäjiä edellisessä osiossa. Nyt tarkastelemme tarkemmin yleisimmin käytettyä pääsynmäärittäjää - private.

Kuten tiedät, private-pääsynmäärittäjällä kenttään/metodiin pääsee vain siinä luokassa, jossa se on määritelty. Katsotaan esimerkkiä private-määrittäjän käytöstä:

Jos emme halua, että muuttuja yhdessä luokassa on näkyvissä tai käytettävissä toisesta luokasta, voimme käyttää private-pääsynmäärittäjää:

Main.java

Main.java

copy
123456789101112131415
package 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-määrittäjällä. Kun yritämme alustaa kentän suoraan, saamme virheilmoituksen, joka kertoo, että name-kentällä on private-pääsynmäärittäjä eikä siihen voi viitata tai sitä ei voi 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

Main.java

copy
123456789101112131415161718
package 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ä käyttäen System.out.println(). Tämän kiertämiseksi voimme ylikirjoittaa toString()-metodin, jolloin kun kutsumme System.out.println(bob);, se näyttää tietoa olion kentistä. Tarkastellaan esimerkkiä:

Main.java

Main.java

copy
1234567891011121314151617181920212223
package 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 mikäkin kenttä kuuluu.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you explain more about the different access modifiers in Java?

Why is it important to hide fields and methods from other classes?

Can you show an example of using getters and setters to access private fields?

Awesome!

Completion rate improved to 2.63

bookPrivate-Muuttuja

Pyyhkäise näyttääksesi valikon

Kuinka piilottaa kentät ja metodit toiselta luokalta

Pääsynmäärittäjät (access modifiers) käytetään määrittämään muuttujien ja metodien näkyvyys ja saavutettavuus Javassa. Niiden avulla voidaan rajata jäsenen käyttöaluetta ja rajoittaa pääsyä tiettyihin luokan jäseniin.

Olemme jo käsitelleet pääsynmäärittäjiä edellisessä osiossa. Nyt tarkastelemme tarkemmin yleisimmin käytettyä pääsynmäärittäjää - private.

Kuten tiedät, private-pääsynmäärittäjällä kenttään/metodiin pääsee vain siinä luokassa, jossa se on määritelty. Katsotaan esimerkkiä private-määrittäjän käytöstä:

Jos emme halua, että muuttuja yhdessä luokassa on näkyvissä tai käytettävissä toisesta luokasta, voimme käyttää private-pääsynmäärittäjää:

Main.java

Main.java

copy
123456789101112131415
package 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-määrittäjällä. Kun yritämme alustaa kentän suoraan, saamme virheilmoituksen, joka kertoo, että name-kentällä on private-pääsynmäärittäjä eikä siihen voi viitata tai sitä ei voi 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

Main.java

copy
123456789101112131415161718
package 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ä käyttäen System.out.println(). Tämän kiertämiseksi voimme ylikirjoittaa toString()-metodin, jolloin kun kutsumme System.out.println(bob);, se näyttää tietoa olion kentistä. Tarkastellaan esimerkkiä:

Main.java

Main.java

copy
1234567891011121314151617181920212223
package 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 mikäkin kenttä kuuluu.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3
some-alt