Podpis metody metody main () Java to:
public static void main(String[] args){
...
}
Czy istnieje powód, aby ta metoda była statyczna?
Podpis metody metody main () Java to:
public static void main(String[] args){
...
}
Czy istnieje powód, aby ta metoda była statyczna?
Odpowiedzi:
Metoda jest statyczna, ponieważ w przeciwnym razie pojawiłaby się dwuznaczność: który konstruktor powinien zostać wywołany? Zwłaszcza 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)
? Na co powinien przejść x
?
Jeśli nie, to czy JVM powinien utworzyć instancję JavaClass
bez uruchamiania żadnej metody konstruktora? Myślę, że nie powinno tak być, ponieważ w szczególny sposób zajmie się to cała twoja klasa - czasami masz instancję, która nie została zainicjowana i musisz ją sprawdzić za pomocą każdej metody, którą można wywołać.
Jest zbyt wiele przypadków krawędzi i niejednoznaczności, aby JVM musiało tworzyć instancję klasy przed wywołaniem punktu wejścia. Dlatego main
jest statyczny.
Nie mam pojęcia, dlaczego main
zawsze jest zaznaczony public
.
public static void main
służy jako znacznik punktu wejścia - publiczny konstruktor bez parametrów nie krzyczy „To prawdopodobnie punkt wejścia!” w ten sam sposób.
main
do której należy zadzwonić. Co dziwne (dla ciebie), JVM dobrze sobie z tym radzi.
To tylko konwencja. W rzeczywistości nawet nazwa main () i przekazane argumenty są czysto konwencjonalne.
Po uruchomieniu java.exe (lub javaw.exe w systemie Windows) tak naprawdę dzieje się kilka wywołań Java Native Interface (JNI). Te wywołania ładują bibliotekę DLL, która tak naprawdę jest JVM (to prawda - java.exe NIE JVM). JNI to narzędzie, którego używamy, gdy musimy łączyć świat maszyn wirtualnych, świat C, C ++ itp. Odwrotność jest również prawdą - nie jest możliwe (przynajmniej o ile wiem) uzyskanie JVM działa bez użycia JNI.
Zasadniczo java.exe to bardzo prosta aplikacja C, która analizuje wiersz poleceń, tworzy nową tablicę String w JVM do przechowywania tych argumentów, analizuje nazwę klasy określoną jako zawierającą main (), używa wywołań JNI do znalezienia sama metoda main (), a następnie wywołuje metodę main (), przekazując nowo utworzoną tablicę ciągów jako parametr. Jest to bardzo, bardzo podobne do tego, co robisz, gdy używasz odbicia od Javy - zamiast tego używa tylko mylących nazw natywnych wywołań funkcji.
Byłoby całkowicie legalne, aby napisać własną wersję pliku java.exe (źródło jest rozpowszechniane z JDK) i pozwolić mu zrobić coś zupełnie innego. W rzeczywistości to właśnie robimy ze wszystkimi naszymi aplikacjami opartymi na Javie.
Każda z naszych aplikacji Java ma własny program uruchamiający. Robimy to przede wszystkim, aby uzyskać własną ikonę i nazwę procesu, ale przydało się to w innych sytuacjach, w których chcemy zrobić coś poza zwykłym wywołaniem main (), aby uruchomić rzeczy (na przykład w jednym przypadku robimy Współdziałanie COM, i faktycznie przekazujemy uchwyt COM do main () zamiast tablicy łańcuchów).
Tak długo i krótko: powodem, dla którego jest statyczny, jest b / c to wygodne. Powodem jest to, że nazywa się to „main”, ponieważ musiało to być coś, a main () jest tym, co robili w dawnych czasach C (w tamtych czasach nazwa funkcji była ważna). Przypuszczam, że java.exe mógł pozwolić ci tylko na podanie w pełni kwalifikowanej nazwy głównej metody, a nie tylko na klasę (java com.mycompany.Foo.someSpecialMain) - ale to tylko utrudnia IDE automatyczne wykrywanie „ uruchamialne ”klasy w projekcie.
java.exe
)
static
aby main()
deklaracja była tylko dla celów konwencji. Fakt, że jest to „main ()”, a nie coś innego, jest jednak wykonalny.
main
niestatycznym i nadal mieszczącym się w granicach języka. Bez odpowiedzi od projektantów będziemy musieli zgodzić się z tym. :)
main()
Metoda C++
, C#
i Java
są statyczne
Ponieważ mogą one być następnie wywołany przez silnik wykonawczego bez konieczności wystąpienia jakichkolwiek przedmiotów następnie kod w ciele main()
zrobi resztę.
public static void main...
, dlaczego nie może być tak, że klasa punktu wejścia aplikacji powinna mieć domyślnego publicznego konstruktora?
static void main
telefon jest przeciążony ? Nie ma problemu.
static
metody takie jak main
często używają new
do stworzenia takiego obiektu.
Tak zaprojektowano język Java, a wirtualną maszynę Java zaprojektowano i napisano.
Sprawdź rozdział 12 Wykonanie - rozdział 12.1.4 Wywołanie testu. Główne :
Wreszcie po zakończeniu inicjalizacji testu klasy (podczas którego mogły wystąpić inne kolejne ładowanie, łączenie i inicjowanie), wywoływana jest metoda główna testu.
Metoda main musi być zadeklarowana jako publiczna, statyczna i nieważna. Musi zaakceptować pojedynczy argument, który jest tablicą ciągów. Metodę tę można zadeklarować jako jedną z nich
public static void main(String[] args)
lub
public static void main(String... args)
Sprawdź Rozdział 2 Pojęcia dotyczące języka programowania Java - Część 2.17 Wykonanie :
Wirtualna maszyna Java rozpoczyna wykonywanie, wywołując metodę main określonej klasy i przekazując jej pojedynczy argument, który jest tablicą ciągów. Powoduje to załadowanie określonej klasy (§2.17.2), połączenie (§2.17.3) z innymi używanymi typami i zainicjowanie (§2.17.4). Metoda main musi być zadeklarowana jako publiczna, statyczna i nieważna.
Pobierz i rozpakuj źródłowy słoik i zobacz, jak napisana jest JVM, sprawdź ../launcher/java.c
, który zawiera natywny kod C za poleceniem 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);
... ...
main
nie była statyczna, oznacza to, że stan instancji klasy musi być znany, a jego zdefiniowanie jest znacznie bardziej skomplikowane, podobnie jak tego, który konstruktor powinien zastosować jako pierwszy.
public static void main(String arguments[])
- Odniesienie: specyfikacja Oak 0.2 .
Runnable
. Reprezentacja całego procesu w ten sam sposób (tj. Runnable.Run
Jako punkt wejścia) zdecydowanie ma sens w Javie. Oczywiście Runnable
sama w sobie jest prawdopodobnie wadą projektową, ponieważ Java nie ma (jeszcze) anonimowych metod. Ale skoro już tam jest…
Udawajmy, że static
nie byłby wymagany jako punkt wejścia aplikacji.
Klasa aplikacji wyglądałaby wtedy następująco:
class MyApplication {
public MyApplication(){
// Some init code here
}
public void main(String[] args){
// real application code here
}
}
Różnica między kodem konstruktora a main
metodą jest konieczna, ponieważ w OO konstruktor upewnia się tylko, że instancja jest poprawnie zainicjowana . Po inicjalizacji instancja może zostać użyta dla zamierzonej „usługi”. Umieszczenie pełnego kodu aplikacji w konstruktorze zepsułoby to.
Podejście to wymusiłoby na aplikacji trzy różne umowy:
main
metoda 1 . Ok, to nie jest zaskakujące.abstract
. W przeciwnym razie JVM nie może go utworzyć.Z static
drugiej strony podejście wymaga tylko jednej umowy:
main
metoda 1 .Tutaj nie ma znaczenia abstract
ani wiele konstruktorów.
Ponieważ Java została zaprojektowana jako prosty język dla użytkownika, nie jest zaskakujące, że również punkt wejścia aplikacji został zaprojektowany w prosty sposób przy użyciu jednej umowy, a nie w skomplikowany sposób przy użyciu trzech niezależnych i kruchych umów.
Uwaga: ten argument to nie dotyczy prostoty w JVM ani w JRE. Ten argument dotyczy prostoty użytkownika .
main
metoda, która jest public
, static
i ma podpis void main(String[])
. Zgadzam się, że gdyby metoda była metodą instancji, środowisko JRE miałoby nieco więcej pracy, ale rodzaj pracy byłby taki sam, a złożoność nie byłaby znacząco wyższa (patrz dyskusje w komentarzach do poprzedniej odpowiedzi). Nie sądzę, aby ta różnica stanowiła podstawę do ustalenia statycznego punktu wejścia, w szczególności dlatego, że istnieją wymagane metody rozstrzygania metody instancji i są one z łatwością użyteczne.
static public main(String[])
metoda jest jednym podpisem, a zatem jedną umową. W przeciwnym razie należy przestrzegać trzech niezależnych umów.
Runnable
. Oczywiście Java oczekuje, że programiści będą przestrzegać tej umowy przez cały czas, dlaczego miałaby to być zbyt duża wartość dla punktu wejścia aplikacji? To nie ma sensu.
Thread
i Runnable
sprawa nic nie jest ukryte przed użytkownikiem, może wyraźnie zobaczyć, co się dzieje i ma on zmianę do realizacji tylko te kontrakty, które mu odpowiadają - on jest pod kontrolą, a nie system.
Jeśli nie, to jakiego konstruktora należy użyć, jeśli jest więcej niż jeden?
Więcej informacji na temat inicjowania i wykonywania programów Java dostępnych jest w specyfikacji języka Java .
Przed wywołaniem głównej metody żadne obiekty nie są tworzone. Posiadanie statycznego słowa kluczowego oznacza, że można wywołać metodę bez wcześniejszego tworzenia jakichkolwiek obiektów.
Ponieważ w przeciwnym razie musiałaby zostać wykonana instancja obiektu. Należy go jednak wywołać od zera, bez konstruowania obiektu, ponieważ zwykle zadaniem funkcji main () (bootstrap) jest parsowanie argumentów i konstruowanie obiektu, zwykle przy użyciu tych parametrów argumentów / programu.
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ą wykonywanie od main()
.
Słowo kluczowe public
jest modyfikatorem dostępu, który umożliwia wywoływanie członka spoza klasy.
static
jest używana, ponieważ pozwala main()
na wywołanie bez konieczności tworzenia instancji określonej instancji tej klasy.
void
wskazuje, że main()
nie zwraca żadnej wartości.
Co to znaczy public static void main(String args[])
?
public
jest specyfikatorem dostępu, co oznacza, że każdy może uzyskać do niego dostęp / wywołać go, na przykład JVM (Java Virtual Machine.static
pozwala main()
na wywołanie przed utworzeniem obiektu klasy. Jest to konieczne, ponieważ main()
JVM wywołuje je przed utworzeniem jakichkolwiek obiektów. Ponieważ jest statyczny, można go bezpośrednio wywoływać za pośrednictwem klasy.
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, czasami używamy statycznego dla metod zdefiniowanych przez użytkownika, więc nie musimy tworzyć obiektów.
void
wskazuje, main()
że zadeklarowana metoda nie zwraca wartości.
String[] args
określa jedyny parametr w main()
metodzie.
args
- parametr zawierający tablicę obiektów typu klasy String
.
Aplety, midlety, serwlety i fasola różnego rodzaju są konstruowane, a następnie wywoływane są metody cyklu życia. Wywołanie main jest wszystkim, co kiedykolwiek zrobiono klasie głównej, więc nie ma potrzeby utrzymywania stanu w obiekcie, który jest wywoływany wiele razy. Przypinanie main na innej klasie jest dość normalne (choć nie jest to świetny pomysł), co utrudniałoby wykorzystanie klasy do utworzenia głównego obiektu.
To tylko konwencja, ale prawdopodobnie wygodniejsza niż alternatywa. W przypadku statycznego elementu głównego wszystko, co musisz wiedzieć, aby wywołać program Java, to nazwa i lokalizacja klasy. Gdyby nie był statyczny, musiałbyś również wiedzieć, jak utworzyć instancję tej klasy lub wymagać, aby klasa miała pusty konstruktor.
Po uruchomieniu maszyny wirtualnej Java (JVM) za pomocą java
polecenia
java ClassName argument1 argument2 ...
Kiedy wykonujesz aplikację, podajesz jej nazwę klasy jako argument polecenia java, jak wyżej
JVM próbuje wywołać główną metodę określonej klasy
—W tym momencie nie utworzono żadnych obiektów klasy.
Deklarowanie
main
jako statyczneallows
JVM doinvoke
mainwithout
tworzeniainstance
klasy.
wróćmy do polecenia
ClassName
jest command-line argument
dla JVM, która informuje, którą klasę wykonać. Po nazwie klasy można również określić list of Strings
(oddzielone spacjami) jako argumenty wiersza polecenia, które JVM przekaże aplikacji. - Tych argumentów można użyć do określenia opcji (np. Nazwa pliku) w celu uruchomienia aplikacji - dlatego istnieje parametr o nazwieString[] args
w głównym
Odnośniki: Java ™ How to Program (Early Objects), wydanie dziesiąte
Ostatnio podobne pytanie zostało opublikowane na Programmers.SE
Szukając ostatecznej odpowiedzi z pierwotnego lub wtórnego źródła, dlaczego (zwłaszcza) Java i C # zdecydowały się na metodę statyczną jako swój punkt wejścia - zamiast reprezentować instancję aplikacji przez instancję
Application
klasy, przy czym punktem wejścia jest odpowiedni konstruktor?
TL; DR część zaakceptowanej odpowiedzi to:
Przyczyną tego
public static void main(String[] args)
jest Java
- Gąsiątko chciał
- kod napisany przez kogoś znającego język C (nie Java)
- do wykonania przez osobę przyzwyczajoną do uruchamiania PostScript na NeWS
W przypadku C # rozumowanie jest tranzytowo podobne, że tak powiem. Projektanci języków znali składnię punktów wejścia programu znaną programistom pochodzącym z Javy. Jak to ujął architekt C #, Anders Hejlsberg ,... naszym podejściem do C # było po prostu zaoferowanie alternatywy ... dla programistów Java ...
...
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ólne dla wszystkich, a także nie wymagają obiektu do odniesienia. Tak więc po skompilowaniu klasy sterownika można wywołać główną metodę. (Jestem tylko na poziomie alfabetu java, przepraszam, jeśli się mylę)
main () jest statyczny, ponieważ; na tym etapie cyklu życia aplikacji stos aplikacji ma charakter proceduralny, ponieważ nie utworzono jeszcze żadnych obiektów.
To czyste konto. Twoja aplikacja działa w tym momencie, nawet bez zadeklarowania żadnych obiektów (pamiętaj, że istnieją wzorce kodowania OO). Ty, jako programista, przekształcasz aplikację w rozwiązanie obiektowe, tworząc instancje swoich obiektów i zależnie od skompilowanego kodu.
Zorientowanie obiektowe jest świetne z milionów oczywistych powodów. Jednak minęły czasy, kiedy większość programistów VB regularnie używała w swoim kodzie słów kluczowych, takich jak „goto”. „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 (główny) jako czystą wolność. Gdyby Java była na tyle inna, że tworzyła obiekt i przedstawiała ci tylko tę instancję podczas uruchamiania, nie miałbyś wyboru ALE, aby napisać aplikację proceduralną. Choć może się to wydawać niewyobrażalne dla Javy, istnieje wiele scenariuszy, które wymagają podejścia proceduralnego.
To prawdopodobnie bardzo niejasna odpowiedź. Pamiętaj, że „klasa” to tylko zbiór powiązanych ze sobą kodów. „Instancja” to izolowane, żyjące i oddychające autonomiczne pokolenie tej klasy.
main
osiągnięciem jest utworzonych wiele obiektów . A jeśli do klasy zawierającej konstruktor statyczny zostanie dołączony konstruktor statyczny, zostanie on main
również wykonany przedtem .
Protoype public static void main(String[])
to konwencja zdefiniowana w JLS :
Metoda main musi być zadeklarowana jako publiczna, statyczna i nieważna. Musi określać parametr formalny (§ 8.4.1), którego zadeklarowanym typem jest tablica Ciąg.
W specyfikacji JVM 5.2. Uruchomienie maszyny wirtualnej możemy przeczytać:
Wirtualna maszyna Java uruchamia się, tworząc klasę początkową, która jest określana w sposób zależny od implementacji, przy użyciu programu ładującego klasy bootstrap (§ 5.3.1). Maszyna wirtualna Java następnie łączy klasę początkową, inicjuje ją i wywołuje metodę klasy publicznej void main (String []) . Wywołanie tej metody prowadzi do dalszego wykonywania. Wykonywanie instrukcji maszyny wirtualnej Java stanowiących główną metodę może powodować łączenie (aw konsekwencji tworzenie) dodatkowych klas i interfejsów, a także wywoływanie dodatkowych metod.
Zabawne, że w specyfikacji JVM nie wspomina się, że główna metoda musi być statyczna. Ale specyfikacja mówi również, że wirtualna maszyna Java wykonuje 2 kroki przed:
Inicjalizacja klasy lub interfejsu polega na wykonaniu metody inicjalizacji klasy lub interfejsu.
Klasy lub inicjalizacji interfejsu Metoda jest określona:
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 przyjmuje żadnych argumentów i jest nieważna.
Oraz klasa lub inicjowania interfejsu sposób różni się od sposobu przykład inicjalizacji zdefiniowane w następujący sposób:
Na poziomie wirtualnej maszyny Java każdy konstruktor napisany w języku programowania Java (JLS §8.8) pojawia się jako metoda inicjalizacji instancji o specjalnej nazwie
<init>
.
Zatem JVM inicjuje klasę lub metodę inicjalizacji interfejsu, a nie metodę inicjowania instancji, która w rzeczywistości jest konstruktorem. Nie muszą więc wspominać, że główna metoda musi być statyczna w specyfikacji JVM, ponieważ wynika to z faktu, że przed wywołaniem metody głównej nie są tworzone żadne instancje.
Słowo public
kluczowe jest modyfikatorem dostępu, który pozwala programiście kontrolować widoczność członków klasy. Kiedy członek klasy jest poprzedzony public
, dostęp do tego członka można uzyskać za pomocą kodu spoza klasy, w której został zadeklarowany.
Przeciwieństwem public
jest w stanie private
, który zapobiega człon przed użyciem przez kod określony zewnątrz tej klasy.
W takim przypadku main()
należy zadeklarować jako public
, ponieważ musi zostać wywołany przez kod poza swoją klasą podczas uruchamiania programu.
Słowo kluczowe static
pozwala
main()
na wywołanie bez konieczności tworzenia określonej instancji klasy. Jest to konieczne, ponieważ main()
jest wywoływane przez interpreter Java przed utworzeniem jakichkolwiek obiektów.
Słowo kluczowe void
po prostu informuje kompilator, że main()
nie zwraca wartości.
Prawdziwym punktem wejścia do dowolnej aplikacji jest metoda statyczna. Jeśli język Java obsługuje metodę instancji jako „punkt wejścia”, środowisko wykonawcze musiałoby zaimplementować ją wewnętrznie jako metodę statyczną, która zbudowała instancję obiektu, a następnie wywołała metodę instancji.
W ten sposób zbadam uzasadnienie wyboru jednej z następujących trzech opcji:
static void main()
tak jak to dzisiaj widzimy.void main()
wywołana na świeżo skonstruowanym obiekcie.Program
, wówczas wykonanie będzie efektywne new Program()
).static void main()
main()
.void main()
new ClassName()
.main()
.new ClassName()
Pójdę w odwrotnej kolejności do tego.
Należy pamiętać, że jednym z celów projektowych Java było podkreślenie (wymaganie, gdy to możliwe) dobrych praktyk programowania obiektowego. W tym kontekście konstruktor obiektu inicjuje obiekt, ale nie powinien być odpowiedzialny za zachowanie obiektu. Dlatego specyfikacja, która podała punkt wejścia, wprowadziłaby w new ClassName()
błąd sytuację nowych programistów Java, wymuszając wyjątek od projektu „idealnego” konstruktora dla każdej aplikacji.
Dzięki stworzeniu main()
metody instancji powyższy problem z pewnością został rozwiązany. Jednak komplikuje to wymaganie, aby specyfikacja wymieniała podpis konstruktora klasy wejściowej, a także podpis main()
metody.
Podsumowując, określenie specyfikacji static void main()
tworzy najmniej skomplikowaną specyfikację przy jednoczesnym zachowaniu zasady umieszczania zachowania w metodach . Biorąc pod uwagę, jak łatwo jest wdrożyć main()
metodę, która sama konstruuje instancję klasy i wywołuje metodę instancji, nie ma prawdziwej przewagi nad określeniem jej main()
jako metody instancji.
main
. Twoje uzasadnienie, że main
jesteś zbyt skomplikowany dla początkujących, wydaje się niewiarygodne. W rzeczywistości, statyczność main
jest bardzo myląca dla początkujących, wątpię, by konstruktor byłby bardziej. Mówisz, że „konstruktor nie powinien być odpowiedzialny za zachowanie obiektu”. Brzmi interesująco, ale nie jestem pewien, czy się zgodziłbym. Dlaczego nie Co temu zapobiega?
static - Gdy JVM wywołuje metodę główną, nie istnieje żaden obiekt dla wywoływanej klasy, dlatego musi mieć metodę statyczną, aby umożliwić wywołanie z klasy.
Nie wiem, czy JVM wywołuje metodę główną przed utworzeniem instancji obiektów ... Ale istnieje znacznie silniejszy powód, dla którego metoda main () jest statyczna ... Kiedy JVM wywołuje metodę główną klasy (powiedzmy , Osoba). wywołuje go przez „ Person.main () ”. Widzisz, JVM wywołuje go według nazwy klasy. Dlatego metoda main () ma być statyczna i publiczna, aby JVM mógł uzyskać do niej dostęp.
Mam nadzieję, że to pomogło. Jeśli tak, daj mi znać, komentując.
Użyto statycznego słowa kluczowego w metodzie głównej, ponieważ w metodzie głównej nie ma żadnej instancji. Ale obiekt jest skonstruowany, a nie wywołanie, dlatego w głównej metodzie używamy statycznego słowa kluczowego. W kontekście jvm pamięć jest tworzona po załadowaniu do niej klasy i wszystkie statyczne elementy są w niej zapisane. jeśli zrobimy główny statyczny teraz, będzie on w pamięci i może być dostępny dla jvm (class.main (..)), abyśmy mogli wywołać główną metodę bez potrzeby tworzenia nawet sterty.
To tylko konwencja, jak widzimy tutaj:
Metodę należy zadeklarować jako publiczną i statyczną , nie może zwracać żadnej wartości i musi zaakceptować tablicę String jako parametr. Domyślnie pierwszym nie-opcyjnym argumentem jest nazwa klasy, która ma zostać wywołana. Należy użyć w pełni kwalifikowanej nazwy klasy. Jeśli podano opcję -jar, pierwszym argumentem nie będącym opcją jest nazwa archiwum JAR zawierającego klasę i pliki zasobów dla aplikacji, przy czym klasa startowa jest wskazywana przez nagłówek manifestu klasy głównej.
http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description
Publiczne słowa kluczowe void static oznaczają, że interpreter wirtualnej maszyny Java (JVM) może wywoływać główną metodę programu w celu uruchomienia programu (public) bez tworzenia instancji klasy (static), a program nie zwraca danych do interpretera Java VM (nieważne) kiedy się kończy.
Zasadniczo tworzymy CZŁONKÓW DANYCH i FUNKCJE CZŁONKOWSKIE jako STATYCZNE, które nie wykonują żadnego zadania związanego z obiektem. W przypadku metody głównej robimy to jako STATIC, ponieważ nie ma to nic wspólnego z przedmiotem, ponieważ główna metoda zawsze działa niezależnie od tego, czy tworzymy obiekt, czy nie.
Każda metoda zadeklarowana jako statyczna w Javie należy do samej klasy. Ponownie można uzyskać dostęp do metody statycznej określonej klasy tylko poprzez odwołanie się do klasy podobnejClass_name.method_name();
Dlatego nie trzeba tworzyć instancji klasy przed uzyskaniem dostępu do metody statycznej.
Tak więc metoda main () jest zadeklarowana jako static
umożliwiająca dostęp do niej bez tworzenia obiektu tej klasy.
Ponieważ zapisujemy program z nazwą klasy, w której obecna jest metoda główna (lub od której program powinien rozpocząć wykonywanie, dotyczy klas bez main()
metody () (poziom zaawansowany)). Tak więc w wyżej wymieniony sposób:
Class_name.method_name();
główna metoda jest dostępna.
W skrócie, gdy program jest kompilowany, szuka main()
metody zawierającej String
argumenty takie jak: main(String args[])
we wspomnianej klasie (tj. Według nazwy programu), a ponieważ na początku nie ma zasięgu, aby utworzyć tę klasę, więc main () metoda jest zadeklarowana jako statyczna.
Ze strony java.sun.com (więcej informacji na stronie):
Główna metoda jest statyczna, aby dać interpreterowi VM VM sposób na uruchomienie klasy bez uprzedniego utworzenia instancji klasy kontrolnej. Instancje klasy kontrolnej są tworzone w metodzie głównej po uruchomieniu programu.
Rozumiałem zawsze po prostu, że główną metodę, podobnie jak każdą metodę statyczną, można wywołać bez tworzenia instancji powiązanej klasy, umożliwiając jej uruchomienie przed czymkolwiek innym w programie. Gdyby nie był statyczny, musiałbyś utworzyć instancję obiektu przed jego wywołaniem - co stwarza problem z kurczakiem i jajkiem, ponieważ główna metoda jest generalnie tym, czego używasz do tworzenia instancji obiektów na początku programu.
Runnable
) w Javie zrobić wykorzystać ten projekt. Dlaczego (pozorny) wyjątek tutaj?