簡體   English   中英

為什么我在Java中的同一個類中沒有抽象和靜態方法

[英]Why can I not have an abstract and static method in the same class in Java

我有以下課程:

public abstract class A
{
  public abstract String doSomething(String X, String Y);
  public static String doSomething(String X, String Y){return X + Y;}
  ...
}

我遇到的問題是靜態和抽象的doSomething()方法似乎是重復的。 我認為這應該沒問題,因為靜態方法屬於類,而不是類的實例,因此我將使用抽象方法在所有子類上強制執行該方法,並將靜態方法作為幫助程序,以便我很好地使用因子代碼。

我知道我可能會在混合中添加一個接口,但我真的不明白我在同一個類上存在的抽象和靜態方法有什么問題。 這有什么問題?

在Java中,從對象實例調用靜態方法而不是類名稱(盡管許多編譯器生成警告 )是有效的(盡管有誤導性和混淆)。

System.out.println(String.valueOf(true)); // Prints "true".
System.out.println("".valueOf(true)); // Prints "true", unfortunately.

所以下面看似有效的代碼不知道要調用哪些方法:

A a = getInstanceOfConcreteSubclassOfA();
a.doSomething(null, null); // Compiler can't decide which method to call...

不幸的是,它只是Java語言中為數不多的幾個角落之一。

它並不特定於抽象方法; 通常,Java不允許您使用相同參數類型的兩個方法,但一個是靜態的而一個不是。 像這樣的東西:

public String doSomething(String X, String Y){return X + Y;}
public static String doSomething(String X, String Y){return X + Y;}

也是非法的。

(當你考慮允許在一個實際的實例上調用一個靜態方法,或者就此而言,在任何相應類型的表達式上調用靜態方法時,這是有道理的。編譯器轉換((A)null).staticMethod()A.staticMethod() 。)

每種方法都有一個簽名組成:

method name
parameter type
Return type

如果2個方法具有相同的簽名,則會導致錯誤。

static 一樣的方法的簽名干擾const

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM