• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Akcesor i mutator

Object Storage Arubacloud
0 głosów
2,744 wizyt
pytanie zadane 26 września 2016 w Java przez rubesom Obywatel (1,690 p.)
zmienione kategorie 26 września 2016 przez rubesom

Cześć

Mam problem ze zrozumieniem jak dokładnie działa geter i setter (akcesor i mutator).

     private double promien =;
 
    public void setPromien(double r)
    {
        promien = r;
    }
 
    public double getPromien()
    {
        return promien;
    }
    public static void main(String[] args) 
    {
        DefiniowanieKlas kolo = new DefiniowanieKlas();
 
        kolo.setPromien(2.0);
 
        System.out.println(kolo.getPromien());

 

Rozumiem założenia akcesora i mutatora, używach ich jak piszę jakiś prosty kod ale jest to używanie ich bez głębszego ich rozumienia.

Jak używam mutatora to zmieniam tak jakby zmienną r (jej wartośc np. na 2.0) a bazowo zmienna/pole promień jest bez zmian? I jak jest z odczytem - zwracam pole promien, a nie musze zmiennej r? Chodzi mi o to jak idą bity.

Bardzo proszę o pomoc.

1 odpowiedź

0 głosów
odpowiedź 26 września 2016 przez Rubeus024 Obywatel (1,680 p.)
wybrane 26 września 2016 przez rubesom
 
Najlepsza

Cześć,

Zmienna r jest to zmienna lokalna, która jest wywołana poprzez wartość, a nie poprzez referencję i kończy swój żywot w momencie zwijania funkcji. Znika. Ale przed zakończeniem pracy funkcji pole promien, który już zmienną lokalną nie jest, bo obiekt istnieje cały czas w programie, zmienia swoją wartość. i tak otrzymujemy to co chcieliśmy - promien został zmieniony, kopia r skasowana a to wszystko zgodnie z zasadą hermetyzacji.

Wywołując jakąkolwiek funkcję bądź metodę, parametry otrzymują kopię wartości, a nie referencję do nich. Z tego co pamiętam, to Zelent poruszył ten wątek w kursie c++.

 

 

 

komentarz 26 września 2016 przez rubesom Obywatel (1,690 p.)
Bazując na tym przykładzie - kiedy funkcja się zwinie/zniknie i zmienna r też zniknie, to czy pole/zmienna promien dalej będzie mieć zadeklarowaną wartość czy przy zniknięciu zmiennej r zmienna promien straci nadaną wartość?
komentarz 26 września 2016 przez Rubeus024 Obywatel (1,680 p.)
Nie, zmienna pole zostanie zmienione, ponieważ mamy znak przypisania = i jest to pole, które różni się tym od zmiennej lokalnej r, że istnieje przez cały czas w pamięci.

Samo słowo mutator daje obraz tego, co robią te funkcję - zmieniają, przekształcają parametry obiektu. Akcesory tylko proszą o dostęp do danych, nie zmieniając ich. Polecam Java Podstawy Cornella, tam wszystko jest dobrze wyjaśnione
komentarz 26 września 2016 przez rubesom Obywatel (1,690 p.)
Wydaje mi się, że już rozumiem ale nie wiem czemu tak się to stosuje. Możesz mi wyjaśnić czemu tak trzeba robić? Chdzi mo o to, że nie widże różnicy kiedy pole promien miało by być public a private, było by prościej zmienić jego wartość - bez używania mutatora i akcesor nie był by potrzebny. Przecież za każdym razem nadaję wartość polu promien więc po co robić to w taki sposób?

Dużo mi wyjaśnia tak jak tłumaczysz.
komentarz 26 września 2016 przez Rubeus024 Obywatel (1,680 p.)
Przy tego typu programach wydaję się to bez sensu. Jednak mając aplikację, która posiada 1000 obiektów, gdzie mamy 10000 różnych zmiennych w obiegu, jest wręcz konieczne. Nieformalny podział metod na mutatory i akcesory dają poczucie porządku i pozwoli na uniknięcie wielu błędów, które wiadomo, potrafią czasem denerwować, jeśli jest dobrze ukryty. Pozdrawiam
komentarz 26 września 2016 przez rubesom Obywatel (1,690 p.)
A możesz jeszcze mi powiedzieć jak to się dzieje, że za pomocą metody (akcesora) jestem w stanie wywołać zmienną promien - jak przbiega ten proce w sytuacji kiedy to pole jest ustwaione na private?
komentarz 26 września 2016 przez Rubeus024 Obywatel (1,680 p.)

Pamiętajmy, że akceso i mutator to tylko umowna nazwa metod, dla wygody i orientacji w kodzie. Przykładem akcesora może być ten kod:

public double getpromien()
{
    return promien;
}

Mutatory zazwyczaj są typu void, akcesory pozostałymi typami danych(pamiętajmy, że String w javie to obiekt, nie typ).

Gdy pole jest prywatne, oznacza, że tylko tylko i wyłącznie metody w klasie mają bezpośredni do nich dostęp. Chroni to na przykład przed kolizją nazw zmiennych. Załóżmy, że mamy inną klasę, która również posiada pole promien. Gdyby nie było mechanizmu ochrony danych poprzez słowo kluczowe private, kompilator nie potrafiłby określić, o który promien tak naprawdę chodzi.

komentarz 27 września 2016 przez rubesom Obywatel (1,690 p.)

Nie mogę wyświetlić bezpośrednio pola promien kiedy nie jest ono static, dla czego tak się dzieje? Z tego co napisałeś wynika, że powinienem mieć dostęp do tego pola (pomimo tego, że jest private), bo jest w tej samej klasie.

Załączam kod:

 

public class Testy2 
{


   private double promien = 1;

   public void setPromien(double r)
   {
       promien = r;
   }

   public double getPromien()
   {
       return promien;
   }
   public static void main(String[] args) 
   {
       Testy2 kolo = new Testy2();
       Testy2 kolo2 = new Testy2();

       kolo.setPromien(2.0);
       kolo2.setPromien(3);

       System.out.println(kolo.getPromien());
       System.out.println(kolo2.getPromien());
       System.out.println(promien);

   }
}

Bardzo proszę o pomoc.

komentarz 27 września 2016 przez Rubeus024 Obywatel (1,680 p.)
Gdy kompilator dochodzi do wyrażenia System.out.println(promien); traci głowę, bo nie wie, o jakie konkretne pole egzemplarzu klasy Testy2 chodzi. Egzemplarze kolo i kolo2 mają swoje zmiennie, które mają takie same nazwy. Jeżeli napiszemy  System.out.println(kolo.promien); to już wiemy konkretnie, o jakie pole i o jaki egzemplarz klasy chodzi.

 

Polecam przeorać dobre źródło do nauki(stackoverflow, ksiązka), to naprawdę uporządkuje wiadomości
komentarz 28 września 2016 przez rubesom Obywatel (1,690 p.)
edycja 28 września 2016 przez rubesom

Zamówiłem książkę do javy i z tego co widzę to będę mósiał do niej przysiąść, bo kurs który znalazłem w internecie nie odpowiada na wiele pytań.

 

A wracając jeszcze do mojego pytania. Jak to się dzieje, że ompilator nie wie o jakie wyrażenie chodzi, która część kod na to wypływa?

 

@EDIT: Wychodzi chyba moje czytanie ze zrozumieniem... Tak jak napisałeś, kiedy pole jest private to mam doniego dostęp ale poprzez metody nie bezpośrednio. I mam też dostęp do tego pola poprzez stworzony wcześniej obiekt tej klasy - dobrze rozumiem?

 

I jak traktować egzemplarz klasy - co to dokładnie jest, jak to interpretować, bo pierwszy raz spotykam się z tym pojęciem?

Domyślam się, że zaczynam już trochę męczyć ale Twoje informacje tyle mi wyjaśniają co kilka godzin jakiegoś kursu - także jestem CI bardzo wdzięczny za pomoc i mam nadzieję, że nie jest to dla Ciebie za bardzo kłopotliwe.

komentarz 1 października 2016 przez Rubeus024 Obywatel (1,680 p.)
Cześć,

Egzemplarz to inaczej obiekt klasy. A każdy obiekt ma swoje indywidualne pole, w tym przypadku promien. Analogicznie każdy człowiek(obiekt) ma swoją indywidualną wartość, na przykład ilość hemoglobiny na cm3(pole).

Ja się nie obrażam, pytaj ( tylko nie zawsze znajdę czas na odpowiedź). Cieszę się że omogłem :) Tylko wierzę, że sporo informacji jest w zasięgu ręki. Powodzenia!

Nie znaleziono podobnych pytań

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...