Java類文件命名約定
- java
1.概述
編譯Java類時,將創建一個具有相同名稱的類文件。但是,對於嵌套類或嵌套接口,它會創建一個類文件,該文件的名稱將內部類和外部類名(包括美元符號)組合在一起。
在本文中,我們將看到所有這些情況。
2.細節
在Java中,我們可以在一個類中編寫一個類。其中編寫的類稱為嵌套類,而保存嵌套類的類稱為外部類。嵌套類的範圍受其封閉類的範圍限制。
同樣,我們可以在另一個接口或類中聲明一個接口。這樣的接口稱為嵌套接口。
我們可以使用嵌套的類和接口對僅在一個地方使用的實體進行邏輯分組。這不僅使我們的代碼更具可讀性和可維護性,而且還增加了封裝性。
在下一節中,我們將詳細討論其中的每一個。我們還將看一下枚舉。
3.嵌套類
嵌套類是在另一個類或接口內聲明的類。每當我們需要一個單獨的類,但仍希望該類充當另一個類的一部分時,嵌套類是實現它的最佳方法。
當我們編譯Java文件時,它將.class
文件,為所有嵌套的類創建單獨的類文件。為封閉類生成的類文件將具有與Java類相同的名稱。
對於嵌套類,**編譯器使用其他命名約定–** **OuterClassName$NestedClassName.class**
首先,讓我們創建一個簡單的Java類:
public class Outer {
// variables and methods...
}
當我們編譯 Outer
類,編譯器將創建一個 Outer.class
文件。
在接下來的小節中,我們將在 Outer
類,並查看類文件的命名方式。
3.1 靜態嵌套類
顧名思義,被聲明為static
的嵌套類稱為靜態嵌套類。在Java中,僅允許嵌套類為static.
靜態嵌套類可以同時具有靜態和非靜態字段和方法。它們與外部類相關聯,而不與特定實例相關聯。因此,我們不需要外部類的實例來訪問它們。
Outer
類中聲明一個靜態嵌套類:
public class Outer {
static class StaticNested {
public String message() {
return "This is a static Nested Class";
}
}
}
當我們編譯Outer
類時,
編譯器會創建兩個類文件,一個用於Outer
,另一個用於StaticNested
:
3.2 非靜態嵌套類
非靜態嵌套類(也稱為內部類)與封閉類的實例相關聯,並且它們可以訪問外部類的所有變量和方法。
外部類只能具有公共或默認訪問權限,而內部類可以是私有,公共,受保護或具有默認訪問權限。但是,它們不能包含任何靜態成員。另外,我們需要創建外部類的實例來訪問內部類。
讓我們在Outer
類中再添加一個嵌套類:
public class Outer {
class Nested {
public String message() {
return "This is a non-static Nested Class";
}
}
}
它會再生成一個類文件:
3.3 局部類
局部類(也稱為內部類)在一個塊中定義-平衡括號之間的一組語句。例如,它們可以在方法主體, for
循環或if
子句中。局部類的範圍與局部變量一樣,被限制在塊內。本地類在編譯時顯示為帶有自動生成的數字的美元符號。
為本地類生成的類文件使用命名約定– **OuterClassName$1LocalClassName.class**
讓我們在方法中聲明一個本地類:
public String message() {
class Local {
private String message() {
return "This is a Local Class within a method";
}
}
Local local = new Local();
return local.message();
}
Local
類創建一個單獨的類文件:
同樣,我們可以在if
子句中聲明一個本地類:
public String message(String name) {
if (StringUtils.isEmpty(name)) {
class Local {
private String message() {
return "This is a Local class within if clause";
}
}
Local local = new Local();
return local.message();
} else
return "Welcome to " + name;
}
儘管我們正在創建另一個具有相同名稱的本地類,但編譯器不會報錯。它會再創建一個類文件,並以增加的數量命名:
3.4 匿名內部類
顧名思義,匿名類是沒有名稱的內部類。編譯器在美元符號後使用自動生成的數字來命名類文件。
我們需要同時在單個表達式中聲明和實例化匿名類。它們通常擴展現有的類或實現接口。
讓我們看一個簡單的例子:
public String greet() {
Outer anonymous = new Outer() {
@Override
public String greet() {
return "Running Anonymous Class...";
}
};
return anonymous.greet();
}
在這裡,我們通過擴展Outer
類創建了一個匿名類,編譯器又添加了一個類文件:
同樣,我們可以使用匿名類實現接口。
在這裡,我們正在創建一個接口:
interface HelloWorld {
public String greet(String name);
}
現在,讓我們創建一個匿名類:
public String greet(String name) {
HelloWorld helloWorld = new HelloWorld() {
@Override
public String greet(String name) {
return "Welcome to "+name;
}
};
return helloWorld.greet(name);
}
讓我們觀察一下修訂後的類文件列表:
如我們所見,為接口HelloWorld
生成了一個類文件,為名稱為Outer$2
的匿名類生成了一個類文件。
3.5 接口內部類
我們已經在另一個類中看到了一個類,此外,我們可以在接口中聲明一個類。如果類的功能與接口功能緊密相關,則可以在接口內部聲明它。當我們要為接口方法編寫默認實現時,可以使用此內部類。
HelloWorld
接口中聲明一個內部類:
interface HelloWorld {
public String greet(String name);
class InnerClass implements HelloWorld {
@Override
public String message(String name) {
return "Inner class within an interface";
}
}
}
編譯器又生成了一個類文件:
4.嵌套接口
嵌套接口(也稱為內部接口)在類或另一個接口中聲明。使用嵌套接口的主要目的是通過對相關接口進行分組來解析名稱空間。
我們不能直接訪問嵌套接口。只能使用外部類或外部接口訪問它們。例如, Map
接口內部Entry
接口是嵌套的,可以作為Map
訪問。 Entry
。
讓我們看看如何創建嵌套接口。
4.1 接口內部接口
接口內部聲明的接口是隱式公共的。
讓我們在HelloWorld
接口中聲明我們的接口:
interface HelloWorld {
public String greet(String name);
interface HelloSomeone{
public String greet(String name);
}
}
這將為嵌套接口HelloWorld$HelloSomeone
的新類文件。
4.2 類內部的接口
在類內部聲明的接口可以使用任何訪問修飾符。
讓我們在Outer
類中聲明一個接口:
public class Outer {
interface HelloOuter {
public String hello(String name);
}
}
它將生成一個名為以下文件的新類文件: OuterClass$StaticNestedClass
5.枚舉
枚舉是在Java 5中引入的。它是一種數據類型,包含一組固定的常量,而這些常量是該enum
的實例。
在enum
聲明定義了一個稱為電子NUM類型(也稱為枚舉數據類型)類。 enum
添加很多東西,例如構造函數,方法,變量以及稱為常量特定的類主體的東西。
創建enum
,我們正在創建一個新類,並且隱式擴展了Enum
類。 Enum
不能繼承任何其他類,也不能擴展。但是,它可以實現一個接口。
我們可以在其自己的源文件或另一個類成員中將enum
讓我們看看創建enum
所有方法。
5.1 枚舉類
首先,讓我們創建一個簡單的enum
:
enum Level {
LOW, MEDIUM, HIGH;
}
編譯後,編譯器將為我們的枚舉Level
5.2 類中的枚舉
現在,讓我們在Outer
類中enum
public class Outer {
enum Color{
RED, GREEN, BLUE;
}
}
編譯器將為我們的嵌套枚舉Outer$Color
的單獨的類文件。
5.3 接口內的枚舉
同樣,我們可以在接口內enum
interface HelloWorld {
enum DIRECTIONS {
NORTH, SOUTH, EAST, WEST;
}
}
HelloWorld
接口時,編譯器將再添加一個名為HelloWorld$Directon.
5.4 枚舉內的枚舉
我們可以聲明一個enum
另一個內部enum
:
enum Foods {
DRINKS, EATS;
enum DRINKS {
APPLE_JUICE, COLA;
}
enum EATS {
POTATO, RICE;
}
}
最後,讓我們看一下生成的類文件:
enum
類型創建一個單獨的類文件。
六,結論
在本文中,我們看到了用於Java類文件的不同命名約定。我們在單個Java文件中添加了類,接口和枚舉,並觀察了編譯器如何為它們中的每個創建單獨的類文件。