2016-10-07 58 views
1

實施例:當我們已經設置-classpath來定位該文件時,是否必須完全限定類名稱?

我有一個名爲PROGA

package test; 
public class ProgA 
{ 
    public static void main(String[] args) 
    { 
     ProgB pb = new ProgB(); 
     pb.callMe(); 
    } 
} 

現在I類具有PROGB象下面這樣:

package test2; 
public class ProgB 
{ 
    public void callMe() 
    { 
    System.out.println("inside callme"); 
    } 
} 

編譯ProgB.java它的類文件中的包TEST2生成後。現在,當我嘗試使用此命令編譯ProgA.java時:

javac -cp C:\Users\MyName\Desktop\test2 ProgA.java 

我得到錯誤,它找不到ProgB。 我的問題是爲什麼不能java看類路徑中找到ProgB.class文件併成功編譯我的ProgA.java?當我在ProgA.java代碼中指定ProgB的完全限定類名稱並且將類路徑設置爲-classpath C:\Users\MyName\Desktop運行時,代碼正常工作。當我已經指定完整的類路徑來查找ProgB時,爲什麼要有完全的Quilified名稱。我不清楚這個類路徑和完全合格的類名的概念。請解釋我。謝謝

+2

我相信你需要先導入它。像'import test2.ProgB;'一樣。我不確定,因爲它是幾十年前我沉浸在Java中的時候。 –

+1

這兩個類有不同的包。 (測試和測試2)除非特別說明,否則他們不會看到自己的包裝外。 –

+0

所以@KRichardson你想說的是我們需要告訴編譯器ProgB與ProgA不在同一個包中,只需指定它的全限定名即可。沒有哪個編譯器認爲ProgB與ProgA在同一個包中,甚至不需要查看類路徑進行掃描? – sharath

回答

1

爲了使用一個類從另一個包,你需要或者使用完全限定類名,或有import聲明。這是一個.java源代碼要求。它不能簡單地通過擺弄編譯器的類路徑來解決。

沒有導入語句,假定非限定名屬於當前源文件的包。如果您使用package test文件,則標識符ProgB將匹配test.ProgB,但不匹配test2.ProgB。編譯器將不會搜索其他軟件包,除非您告訴它。

2

首先你需要導入類。這就是爲什麼它要求你使用完全合格的類名。您不能使用不在同一個包中的類而不導入它(或使用完全限定的類名)。

import test2.ProgB; 

然後編譯時,您應該提供類路徑直到根位置,編譯器會使用包名稱作爲路徑來查找類。

你的編譯命令應該是。

javac -cp C:\Users\MyName\Desktop ProgA.java 
相關問題