2012-03-09 45 views
3

我聲明瞭以下類爲什麼包含main的類不需要公開?

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

當我編譯並運行它,它運行良好,並打印輸出「完成」。即使我宣稱它是在「一個包」中也是如此。

但是,如果JVM規範要求主要方法應該公開,因爲「它不能看到主要」,它不應該也適用於類? 如果JVM在未聲明爲「public」時「無法看到」A.main(),它如何能夠看到類A本身。

除了「因爲規格說明是這樣」以外,是否有任何解釋?

回答

0

當你聲明一個類private時,你並沒有將它變爲「隱形」,對於你的方法也是如此。聲明一種方法private只是意味着它不是,而是可以從課堂外調用。 A static私有類的公共方法是公開可調用的。

+0

從我瞭解到,包專用(默認訪問)類是該包外的任何類基本上是不可見的。所以它的公共類不適用於該包之外的類。 – Jagat 2012-03-09 20:25:13

3

JVM有權訪問應用程序中的每個類,因爲它的一個職責是實施可見性規則。因此,可以得出結論,如果需要的話,它可以忽略可見性規則(例如,當用戶啓動應用程序時,JVM必須找到入口點,即main())。

換句話說,JVM不是訪問此功能的類,所以可見性不適用。它基本上是監督者,管理從執行到終止的應用程序。

僅供參考,請參閱Execution

+0

如果「*可見性不適用*」,爲什麼**主要方法**需要爲JVM訪問它的「public」,或者它只是約定將其設置爲「public」。 – 2017-05-07 04:15:11

+0

@Shashwat這是由JVM執行的約定。請參閱http://stackoverflow.com/a/11444861/483349 – 2017-05-08 13:29:03

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 
    } 
    } 
相關問題