2013-07-17 14 views
11

Kiedy czytałem książkę o Jawie, widziałem jeden przykład napisany w ten sposób. I zastanawiam się, czy mogę zadeklarować zmienną poza główną metodą? Jaka jest różnica między deklarowaniem zmiennej poza i wewnątrz głównej metody? jaka jest tutaj rola "statyczna"? Proszę mi to wytłumaczyć? Jestem nowy w Javie.jaka jest różnica między deklarowaniem zmiennej z metody głównej a metodą główną?

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 
    } 

Pozdrawiamy.

Odpowiedz

12

1) Wewnątrz vs zewnętrzny:

Jeśli zadeklarować swój obiekt wewnątrz się sposób, to będzie widoczne tylko w tej metodzie. Zasadniczo, jeśli umieścisz wokół niego nawiasy klamrowe, będą one widoczne tylko w tych nawiasach.

Jeśli zadeklarować swój obiekt poza metody (wewnątrz klasy), to zależy od access modifier.
Domyślnie jest widoczny/dostępny z poziomu tej klasy i całego pakietu.

2) Statyczne

statyczne oznacza, że ​​ten cel/zmiennego należy do samej klasy, a nie do jego obiektów.

Przykład:

public class Members { 

    static int memberCount; 

    public Members() { 
    memberCount++; 
    } 
} 

memberCount istnieje tylko raz, bez względu na to, jak istnieje wiele obiektów tej klasy. (nawet przed utworzeniem jakiegokolwiek obiektu!)

Za każdym razem, gdy tworzysz nowy Obiekt Members, zwiększa się memberCount. Teraz możesz uzyskać do niego dostęp w następujący sposób: Members.memberCount

3

Zgłaszanie zmiennej w metodzie głównej spowoduje jej udostępnienie tylko w głównej. Zgłoszenie zmiennej poza nią spowoduje udostępnienie jej wszystkim metodom tej klasy, w tym głównej.

przykład:

public class Foo { 
    private String varOne = "Test"; 

    public void testOne() { 
    System.out.println(varOne); 
    System.out.println(varTwo); // Error, this variable is available in the testTwo method only 
    } 

    public void testTwo() { 
    String varTwo = "Bar"; 
    System.out.println(varOne); // Will display "Test" 
    System.out.println(varTwo); // Will display "Bar" 
    } 
} 
+0

poza klasą do innych klas w tym samym pakiecie też – nachokk

+1

@nachokk: właśnie w tym przypadku. To zależy od specyfikatora dostępu. – pratZ

+1

Ten kod nie zostanie skompilowany, ponieważ 'varOne' jest niestatyczny, więc nie można uzyskać do niego dostępu ze statycznej metody' main() '. – bcsb1001

1

istnieje różnica zakresu. I musisz zadeklarować to jako statyczne, ponieważ twoja główna funkcja jest statyczna, więc pozwala ci używać tylko zmiennych statycznych. Zmienna, która deklaruje wewnętrzną metodę główną, byłaby używana tylko w metodzie głównej.

Teraz możesz się zastanawiać, dlaczego muszę mieć główną metodę jako statyczną !!! Ponieważ jakakolwiek aplikacja w java będzie uruchamiana z głównej metody, może być wywołana tylko przez nazwę klasy bez tworzenia żadnego obiektu, więc definiujemy ją jako statyczną. Wszystkie metody statyczne mogą wywoływać z odwołaniem do klasy, bez potrzeby szukania obiektu.

+0

Dzięki, że było jasne. –

1

Różnica polega na tym, że Twój an_integer ma więcej możliwości.

Przykład, jeśli masz inną metodę.

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 

     public void anotherMethod(){ 
     an_integer++; 
     } 


    } 

Jak oświadczył

<default package> int an_integer=0;

Wszystkie clases w tym samym opakowaniu ma dostęp do tej zmiennej.

+0

Dzięki, że było jasne –

+0

Zapraszamy, rozważ zaakceptowanie jakiejkolwiek odpowiedzi i przegłosowanie tych, którzy pozwalają ci zrozumieć :) – nachokk

1

To, do czego się odnosisz, to zakres zmiennej.

Zmienne wewnątrz metody są dostępne tylko wewnątrz tej metody, tj an_integer wewnątrz main -method nie można odwoływać się poza metody main. Zmienne mogą mieć nawet węższe zakresy, np. Wewnątrz pętli. Klasyczna zmienna iterująca pętli for jest dostępna tylko w jego pętli, a następnie zniknie.

Metody zewnętrzne zmiennych są to pola wywoływane. To zależy od modyfikatora dostępu, gdzie można go zobaczyć. Private pola są dostępne tylko w tej klasie, public pola są dostępne z dowolnego miejsca (inne modyfikatory dostępu to protected i żadne, które domyślnie jest cofane). Zasadniczo, możesz użyć pola wewnątrz klasy, aby uzyskać dostęp do jego wartości z każdej metody w tej klasie, jednak może to być niebezpieczne, jeśli wiele wątków uzyska dostęp do tego samego wystąpienia klasy, ale jest to zupełnie inna historia.

Pole i zmienna lokalna mogą mieć tę samą nazwę, co może prowadzić do zamieszania. Generalnie wolałbym tego nie robić, a może lepiej, zawsze odwołuję się do pól z akcesorem this. Nie jestem pewny, czy preferowane są zmienne lokalne w porównaniu z polami o tej samej nazwie, ale domyślam się, że zmienne lokalne mają wyższy priorytet przy ustalaniu, który z nich jest przeznaczony. Pola

Static oznaczają, że ta zmienna nie należy do klasy, ale do samej klasy. Static pola (i metody) mogą być odczytywane (lub przywoływane) bez konieczności inicjalizacji klasy. Przykładem może być standardowa wartość klasy, a może współczynnik czynnikowy (jeśli jest to metoda). Pola Static mogą się również przydać w przypadku stałych, wraz z modyfikatorem final. Pole public final static jest prawie stałą globalną.

3

Jestem zaintrygowany, nikt nie wspomniał o sprawach związanych z pamięcią. Wiele lat temu, tworzenie instancji w main() przypisywałoby zmienną do stosu, a inicjowanie jej na podstawie głównej powodowało przydzielenie zmiennej do sterty. W tamtych czasach systemy miały bardzo małe stosy, więc nie sprawdzanie tych szczegółów powodowałoby bardzo łatwą przepełnienie stosu. Nie jestem jednak ekspertem od architektury pamięci, chciałbym, żeby ktoś mógł przyczynić się do tego subtelnego szczegółu, tak jak ma to zastosowanie w obecnej architekturze SW/pamięci.

Powiązane problemy