[英]Same keyword for two purposes in java?
因為我們使用“default”關鍵字作為訪問說明符,並且它可以在switch語句中使用以及完全不同的目的,所以我很好奇java中有任何其他關鍵字可以用於多個目的
訪問修飾符的“默認”不是關鍵字 - 您不寫:
default void doSomething()
但是,在指定注釋屬性的默認值時 - 它是。
switch (a) {
default: something();
}
和
public @interface MyAnnotation {
boolean bool() default true;
}
這與Jon Skeet指出的final
似乎涵蓋了一切。 也許,除了“過載” for
關鍵字:
for (initializer; condition; step)
和for (Type element : collection)
你不能使用default
作為訪問說明符,所以我不認為即便如此。 (編輯:正如Bozho指出的那樣,它可以用於注釋。)
final
意味着“不能從/被覆蓋”和“只讀”,它們是兩種不同但相關的含義。
default
既可以在開關中使用,也可以在注釋中用作默認值(如Bozho所指出的) final
意味着“不能從/被覆蓋”和“只讀”,它們是兩種不同但相關的含義(如Jon指出的那樣) extends
既可用於指定類的超類型,也可用於通配符和類型變量來放置約束(相關但不完全相同)( List<? extends Foo>
) super
可以用來指定當前類的超類中的某些東西,或者用於通配符來放置約束( List<? super Foo>
) static
意味着“類的一部分,而不是實例”(對於方法,屬性或初始化器)和static import
class
聲明一個類( class Foo {}
),或引用一個類文字( Foo.class
)(由ILMTitan回答) for
可以正常用於循環和“強化”了,但是這更像是超載(如Bozho所說的這么好聽),比真的有兩個方面的含義) 沒有人提到的東西: class關鍵字有兩種不同的用途。
宣布課程:
class Test{};
並指示一個類文字:
Class<Test> testClass = Test.class;
default
關鍵字不用作訪問說明符。 缺乏private
, protected
和public
意味着使用default
。
例:
class Test { // default access for class.
int A; // default access for the class member.
}
發現不同用途的Java關鍵字的一些示例是:
final
: final
class
不能被子類化, final
方法不能被覆蓋,並且final
變量最多可以作為左手表達式出現一次。
Super
:用於訪問由其出現的類繼承的類的成員,還用於將調用從構造函數轉發到超類中的構造函數。
Static
:用於創建static
初始化塊, static
成員和static
導入。
for
:用於傳統的for
循環和較新的Java 1.5 enhanced for
循環。
static
關鍵字將方法和字段與類而不是該類的實例相關聯,但它也用於表示靜態初始化部分,如:
public class MyClass
{
private static int a;
static
{
a = 1;
}
public static void doSomethingCool()
{
...
}
}
Pascal的評論讓我想起了靜態導入:
import static MyClass.doSomethingCool;
public class MyOtherClass
{
public void foo()
{
// Use the static method from MyClass
doSomethingCool();
}
}
final
關鍵字可能意味着不同的東西。
classes
意味着該類不能被子類化。 method
,意味着無法覆蓋該方法。 variable
,意味着變量不能指向任何其他變量。 我看了一下java關鍵字,但似乎關鍵字是唯一的..你可以自己檢查一下。
順便說一下, default
不能用作訪問說明符,它是在指定noone時繼承的。
我們真的使用default
作為訪問說明符嗎? 沒有說明者是“默認”。 但是你不要那樣使用關鍵字。
final有不同的用途:
“extends”關鍵字可以用於單繼承(Java中的實現或“純抽象類”,也稱為“接口繼承”)。
“extends”關鍵字也可用於多個(接口)繼承。
那些總是認為Java不支持多重繼承的人因此很難說這兩種情況下的“擴展”是完全相同的。
現在我在另一個陣營:我認為多接口繼承是多重繼承,而實現繼承只是一個OOP細節(在OOA / OOD級別不存在),因此我認為“擴展”是真的在這兩種情況下做同樣的事情,因此我的答案不回答問題:)
但它仍然是一個有趣的關鍵字:)
你可以想到以下幾點
正如所有其他答案所述,有許多關鍵字根據上下文服務多個目的。 我只想補充說有一個原因:強烈厭惡添加關鍵字,因為這些添加會破壞現有代碼,所以當添加新功能時,如果它們合理適合使用現有關鍵字,例如super和extends對於泛型和注釋的默認值,或者它們只是在增強的for循環中使用的冒號中被跳過。
所以我的觀點是期望隨着語言的不斷發展,現有關鍵詞的用途越來越多,而不是引入新的關鍵詞。
BTW在Java中沒有訪問說明符這樣的東西。 JLS中的術語是“訪問修飾符”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.