2012-07-18 16 views
67

私はこれでちょっと新しいので、私に同行してください。私は現在、C#とJavaを学んでいますが、その類似点の1つは、メイン関数をクラス内にカプセル化する必要があることです。たとえば、複数の主な機能

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

ここでは、主にプログラムを実行するときにメインが「エントリポイント」であることを理解しています。基本的には、メイン関数がどこにあってもプログラムは実行を開始します。しかし、私は両方の言語で複数のクラス内で複数の主要な機能を持つことができると信じています。だから私は複数の主な機能を持つプロジェクトをコンパイルするとき、 "エントリポイント"はどこですか?コンパイラはどこから始めるべきかを知っていますか?

+13

答えは言語ごとに異なります。 –

答えて

54

.NETでは、コンパイル時に使用するMainメソッドを含むクラスを定義できます。 Javaでは

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

あなたはjarファイルにバンドルしている場合、あなたはjarファイルのマニフェストにあなたのエントリポイントを定義することができます。

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

+9

私はこれが答えのために最も投票されたことに驚いています。少なくともJavaの場合、Code-Guruと@CosmicComputerの回答は、ほとんどの人にとって意味があるようです。少数の出荷用の「実行可能な」ジャーを除いて、ごく少数の開発者がマニフェストメソッドを使用しているとは思えません。 _Java_のために、それはおそらく最良の答えはありませんが、それは私には思わ –

+3

@GeorgeHawkinsこれは、両方の言語のための質問に答える唯一の答えです。 – 11684

57

Javaでは、コンパイル時ではなく、実際にプログラムを実行するときにコンピュータが「エントリポイント」を決定します。例えば、コマンドライン

java MyClass 

検索からMyClassmain()ため。他のすべてのmain()関数は無視されます。

IDEを使用している場合、使用するmain()関数を含むクラスを設定できます。

+3

Javaでは、 'public static void main(String [] args)'を検索します。 –

+7

@LuiggiMendozaはい、それは正しいです。簡潔さのために、OPはすでに彼がそれが何であるかを知っていることを実証して以来、私はmain()の完全な署名を省いた。 –

+5

またはメソッドシグニチャの 'パブリック静的な無効メイン(文字列[])' 'またはパブリック静的な無効メイン(文字列...)' *ことが非常に*正確。 –

15

は、C#では、あなたは、複数のMainメソッドを使用することができます。

Mainメソッドが複数ある場合、コンパイラはどのエントリポイントを使用するのかわからないため、エラーが表示されます。

あなたをspecify the Main methodする必要がコンパイル時に使用する: あなたは、Visual Studio開発環境でまたはCSCコンパイラによるコンパイラオプションとして使用するためにどの方法を指定することができます。

+1

私はC#について知りませんが、Javaではこれは間違っています。 Javaコンパイラは、使用されるエントリポイントを気にしません。すべてをコンパイルします。一方、実行時環境には実行するエントリ・ポイントを伝えなければなりません。 –

+1

ええ...しかし、これはANSは、C#ではないのjava – Anirudha

+2

コード-達人@を参考にした:アセンブリがコンパイル時に指定したエントリ・ポイントを持っているような答えは、C#のための正しいです - あなたは* *クラス名を指定しません実行時には、アセンブリ名だけです。 –

9

C#では、/main:コンパイラオプションを使用してエントリポイントを指定します。あなたのエントリポイントとしてClassOne.main()を使用するには

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

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

コンパイルするとき、あなたは次のように指定します。:2つのmain()の機能を含む次のコードを考えてみましょう

csc /main:Application.ClassOne hello.cs 
12

メインクラスは、特別なクラスであります理由の1つしかありません.Java仮想マシンを実行すると、その関数がJVMから呼び出されます。これは基本的に他の関数と似ています。実際、あるクラスのmain関数を別のクラスから呼び出すことができます。あなたが複数のクラスでプロジェクトをコンパイルすると

、あなたはそうのように、使用するメインクラスを持つクラスを実行するJVMを教えて:

java SomeClass 

、それは工assのmainメソッドを実行します、 SomeClassがコンパイルされ、適切なコンパイルされたファイルがクラスパスにあると仮定します。 (それはあなたがあなたの特定のOSで動かなければならないものですが、-cpオプションがクラスパスを指定するのはかなり普通だと思います。だから、この:

java -cp /home/MyName Someclass 

は、他の人が指摘したように、あなたがjavaコマンドを実行したとき、あなたはあなたの主な機能を含むクラスを定義し、Javaではディレクトリ/ home/MYNAMEに

7

を工assの主な機能を実行します。

しかし、java -jar my.jarで実行可能な実行可能なjarをビルドすることもできます。この場合、jarファイルのというマニフェストファイルがMETA-INFというフォルダに存在する必要があります。このファイルでは、ステートメントMain-Class: YourClassを使用してmain関数を含むクラスを指定します。

は、プロジェクトのプロパティ]ページを開き、Visual Studio開発環境でこのコンパイラオプションを設定するには

:複数の主な機能のエントリポイントについては

4

メインメソッドは静的であり、それはクラスではなくオブジェクトに属していることを意味します。したがって、オブジェクトには、内部に別のメインメソッドはありません。メインは静的なので、追加のメインメソッドはありません。クラスごとに1回です。

プロジェクトで複数のメイン・メソッドを持っている場合は、あなたが実際にあなたのアプリケーション

+0

ただ明確にするために、クラス*は、複数のmainメソッドを持つことができます。たとえば、 'public static void main()'と 'public static void main(String [])'を持つことができます。 Javaでは、ランタイム環境は後者の署名を実行するように探します。 –

2

を開始するときに、たとえば、バイナリファイルでは、起動するかを指定しますが、PE形式のLinuxのウィンドウとELF形式または他のシステムでは、バイナリファイルのヘッダは開始アドレスがどこにあるのかを指定し、開始アドレスは1つだけです。

エントリポイントはどれですか?リンカーによって異なります。 @SetFreeByTruthのように、コマンドラインパラメータで指定することができます。 多くのリンカは、コマンドラインパラメータでエントリポイントを指定することをサポートしています。たとえば、gnuのgldは、パラメータ-eでエントリポイントを指定できます。

Javaの動作が分からないのは、Java仮想マシンによってロードされているためです。

-1

Visual Studioでは、エントリポイントにするプロジェクトを選択し、右クリックして[スタートアッププロジェクトとして設定]を選択します。

+0

それは、「スタートアッププロジェクト」だろうが、それは、彼らが何を意味するかではありません。あなたが* 1プロジェクト/アセンブリ内の*複数の潜在的なエントリポイントを持っている場合は、プロジェクトのプロパティを開き、アプリケーションペインの「スタートアップオブジェクト」ドロップダウンから選びます。 – dlatikay