修復編譯錯誤:類別 X 是公共的,應在名為 X.java 的檔案中聲明
1. 概述
作為 Java 開發人員,我們都遇到過編譯時錯誤,其中一個可能讓我們犯錯的錯誤是“ class X is public should be declared in a file named X.java
”
在本快速教程中,我們將解釋此錯誤的含義、發生的原因以及如何快速解決它。
2.問題介紹
像往常一樣,讓我們透過範例來理解問題。
假設我們要創建一個簡單的足球比賽應用程式。因此,首先,我們在FootballGame.java
來源檔案中對球員和俱樂部關聯進行建模:
// Filename: FootballGame.java
public class FootballPlayer {
private String name;
private Club club;
public FootballPlayer(String name, Club club) {
this.name = name;
this.club = club;
}
// ... standard getters and setters are omitted
}
class Club {
private String name;
public Club(String name) {
this.name = name;
}
//... getters and setters are omitted
}
如程式碼所示,這兩個類別非常簡單。然而,當我們編譯這段程式碼時,編譯器會抱怨:
java: class FootballPlayer is public, and should be declared in a file named FootballPlayer.java
這個編譯器錯誤可能會令人困惑,特別是對於 Java 初學者來說。接下來,讓我們了解此錯誤的含義以及如何解決該問題。
3. 理解錯誤
首先,在 Java 中,一個原始檔案 ( *.java
) 可以包含多個類,但只能包含**一個public
類別。**在我們的範例中,我們將FootballPlayer
和Club
放在一個檔案中。只有FootballPlayer
類別是public
。所以,一切看起來都很好。
然而,每當我們聲明一個public
類別時,我們必須確保檔案名稱與類別名稱完全匹配。這是 Java 強製程式碼結構和一致性的方式。我們的public
類別名為FootballPlayer
,但檔案名稱是FootballGame.java
。因此,我們打破了這個規則。
現在我們了解了這個編譯器錯誤的意思。接下來,我們來解決這個問題。
4. 如何解決
有兩種不同的方法可以解決此問題。讓我們逐一檢查一下。
4.1.重新命名文件
錯誤訊息顯示,「 … FootballPlayer .. should be declared in a file named FootballPlayer.java
」。因此,第一個修復是將檔案重新命名為公共類別名稱。在此範例中,我們需要將檔案重新命名為FootballPlayer.java
。
重命名檔案後,編譯程式碼沒有任何錯誤。此外,我們可以建立一個小測試來驗證這兩個類別是否按預期工作:
Club manUnited = new Club("Manchester United FC");
FootballPlayer rooney = new FootballPlayer("Wayne Rooney", manUnited);
assertEquals("Wayne Rooney", rooney.getName());
assertEquals("Manchester United FC", rooney.getClub().getName());
這樣,問題就解決了。確保我們的檔案名稱和公共類別名稱匹配,我們與 Java 的約定保持一致,使我們的程式碼更有組織性並且更易於管理。
接下來,讓我們轉向替代解決方案。
4.2.刪除public
修飾符
我們知道這個錯誤的根本原因是檔案名稱( FootballGame.java
)和公共類別名稱( FootballPlayer
)不符。另一個解決方案是從FootballPlayer
類別中刪除public
修飾符:
// Filename: FootballGame.java
class FootballPlayer {
// ... same code is omitted
}
class Club {
// ... same code is omitted
}
由於我們在此文件中沒有公共類,因此文件名無需與類名相符。現在,如果我們執行相同的測試,程式碼將編譯並且測試通過:
Club manUnited = new Club("Manchester United FC");
FootballPlayer rooney = new FootballPlayer("Wayne Rooney", manUnited);
assertEquals("Wayne Rooney", rooney.getName());
assertEquals("Manchester United FC", rooney.getClub() .getName());
問題得到解決。然而,值得注意的是,透過刪除public
修飾符,我們使類別成為包私有的(只能在同一包中存取)。例如,上面的測試類別和FootballGame.java
檔案必須位於同一個套件中。
5. 結論
在本文中,我們了解了編譯器錯誤“ class X is public, should be declared in a file named X
”,並探索了兩種不同的方法來解決該問題。
當我們再次遇到這個錯誤時,我們會確切地知道如何解決它。透過一些實踐,這樣的錯誤將在我們的開發過程中變得容易修復。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。