Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Private-muuttuja | Osio
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
Java Olio-Ohjelmoinnin Perusteet

bookPrivate-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

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-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

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ä 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

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 kukin kenttä kuuluu.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 12

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 1. Luku 12
some-alt