2012-03-09 13 views
3

は、私がコンパイルして実行すると、私は次のクラスにメインを含むクラスはなぜ公開されていないのですか?

class A { //not public 
    public static void main(String args[]) { 
    System.out.println("done"); 
} 

を宣言し、それが正常に動作し、「完了」出力します。私がそれを「パッケージa」にあると宣言しても、同じ動作です。

しかし、JVMの仕様では、メインメソッドが「それ以外の場合はメインが表示されない」ので公開する必要がある場合、クラスにも適用しないでください。 JVMがpublicと宣言されていないときにA.main()を "見ることができない"場合、クラスA自体をどのように見ることができますか?

"これは仕様書に記載されているため"以外の説明はありますか?

答えて

0

クラスprivateを宣言するときに、「不可視」にしているわけではなく、あなたのメソッドにも同じことが起こります。メソッドprivateを宣言すると、あなたのクラスの外からという呼び出し可能ではありません。 staticプライベートクラスのパブリックメソッドは、publicly callableです。

+0

、プライベートパッケージ(デフォルトのアクセス)クラスは、そのパッケージ外のクラスと本質的に見えません。したがって、そのパブリッククラスはそのパッケージの外のクラスには使用できません。 – Jagat

3

JVMは、可視性ルールを実行する責任があるため、アプリケーションのすべてのクラスに常にアクセスします。したがって、必要に応じて可視性のルールを無視できるという結論を導き出すことができます(たとえば、ユーザーがアプリケーションを起動すると、JVMはmain()というエントリポイントを見つけなければなりません)。

つまり、JVMはこの関数にアクセスするクラスではないため、可視性は適用されません。基本的には、実行から終了までアプリケーションを管理する監督です。

参考のため、Executionを参照してください。

+0

"* visibilityが適用されない*"の場合、JVMがアクセスするには**メインメソッド**を 'public'にする必要がありますか、それを' public'に設定するだけです。 –

+0

@ShashwatこれはJVMによって強制される規則です。 http://stackoverflow.com/a/11444861/483349を参照してください。 –

0

JVMが非公開のクラスを見ることができる理由は、可視性を制御すること、つまりすべてを見て、何が見える/呼び出す/アクセスできるかを決定するからです。

クラス上でのpublicの使用はメソッドとは異なりますが、コンセプトは同じです。

メソッドでは、publicキーワードは、メソッドがクラス外で使用できることを意味します。たとえば、次のようになります。

class A { 
    public static void do() { 
    // Do something 
    } 
} 

class B { 
    public static void main(String[] args) { 
    A.do(); // This works because do() is public and static 
    } 
} 

同じ概念がクラスに適用されますが、異なる方法です。

クラス上でpublicを使用すると、現在の.javaファイル(それは独自の.classファイルを持つ)の外部で使用できることを意味します。ここで

は例です:私が学んだことから、

//C.java 

    class C { 
    static void do() { 
     // Do something 
    } 

    public static void run() { 
     A.do(); // Works because A.do() is public and static 
     B.do(); // Does not work because B is not a public class 
    } 
    } 



//A.java 

    public class A { 
    public static void main(String[] args) { 
     B.do(); // Works because B is in the same file 
     do(); // Duh... 
    } 

    public static void do() { 
     // Do something 
    } 
    } 

    class B { 
    static void do() { 
     // Do something 
    } 
    } 
関連する問題