2012-07-18 11 views
67

Jestem trochę nowy w tym, więc wytrzymaj ze mną. Obecnie uczę się C# i Java i jednym z ich podobieństw jest to, że główna funkcja musi być zamknięta w klasie. Na przykład:Wiele głównych funkcji

public class HelloWorld { 
    public static void main(String[] args) { 
     // Some Code 
    } 
} 

Teraz rozumiem, że główny często jest "punktem wejścia" podczas uruchamiania programu. Zasadniczo twój program rozpocznie wykonywanie, gdziekolwiek jest główna funkcja. Ale wierzę w oba języki, że możesz mieć wiele głównych funkcji w obrębie wielu klas. Więc kiedy kompiluję projekt z wieloma głównymi funkcjami, gdzie jest "punkt wejścia"? W jaki sposób kompilator wie, od czego zacząć?

+13

Odpowiedź jest różna dla każdego języka. –

Odpowiedz

54

W .NET można zdefiniować, która klasa zawiera główną metodę, której chcesz używać podczas kompilacji.

http://msdn.microsoft.com/en-us/library/x3eht538.aspx

W Javie, jeśli łączenie do słoika, można zdefiniować punkt wejścia w manifeście słoika za.

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

+9

Jestem zaskoczony, że to najczęściej głosowano za odpowiedź. Przynajmniej dla Java odpowiedzi z Code-Guru i @CosmicComputer wydają się bardziej odpowiednie dla większości ludzi. Powiedziałbym, że bardzo niewielu programistów, z wyjątkiem kilku "wykonalnych" słoików wysyłkowych, zawsze używa metody manifestu. –

+3

@GeorgeHawkins wydaje mi się, że jest to jedyna odpowiedź, która odpowiada na pytanie dla obu języków, chociaż dla _Java_ to chyba nie najlepsza odpowiedź. – 11684

57

W języku Java komputer określa "punkt wejścia" podczas wykonywania programu, a nie podczas kompilacji. Na przykład z linii poleceń

java MyClass 

wyszukuje main() w MyClass. Wszystkie inne funkcje main() są ignorowane.

Jeśli używasz IDE, możesz ustawić, która klasa zawiera funkcję main(), której chcesz użyć.

+3

W Javie, wyszukuje 'public static void main (String [] args)'. –

+7

@LuiggiMendoza Tak, zgadza się. Dla zwięzłości, odrzuciłem pełny podpis dla main(), ponieważ PO już zademonstrował, że wie, co to jest. –

+5

Lub dla sygnatury metody 'public static void main (String [])' lub 'public static void main (String ...)' to * very * precise. –

15

W języku C#, można użyć wielu Main metod.

Jeśli istnieje wiele metod Main, kompilator nie wie, którego punktu wejścia użyć, a zatem pokaże błąd.

You potrzeba specify the Main method być stosowane przy kompilacji: Można określić, która metoda do wykorzystania jako opcji kompilatora w środowisku programistycznym Visual Studio lub przez kompilator CSC.

+1

Nie wiem o C#, ale w Javie jest to niepoprawne. Kompilator Java nie dba o to, który punkt wejścia zostanie użyty; skompiluje je wszystkie. Z drugiej strony środowisko uruchomieniowe musi zostać poinformowane o tym, który punkt wejścia należy wykonać. –

+1

tak ... ale ten ans był w odniesieniu do C# nie java – Anirudha

+2

@ Code-Guru: Odpowiedź jest poprawna dla C#, ponieważ zbiór ma punkt wejścia określony podczas kompilacji - ty * nie * określasz classname w czasie wykonywania, tylko nazwa zespołu. –

9

W języku C# określa się punkt wejścia za pomocą opcji kompilatora /main:.

Rozważmy następujący kod zawierający dwa main() funkcje:

namespace Application { 
    class ClassOne { 
     static void main() { 
      // Code here 
     } 
    } 

    class ClassTwo { 
     static void main() { 
      // Code here 
     } 
    } 
} 

Aby korzystać ClassOne.main() jako punkt wyjścia, należy określić następujące podczas kompilacji:

csc /main:Application.ClassOne hello.cs 
12

Główna klasa to klasa specjalna tylko z jednego powodu: po uruchomieniu wirtualnej maszyny języka Java ta funkcja jest wywoływana przez maszynę JVM. Zasadniczo jest to jak każda inna funkcja, a tak naprawdę możesz wywołać główną funkcję jednej klasy z innej klasy.

Kiedy skompilować projekt z wielu klas, powiedz JVM uruchomić klasę z głównej klasy, której chcesz użyć, jak w przykładzie:

java SomeClass 

i to będzie działać Główną metodą SomeClass, zakładając, że SomeClass jest skompilowany i że odpowiedni skompilowany plik znajduje się w ścieżce klasy. (To jest coś, co musisz opracować z konkretnym systemem operacyjnym, ale myślę, że jest dość normalne, aby opcja -cp określała ścieżkę klasy). Więc tak:

java -cp /home/MyName Someclass 

potrwa główną funkcję SomeClass w katalogu/home/MyName

7

W Javie jak inni wskazał, można zdefiniować klasę zawierającą swoją główną funkcję po uruchomieniu komendy java .

Ale można również zbudować plik wykonywalny, który można uruchomić z java -jar my.jar. W takim przypadku potrzebny jest plik manifestu o nazwie MANIFEST.MF w folderze META-INF w słoiku. W tym pliku należy określić klasę zawierającą główną funkcję, używając instrukcji: Main-Class: YourClass.

7

Dla wielokrotnego głównych funkcji punktu wejścia może zostać uznana przez:

Aby ustawić tę opcję kompilatora w Visual Studio środowisko programistyczne

Otwórz Właściwości stronie projektu.

Kliknij stronę właściwości aplikacji.

Modyfikuj właściwość obiektu startowego.

odniesienia: http://msdn.microsoft.com/en-us/library/x3eht538.aspx

4

Główną metodą jest statyczne, co oznacza, że ​​należy do grupy zamiast obiektu. Obiekt nie będzie miał w ogóle innej głównej metody. Nie będzie miała dodatkowej głównej metody, ponieważ główna jest statyczna. Tak jest raz na zajęcia.

Jeśli masz wiele głównej metody w projekcie, można określić, który z nich uruchomić podczas uruchamiania aplikacji

+0

Dla jasności, klasa * może * mieć więcej niż jedną główną metodę. Na przykład, możesz mieć 'public static void main()' i 'public static void main (String [])'. W Javie środowisko wykonawcze będzie szukało drugiego podpisu do uruchomienia. –

2

W rzeczywistości, w pliku binarnego, na przykład, format PE w oknach i format ELF w systemie Linux lub każdy inny system, nagłówek pliku binarnego określi, gdzie jest adres początkowy i może być tylko jeden.

Który z nich powinien być punktem wejścia? To zależy od linkera. Tak jak @SetFreeByTruth powiedział, że możesz go określić za pomocą parametrów wiersza poleceń. Wiele łączników obsługuje określanie punktu wejścia za pomocą parametrów wiersza polecenia. na przykład gnu's gld może określać punkt wejścia z parametrem -e.

Nie znam zachowania środowiska Java, ponieważ jest on ładowany przez maszynę wirtualną Java.

-1

W Visual Studio wybierasz projekt, który ma być punktem wejścia, kliknięcie prawym przyciskiem myszy i Ustaw jako projekt startowy.

+0

, który byłby "projektem startowym", ale nie o to im chodzi. Jeśli masz wiele potencjalnych punktów wejścia * w jednym projekcie/złożeniu *, możesz otworzyć właściwości projektu i wybrać z menu "obiekt startowy" w panelu aplikacji. – dlatikay

Powiązane problemy