Pokaż wyniki 1 do 9 z 9

Temat: Zmienne w metodach klasy

  1. #1

    Domyślnie Zmienne w metodach klasy

    Mam takie pytanie teoretyczne do programistów Javy:

    Powiedzmy, że mamy klasę i w niej 2 metody. W metodzie 1 mam zadeklarowaną zmienną i nie mogę jej użyć w metodzie nr 2;

    public przed inicjacją też nie pomaga - czy to taka właściwość czy ja coś źle robię ?


    PS: Obszedłem problem poprzez przekopiowanie do zmiennej globalnej poza metodami, ale nie podoba mi się taki styl xD
    Extraterrestrial plant

  2. #2

    Domyślnie

    Zawsze mozesz zmienic na private jesli nie chcesz zeby nic oprocz klasy mialo dostep do zmiennej badz metody lub protected jesli chesz zeby zmienna badz metoda byla dzedziczona nie widze zadnego problemu...

  3. #3

    Domyślnie

    Szymkraw problem w tym, że wszystkie metody używane są w obrębie tej samej klasy.

    Jak zdeklarujesz zmienną w klasie to mają dostęp wszystkie metody tej klasy, ale jak już zdeklarujesz zmienną w metodzie to nie mogę użyć jej w innej metodzie tej samej klasy.
    Extraterrestrial plant

  4. #4

    Domyślnie

    No ale w czym Ty masz problem? ^^

  5. #5

    Domyślnie

    chyba taki, że zmienne jako publiczne/priv etc. można zadeklarować w danej klasie poza metodami. Jeśli zadeklarujesz je w metodzie klasy to będą zawsze prywatne dla tej metody i nie będą mogły ich używać inne metody tej samej klasy.
    Extraterrestrial plant

  6. #6
    Zarejestrowany
    Oct 2008
    Skąd
    woj. Lubuskie. Dokładniej się nie da
    Postów
    405

    Domyślnie

    Cytat Napisał Elitegroup Zobacz post
    chyba taki, że zmienne jako publiczne/priv etc. można zadeklarować w danej klasie poza metodami. Jeśli zadeklarujesz je w metodzie klasy to będą zawsze prywatne dla tej metody i nie będą mogły ich używać inne metody tej samej klasy.
    Ajć, skoro by było jak piszesz, oznaczałoby to że nasz przedmówca nie rozumie podstaw języków c-like i nie tylko, a mianowicie zmienne deklarowane wewnątrz bloku (w c-like między klamerkami) umierają po opuszczeniu tegoż. A skoro tak, nie wiem czy można mówić o jakimkolwiek specyfikatorze dostępu. Nie mówi się tu o prywatności czy publiczności - to po prostu zmienna lokalna.

    Jeżeli zmienna ma być widoczna poza metodą, musi być zadeklarowana na zewnątrz jej. W większości przypadków - jako składowe ("pola") klasy. Tak samo sprawa dotyczy (i podejrzewam tu jest pies pogrzebany) obiektów tworzonych w obrębie metody. One również przestają istnieć. Rozwiązaniem podejrzewam byłoby tu użycie statycznej zmiennej klasy. Ta nie znika wraz z obiektem nawet.

    Co do obejścia w edicie - dla języków najwyższego poziomu (tych z gc) nie ma pojęcia zmienna globalna (obchodzi się w postaci statycznych zmiennych w statycznej klasie). Pewnie człowiek miał na myśli zmienne będące właśnie częścią klasy. A może jednak udało mu się wykombinować rzeczywiście globalne zmienne w javie?
    Jeśli nie będziesz mieć pod górke, nigdy nie dojdziesz na szczyt.

  7. #7

    Domyślnie

    Ze zwykłą zmienną np: int nie miałbym nawet tego tematu, ale akurat jest to tablica 2D typu int i jak zadeklaruję ją globalnie:

    int[][] tab = new int[2][2];

    to potem w metodzie nie można jej przypisać tj:

    tab[][] = { 1, 2, 3, 4 } - bo wyskakuje błąd

    za to można ją zdeklarować:

    int tab[][] = { 1, 2, 3, 4 } - i wtedy jest wszystko ok...

    ... tylko, że jest zmieną metody. Napisałem, że poradziłem sobie z problemem kopiując ją do innej tablicy globalnej, ale nie podoba mi się takie programowanie xD No ale co zrobić - Java jest wszędzie i trzeba zacząć się nią płynnie posługiwać : )
    Extraterrestrial plant

  8. #8
    Zarejestrowany
    Oct 2008
    Skąd
    woj. Lubuskie. Dokładniej się nie da
    Postów
    405

    Domyślnie

    Cytat Napisał Elitegroup Zobacz post
    to potem w metodzie nie można jej przypisać tj:

    tab[][] = { 1, 2, 3, 4 } - bo wyskakuje błąd

    za to można ją zdeklarować:

    int tab[][] = { 1, 2, 3, 4 } - i wtedy jest wszystko ok...
    To co napisałeś, to inicjalizacja = więc działa w momencie inicjalizowania tablicy. Potem przypisujesz już tylko pole po polu, lub przypisujesz nową tablicę do tamtej. Swoją drogą, zmienna o której piszesz nie nazywa się "tab[][]", tylko po prostu "tab" i tab jet tablicą tablic typu int. Aby zadziałał zapis "tab[][] = { 1, 2, 3, 4 }", musiałoby wcześniej wystąpić "int tab[][]" a sama tablica nie powinna być wcześniej użyta. Poza tym sam zapis int tab[][] może nie zadziałać jak nie ma numerków. W przypadku inicjalizacji "int tab[][] = { 1, 2, 3, 4 }" on sobie wydedukuje z zawartości klamerek. Przy zapisie tab[][] = { 1, 2, 3, 4 } i nawet wcześniej przy pozostawieniu pustych int tab[][] miałby problemy w iterowaniu po elementach. Aby przypisywać wartości jakieś do pustej musiałoby wtedy być chociażby tab[][] = new tab[3][10]; i po tym jak się stworzy, można wypełniać. ALbo po prostu ja k pisałeś zrobić myk (bez odwoływania się do "globalnych")
    int temp[][]= { 1, 2, 3, 4 };
    tab = temp; //w tym miejscu w tab[][] będziesz miał to co w tablicy temp, a więc osiągniesz cel pozostawiając całość koło siebie.
    Ostatnio edytowane przez Piatkosia2010 : 07-30-2015 - 13:04
    Jeśli nie będziesz mieć pod górke, nigdy nie dojdziesz na szczyt.

  9. #9

    Domyślnie

    Ogolnie nie mam juz pojecia w czym jest problem.
    W Java masz 3 rodzaje zmiennych:
    1)Local Variables- Zmienne lokalne deklarowane w ciele metody badz w konstruktorze.
    2)Instance Variables - Zmienne deklarowane w klasie poza cialem metody i poza konstruktorem
    3)Class Variables- Tak samo jak Instance Variables ale z static

    Wiec jesli chcesz zeby zmianna czy metoda mogla byc dostepna poza jej klasa uzywasz public.
    Jesli tylko z jej klasy private. Sa inne modyfikatory chcesz to przeczytaj.
    Jesli chcesz zeby byla tylko jedna kopia danej zmiennej deklarujesz ja jako static.

    Jesli chodzi o te wszystkie modyfikatory to glownie wiaze sie to z loose coupling czyli do jakiego stopnia rozne klasy sa zalezne od siebie ale rowniez w jaki sposob zmienne powinny byc dostepne.

    Czas na glupi przyklad

    public string waznaZminenna;
    Pozniej np w konstruktorze przypisujesz jej jakas tam wartosc.
    To ze zmienna jest publiczna inna klasa moze zrobic cos takiego:
    clasa.waznaZmienna = "Admin";
    A moze ta zmienna powinna powinna byc sprawdzona pod jakims tam kontem np z "Developer" nie mozna zmienic na "Admin" etc.?
    Modifikator private wymusilby uzycie metody setWaznaZmienna w ktorej cala walidacja by sie odbywala.

    Nie widze powodu zeby zmienna lokalna mialaby w jakims celu byc dostepna poza swoim blokiem/metoda. Albo design twoj jest kompletnie do kitu albo czegos tutaj nie rozumiesz w obu przypadkach poczytaj o zmiennych w Java.

    Dobra na upartego i teoretycznie moglbys zrobic sobie hashmap<String,Object> i trzymac tam zmienne lokalne ale kazda zmienna musi miec unikalna nazwe i zmienna nie moze byc zmienna prymitywna.

    Aaa zmienne lokalne sa w trzymane w stack memory ktora jest o wiele szybsza od heap. Wymienione zmienne sa trzymane w heap oprocz local variables i to jest logiczne bo one istenieja tylka na czas dzialania metody a nie przez dzialania watku/applikacji.

    Pytania?

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj