Dlaczego główna metoda Javy jest statyczna?

Podpis metody Javy główna() metoda to:

public static void main(String[] args){
    ...
}

Czy Jest jakiś powód, aby ta metoda była statyczna?

Author: Alotor, 2008-09-28

30 answers

Metoda jest statyczna, ponieważ w przeciwnym razie byłaby niejednoznaczność: który konstruktor powinien być wywołany? Szczególnie jeśli twoja klasa wygląda tak:

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

Czy JVM powinien zadzwonić new JavaClass(int)? Co powinno przejść x?

Jeśli nie, czy JVM powinien utworzyć instancję JavaClass bez uruchamiania żadnej metody konstruktora? Myślę, że nie powinno, ponieważ będzie to szczególnie dotyczyć całej klasy-czasami masz instancję, która nie została zainicjowana i musisz ją sprawdzić w każdym metoda, którą można nazwać.

Jest zbyt wiele przypadków skrajnych i niejasności, aby JVM musiał utworzyć instancję klasy przed wywołaniem punktu wejścia. Dlatego {[4] } jest statyczny.

Nie mam pojęcia, dlaczego {[4] } jest zawsze zaznaczone public.

 297
Author: Jacob Krall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-03 11:03:16

To tylko konwencja. W rzeczywistości, nawet nazwa main () i argumenty przekazane w są czysto umowne.

Kiedy uruchamiasz Javę.exe (lub javaw.exe na Windows), To co tak naprawdę się dzieje to kilka wywołań Java Native Interface (JNI). Wywołania te ładują DLL, który jest naprawdę JVM (to prawda-java.exe nie jest JVM). JNI jest narzędziem, którego używamy, gdy musimy mostować świat Wirtualnej Maszyny i świat C, C++ itp... Prawda jest również odwrotna - nie jest to możliwe (przynajmniej z mojej wiedzy) aby faktycznie uruchomić JVM bez używania JNI.

W zasadzie java.exe jest bardzo prostą aplikacją w języku C, która parsuje wiersz poleceń, tworzy nową tablicę łańcuchów w JVM do przechowywania tych argumentów, parsuje nazwę klasy, którą podałeś jako zawierającą main (), używa wywołań JNI, aby znaleźć metodę main (), a następnie wywołuje metodę main (), przekazując w nowo utworzonej tablicy łańcuchów jako parametr. Jest to bardzo, bardzo podobne do tego, co robisz, gdy używasz odbicie od Javy - zamiast tego używa mylnie nazwanych natywnych wywołań funkcji.

Napisanie własnej wersji Javy byłoby całkowicie legalne.exe (źródło jest rozprowadzane z JDK) i niech zrobi coś zupełnie innego. W rzeczywistości, to jest dokładnie to, co robimy ze wszystkimi naszymi aplikacjami Java.

Każda z naszych aplikacji Java ma swój własny launcher. Robimy to przede wszystkim po to, aby uzyskać własną ikonę i nazwę procesu, ale przydała się w innych sytuacjach, w których chcemy zrobić coś poza regularnym wywołaniem main (), aby zacząć działać (na przykład, w jednym przypadku wykonujemy interoperacyjność COM i przekazujemy uchwyt COM do main () zamiast tablicy łańcuchowej).

Więc, długo i krótko: powodem, dla którego jest statyczny, jest B / c, który jest wygodny. Powodem, dla którego nazywa się 'main' jest to, że musiało to być coś, a main() jest tym, co robili w dawnych czasach C (i w tamtych czasach nazwa funkcji była ważna). Przypuszczam, że java.exe mogło pozwolić na podanie w pełni kwalifikowanej nazwy głównej metody, a nie tylko klasy (java com.mycompany.Foo.niektórzy specjaliści) - ale to tylko utrudnia IDE automatyczne wykrywanie klas "uruchamialnych" w projekcie.

 355
Author: Kevin Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 14:51:50

Metoda main () w C++, C# i Javie jest statyczna, ponieważ może być następnie wywoływana przez runtime engine bez konieczności tworzenia instancji instancji klasy nadrzędnej.

 173
Author: Noah Goodrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-21 07:56:58

Dlaczego public static void main (String[] args) ?

Tak projektowany jest język Java, a Java Virtual Machine jest projektowana i pisana.

Oracle Java Language Specification

Sprawdź Rozdział 12 wykonanie-sekcja 12.1.4 wywołanie testu.główna :

Wreszcie, po zakończeniu inicjalizacji testu klasy (podczas którego mogły wystąpić inne następcze Ładowanie, łączenie i inicjalizacja), główną metodą testu jest / align = "left" /

Metoda main musi być zadeklarowana jako public, static i void. Musi przyjmować pojedynczy argument, który jest tablicą łańcuchów. Metoda ta może być zadeklarowana jako

public static void main(String[] args)

Lub

public static void main(String... args)

Oracle Java Virtual Machine Specification

Zobacz Rozdział 2 koncepcje języka programowania Java-sekcja 2.17 wykonanie :

Wirtualna maszyna Javy rozpoczyna wykonywanie przez wywołanie metody main określonej klasy i przekazując jej pojedynczy argument, który jest tablicą łańcuchów. Powoduje to załadowanie określonej klasy (§2.17.2), połączenie (§2.17.3) z innymi typami, których używa i zainicjowanie (§2.17.4). Metoda main musi być zadeklarowana jako public, static i void.

Oracle OpenJDK Source

Pobierz i rozpakuj źródłowy jar i zobacz jak jest napisany JVM, sprawdź ../launcher/java.c, który zawiera natywny kod C za komend java [-options] class [args...]:

/*
 * Get the application's main class.
 * ... ...
 */
if (jarfile != 0) {
    mainClassName = GetMainClassName(env, jarfile);

... ...

    mainClass = LoadClass(env, classname);
    if(mainClass == NULL) { /* exception occured */

... ...

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                   "([Ljava/lang/String;)V");

... ...

{    /* Make sure the main method is public */
    jint mods;
    jmethodID mid;
    jobject obj = (*env)->ToReflectedMethod(env, mainClass,
                                            mainID, JNI_TRUE);

... ...

/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
if (mainArgs == NULL) {
    ReportExceptionDescription(env);
    goto leave;
}

/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

... ...
 35
Author: yorkw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-12 11:14:38

Po prostu udawajmy, że static nie będzie wymagane jako punkt wejścia aplikacji.

Klasa aplikacji wyglądałaby wtedy tak:

class MyApplication {
    public MyApplication(){
        // Some init code here
    }
    public void main(String[] args){
        // real application code here
    }
}

Rozróżnienie pomiędzy kodem konstruktora a metodą main jest konieczne, ponieważ w języku OO konstruktor upewnia się tylko, że instancja jest zainicjalizowana poprawnie. Po inicjalizacji instancja może być użyta dla zamierzonej "usługi". Umieszczenie całego kodu aplikacji w konstruktorze zepsułoby to.

Więc takie podejście wymusiłoby trzy różne kontrakty na wniosek:

  • tam musi być konstruktorem domyślnym. W przeciwnym razie JVM nie wiedziałby, który konstruktor wywołać i jakie parametry powinny być podane.
  • There must be a main method1. To nic dziwnego.
  • Klasa nie może być abstract. W przeciwnym razie JVM nie mógłby go utworzyć.

The static podejście z drugiej strony wymaga tylko jednego kontraktu:

  • musi istnieć main metoda1.

Tutaj ani abstract ani wiele konstruktorów nie ma znaczenia.

Ponieważ Java została zaprojektowana jako prosty język dla użytkownika nie dziwi fakt, że również punkt wejścia aplikacji został zaprojektowany w prosty sposób przy użyciu jednego kontraktu, a nie w sposób złożony przy użyciu trzech niezależnych i kruchych Kontrakty.

Proszę zauważyć: ten argument jest Nie o prostocie wewnątrz JVM lub wewnątrz JRE. Ten argument dotyczy prostoty dla użytkownika.


1tutaj pełny podpis liczy się tylko jako jedna umowa.
 30
Author: A.H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 14:49:30

Jeśli nie było, który konstruktor powinien być użyty, jeśli jest więcej niż jeden?

Więcej informacji na temat inicjalizacji i wykonywania programów Java można znaleźć w specyfikacji języka Java .

 13
Author: Hank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 19:51:03

Ponieważ w przeciwnym razie, musiałaby być wykonana instancja obiektu. Ale musi być wywołane od zera, bez uprzedniego konstruowania obiektu, ponieważ zwykle zadaniem funkcji main () (bootstrap) jest analizowanie argumentów i konstruowanie obiektu, zwykle za pomocą tych argumentów/parametrów programu.

 12
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 19:48:30

Przed wywołaniem głównej metody nie są tworzone żadne obiekty. Posiadanie słowa kluczowego static oznacza, że metodę można wywołać bez tworzenia żadnych obiektów.

 11
Author: BlackWasp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 19:48:09

Jakie jest znaczenie public static void main(String args[])?

  1. public jest określnikiem dostępu, co oznacza, że każdy może uzyskać do niego dostęp/wywołać, np. JVM (Java Virtual Machine.
  2. static pozwala na wywołanie main() przed utworzeniem obiektu klasy. Jest to konieczne, ponieważ main() jest wywoływane przez JVM przed stworzeniem jakichkolwiek obiektów. Ponieważ jest statyczny, może być wywołany bezpośrednio przez klasę.

    class demo {    
        private int length;
        private static int breadth;
        void output(){
            length=5;
            System.out.println(length);
        }
    
        static void staticOutput(){
            breadth=10; 
            System.out.println(breadth);
        }
    
        public static  void main(String args[]){
            demo d1=new demo();
            d1.output(); // Note here output() function is not static so here
            // we need to create object
            staticOutput(); // Note here staticOutput() function is  static so here
            // we needn't to create object Similar is the case with main
            /* Although:
            demo.staticOutput();  Works fine
            d1.staticOutput();  Works fine */
        }
    }
    

    Podobnie używamy statycznych metod zdefiniowanych przez użytkownika, aby nie do tworzenia przedmiotów.

  3. void wskazuje, że zadeklarowana metoda main() nie zwraca wartości.

  4. String[] args określa jedyny parametr w metodzie main().

    args - Parametr zawierający tablicę obiektów typu class String.

 9
Author: Isabella Engineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-24 02:34:00

Pozwól mi wyjaśnić te rzeczy w znacznie prostszy sposób:

public static void main(String args[])

Wszystkie aplikacje Java, z wyjątkiem apletów, rozpoczynają swoje wykonywanie od main().

Słowo kluczowe {[2] } jest modyfikatorem dostępu, który pozwala na wywołanie członka spoza klasy.

static jest używany, ponieważ pozwala na wywołanie main() bez konieczności tworzenia instancji konkretnej instancji tej klasy.

void oznacza, że main() nie zwraca żadnej wartości.

 9
Author: Lordferrous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 04:17:20

Aplety, midlety, serwlety i fasolki różnego rodzaju są konstruowane, a następnie mają wywoływane metody cyklu życia. Wywołanie main jest wszystkim, co kiedykolwiek robi się z klasą main, więc nie ma potrzeby, aby stan był przechowywany w obiekcie, który jest wywoływany wielokrotnie. To całkiem normalne przypinanie main do innej klasy (chociaż nie jest to świetny pomysł), co przeszkadzałoby w używaniu klasy do tworzenia głównego obiektu.

 6
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 14:53:06

To tylko konwencja, ale chyba wygodniejsza od alternatywy. Ze statycznym głównym, wszystko, co musisz wiedzieć, aby wywołać program Java, to nazwa i lokalizacja klasy. Gdyby to nie było statyczne, musiałbyś również wiedzieć, jak utworzyć instancję tej klasy lub wymagać, aby klasa miała pusty konstruktor.

 5
Author: Logan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 19:57:18

Jeśli główna metoda nie byłaby statyczna, musiałbyś utworzyć obiekt swojej głównej klasy spoza programu. Jak chcesz to zrobić?

 5
Author: micro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 22:14:11

Podczas uruchamiania maszyny wirtualnej Java (JVM) za pomocą polecenia java,

java ClassName argument1 argument2 ...

Gdy wykonujesz swoją aplikację, podajesz jej nazwę klasy jako argument polecenia java, jak wyżej

JVM próbuje wywołać główną metodę podanej klasy

- w tym momencie nie zostały utworzone żadne obiekty klasy.

Deklarowanie main jako statyczne allows JVM do invoke main without Tworzenie an instance of the klasy.

Wróćmy do komendy

ClassName jest command-line argument do JVM, który mówi mu, którą klasę wykonać. Po nazwie klasy Możesz również podać list of Strings (oddzielone spacjami) jako argumenty wiersza poleceń, które JVM przekaże Twojej aplikacji. -Takie argumenty mogą być użyte do określenia opcji (np. nazwy pliku) do uruchomienia aplikacji - dlatego w głównym

Referencje: Java™ Jak Programować (Wczesne Obiekty), Dziesiąta Edycja

 5
Author: Basheer AL-MOMANI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 09:56:54

Myślę ,że słowo kluczowe 'static' sprawia, że główna metoda jest metodą klasową, a metody klasowe mają tylko jedną kopię i mogą być współdzielone przez wszystkich, a także nie wymagają obiektu do odniesienia. Tak więc podczas kompilacji klasy driver można wywołać główną metodę. (Jestem po prostu na poziomie alfabetu Javy, sorry jeśli się mylę)

 3
Author: Aysha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-12 12:48:33

Main () jest statyczna, ponieważ; w tym momencie cyklu życia aplikacji stos aplikacji ma charakter proceduralny, ponieważ nie ma jeszcze żadnych obiektów utworzonych jako instancje.

To czysta karta. Twoja aplikacja jest uruchomiona w tym momencie, nawet bez deklarowania żadnych obiektów(pamiętaj, że istnieją procedury i wzorce kodowania oo). Ty, jako deweloper, przekształcasz aplikację w rozwiązanie obiektowe, tworząc instancje swoich obiektów i w zależności od skompilowanego kodu wewnątrz.

Zorientowanie obiektowe jest Świetne z milionów oczywistych powodów. Jednak minęły czasy, kiedy większość deweloperów VB regularnie używała słów kluczowych takich jak" goto " w swoim kodzie. "goto" jest poleceniem proceduralnym w VB, które jest zastępowane przez jego odpowiednik OO: wywołanie metody.

Można również spojrzeć na statyczny punkt wejścia (main) jako na czystą wolność. Gdyby Java była na tyle Inna, aby utworzyć instancję obiektu i przedstawić Ci tylko tę instancję podczas uruchamiania, nie miałbyś innego wyboru, jak napisać aplikacja proceduralna. Jakkolwiek niewyobrażalne może to brzmieć dla Javy, możliwe jest, że istnieje wiele scenariuszy, które wymagają podejścia proceduralnego.

To prawdopodobnie bardzo niejasna odpowiedź. Pamiętaj ,że "klasa" jest tylko zbiorem powiązanych ze sobą kodów. "Instancja" jest odosobnionym, żywym i oddychającym autonomicznym pokoleniem tej klasy.

 3
Author: hellaciousprogger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 14:37:20

Prototype public static void main(String[]) jest konwencją zdefiniowaną w JLS :

Metoda main musi być zadeklarowana jako public, static i void. Musi określać parametr formalny (§8.4.1), którego zadeklarowanym typem jest tablica łańcuchów.

W specyfikacji JVM 5.2. Uruchomienie maszyny wirtualnej możemy przeczytać:

Wirtualna maszyna Javy uruchamia się, tworząc początkową klasę, która jest określona w sposób zależny od implementacji, używając Bootstrap Klasa loader (§5.3.1). Następnie wirtualna maszyna Javy łączy klasę początkową, inicjalizuje ją i wywołuje metodę klasy publicznej void main(String[]). Wywołanie tej metody powoduje dalsze wykonanie. Wykonanie instrukcji Java virtual machine stanowiącej główną metodę może spowodować powiązanie (a w konsekwencji utworzenie) dodatkowych klas i interfejsów, a także wywołanie dodatkowych metod.

Zabawne, w specyfikacji JVM to nie wspomnij, że główna metoda musi być statyczna. Ale specyfikacja mówi również, że wirtualna maszyna Javy wykonuje 2 kroki przed :

Inicjalizacja klasy lub interfejsu polega na wykonaniu jej metody inicjalizacji klasy lub interfejsu.

W 2.9. Metody Specjalne :

A klasa lub inicjalizacja interfejsu metoda jest zdefiniowana:

Klasa lub interfejs ma co najwyżej jedną metodę inicjalizacji klasy lub interfejsu i jest inicjowana (§5.5) przez wywołanie tej metody. Metoda inicjalizacji klasy lub interfejsu ma specjalną nazwę <clinit>, nie pobiera argumentów i jest void.

I metoda inicjalizacji klasy lub interfejsu różni się od metody inicjalizacji instancji zdefiniowanej następująco:

Na poziomie wirtualnej Javy każdy konstruktor napisany w języku programowania Java (JLS §8.8) pojawia się jako metoda inicjalizacji instancji o specjalnej nazwie <init>.

Tak więc JVM inicjalizuje metodę inicjalizacji klasy lub interfejsu, a nie metodę inicjalizacji instancji , która jest w rzeczywistości konstruktorem. Nie muszą więc wspominać, że główna metoda musi być statyczna w specyfikacji JVM, ponieważ wynika to z faktu, że żadna instancja nie została utworzona przed wywołanie głównej metody.

 3
Author: alain.janinm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-14 09:37:36

[[2]} Ostatnio podobne pytanie zostało zamieszczone na Programmers.SE

  • Dlaczego statyczna metoda główna w Javie i C#, a nie konstruktor?

    Szukając ostatecznej odpowiedzi ze źródła pierwotnego lub wtórnego, dlaczego (w szczególności) Java i C# zdecydowały się na statyczną metodę jako punkt wejścia – zamiast reprezentować instancję aplikacji przez instancję klasy Application, z punktem wejścia jest odpowiednim konstruktor?

TL; DR część zaakceptowanej odpowiedzi brzmi:

W Javie powodem public static void main(String[] args) jest to, że

  1. Gosling wanted
  2. kod napisany przez kogoś doświadczonego w C (nie w Javie)
  3. do wykonania przez kogoś przyzwyczajonego do uruchamiania PostScript na NeWS

http://i.stack.imgur.com/qcmzP.png

 
Dla C# rozumowanie jest przechodnie podobne że tak powiem. Projektanci języka zachowywali składniępunktu wejścia programu znaną programistom pochodzącym z Javy. Jak to ujął C # architect Anders Hejlsberg ,

...nasze podejście do C# polega po prostu na zaoferowaniu alternatywy... do programistów Java...

...

 3
Author: gnat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 07:31:17

To tylko konwencja. JVM z pewnością poradziłby sobie z niestatycznymi głównymi metodami, gdyby taka była konwencja. W końcu możesz zdefiniować statyczny inicjalizator na swojej klasie i utworzyć instancję miliona obiektów przed przejściem do metody main ().

 2
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 20:15:22

Prawdziwym punktem wejścia do dowolnej aplikacji jest metoda statyczna. Jeżeli język Java obsługiwał metodę instancji jako "punkt wejścia", wtedy runtime musiałby zaimplementować ją wewnętrznie jako metodę statyczną, która skonstruowała instancję obiektu, a następnie wywołała metodę instancji.

Po tym, jak wyjmę to z drogi, zbadam uzasadnienie wyboru jednej z następujących trzech opcji:]}
  1. A static void main() jak widzimy to dzisiaj.
  2. przykład metoda void main() wywołana na nowo skonstruowanym obiekcie.
  3. używanie konstruktora typu jako punktu wejścia (np. jeśli Klasa wejściowa została wywołana Program, to wykonanie składałoby się z new Program()).

Podział:

static void main()

  1. wywołuje statyczny konstruktor klasy zamkniętej.
  2. wywołuje metodę statyczną main().

void main()

  1. wywołuje statyczny konstruktor obudowy klasy.
  2. konstruuje instancję klasy zamykającej poprzez efektywne wywołanie new ClassName().
  3. wywołuje metodę instancji main().

new ClassName()

  1. wywołuje statyczny konstruktor klasy zamkniętej.
  2. konstruuje instancję klasy (wtedy nic z nią nie robi i po prostu zwraca).

Uzasadnienie:

Pójdę w odwrotnej kolejności.

Należy pamiętać, że jednym z celów projektowych Javy było podkreślenie (wymagać, jeśli to możliwe) dobrych praktyk programowania zorientowanego obiektowo. W tym kontekście konstruktor obiektu inicjalizuje obiekt , ale nie powinien być odpowiedzialny za jego zachowanie. Dlatego specyfikacja, która dała punkt wyjścia new ClassName(), zmyliłaby sytuację nowych programistów Javy, wymuszając wyjątek od projektowania" idealnego " konstruktora w każdej aplikacji.

Tworząc main() metodę instancji, powyższy problem z pewnością zostanie rozwiązany. Jednak tworzy złożoność, wymagając od specyfikacji, aby wypisała podpis konstruktora klasy entry, jak również podpis metody main().

Podsumowując, podaniestatic void main() tworzy specyfikację o najmniejszej złożoności przy zachowaniu zasady umieszczania zachowania w metodach . Biorąc pod uwagę, jak proste jest zaimplementowanie metody main(), która sama konstruuje instancję klasy i wywołuje metodę instancji, nie ma rzeczywistej zaletą określenia main() jako metody instancji.

 1
Author: Sam Harwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 22:43:24

Słowo kluczowe public jest modyfikatorem dostępu, który pozwala programiście kontrolować widoczność członków klasy. Gdy członek klasy jest poprzedzony przez public, to członek może być dostępny za pomocą kodu poza klasą, w której jest zadeklarowany.

Przeciwieństwem public jest private, co uniemożliwia użycie elementu przez kod zdefiniowany poza jego klasą.

W tym przypadku {[4] } musi być zadeklarowana jako public, ponieważ musi być wywołana przez kod spoza swojej klasy, gdy program został uruchomiony.

Słowo kluczowe static pozwala main() do wywołania bez konieczności tworzenia instancji konkretnej instancji klasy. Jest to konieczne, ponieważ main() jest wywoływane przez interpreter Javy przed utworzeniem jakichkolwiek obiektów.

Słowo kluczowe void po prostu mówi kompilatorowi, że main() nie zwraca wartości.

 1
Author: Abhishek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-24 02:38:52

Static - gdy JVM wywoła metodę główną, nie ma obiektu, który istnieje dla wywołanej klasy, dlatego musi mieć statyczną metodę, aby umożliwić wywołanie z klasy.

 1
Author: Kero Fawzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 10:04:00

Nie wiem, czy JVM wywołuje główną metodę przed utworzeniem instancji obiektów... Jest jednak o wiele silniejszy powód, dla którego metoda main() jest statyczna... Gdy JVM wywoła główną metodę klasy (np. Person). przywołuje ją przez " osobę.main()". Widzisz, JVM wywołuje to po nazwie klasy. Dlatego metoda main() powinna być statyczna i publiczna, tak aby była dostępna przez JVM.

Mam nadzieję, że pomogło. Jeśli tak, daj mi znać komentując.

 1
Author: Vamsi Sangam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 14:51:05

Metody statyczne nie wymagają żadnego obiektu. Biegnie bezpośrednio, więc główne biegnie bezpośrednio.

 0
Author: c k ravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-08 11:37:40

Statyczne słowo kluczowe w głównej metodzie jest używane, ponieważ nie ma żadnych instancji, które mają miejsce w głównej metodzie. Ale obiekt jest skonstruowany, a nie wywołanie, w wyniku czego używamy statycznego słowa kluczowego w głównej metodzie. W jvm pamięć kontekstowa jest tworzona, gdy ładuje się do niej Klasa.I wszyscy statyczni członkowie są obecni w tej pamięci. jeśli teraz zrobimy główny statyczny będzie on w pamięci i może być dostępny dla JVM (class.główna(..)) więc możemy wywołać główną metodę bez potrzeby nawet need for heap został stworzony.

 0
Author: eagles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 23:51:02

Jest to po prostu konwencja, jak możemy zobaczyć tutaj:

Metoda musi być zadeklarowana jako publiczna i statyczna, nie może zwracać żadnych wartość, i musi zaakceptować tablicę łańcuchów jako parametr. Domyślnie, pierwszym argumentem niebędącym opcją jest nazwa klasy, która ma być wywołana. Należy użyć w pełni kwalifikowanej nazwy klasy. Jeśli opcja -jar jest podany, pierwszym argumentem niebędącym opcją jest nazwa archiwum jar zawierające pliki klas i zasobów dla aplikacji, z na Klasa startowa wskazywana przez nagłówek manifestu klasy głównej.

Http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description

 0
Author: Francisco Spaeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 18:13:00

public static void keywords oznacza, że interpreter Java virtual machine (JVM) może wywołać główną metodę programu, aby uruchomić program (public) bez tworzenia instancji klasy (static), a program nie zwraca danych do interpretera Java VM (void) po jej zakończeniu.

Źródło: Essentials, Part 1, Lesson 2: Building Applications

 0
Author: user1515855,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 20:03:48

Zasadniczo tworzymy te elementy danych i funkcje Członkowskie jako statyczne, które nie wykonują żadnego zadania związanego z obiektem. A w przypadku metody głównej robimy ją jako statyczną, ponieważ nie ma to nic wspólnego z obiektem, ponieważ główna metoda zawsze działa niezależnie od tego, czy tworzymy obiekt, czy nie.

 0
Author: Varun Vashista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-10 11:06:30

Każda metoda zadeklarowana jako statyczna w Javie należy do samej klasy . Ponownie statyczna metoda danej klasy może być dostępna tylko przez odwołanie się do klasy jak Class_name.method_name();

Tak więc klasa nie musi być utworzona przed uzyskaniem dostępu do statycznej metody.

Tak więc metoda main() jest zadeklarowana jako static tak, że może być dostępna bez tworzenia obiektu tej klasy.

Ponieważ zapisujemy program z nazwą klasy, w której znajduje się główna metoda( lub skąd program powinien rozpocząć swoje wykonywanie, dotyczy klas bez metody main() () (Poziom zaawansowany)). Tak więc w wyżej wymieniony sposób:

Class_name.method_name();

Główna metoda jest dostępna.

W skrócie podczas kompilacji program wyszukuje metodę main() z argumentami String, takimi jak: main(String args[]) we wspomnianej klasie(tzn. pod nazwą programu), a ponieważ na początku nie ma zakresu tworzenia instancji tej klasy, więc metoda main() jest zadeklarowana jako statyczna.

 0
Author: Sourav Saha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-24 02:40:29

Jest prosty powód, ponieważ obiekt nie jest wymagany do wywołania metody statycznej , jeśli była to metoda niestatyczna, wirtualna maszyna Javy najpierw wytworzy obiekt, a następnie wywoła metodę main (), która doprowadzi do problemu dodatkowej alokacji pamięci.

 0
Author: Jatin Kathuria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 02:18:00