为什么在Java中不能在同一个类中使用抽象和静态方法

为什么在Java中不能在同一个类中使用抽象和静态方法,java,abstract-class,static-methods,Java,Abstract Class,Static Methods,我有以下课程: public abstract class A { public abstract String doSomething(String X, String Y); public static String doSomething(String X, String Y){return X + Y;} ... } 我遇到的问题是,静态和抽象的doSomething()方法看起来像是重复的冲突。我认为这应该是好的,因为静态方法属于类,而不是类的实例,所以我打算使用抽象方法

我有以下课程:

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));//打印“真”。
System.out.println(“.valueOf(true));//不幸的是,打印“真”。
因此,以下看似有效的代码不知道要调用哪些方法:

A=getInstanceofConcreteSubclassa();
a、 doSomething(null,null);//编译器无法决定调用哪个方法。。。

不幸的是,这只是Java语言中为数不多的几个丑陋角落之一。

每个方法都有一个由以下内容组成的签名:

method name
parameter type
Return type
如果两个方法具有相同的签名,这将导致错误


单词
static
不会像
const
一样干扰方法的签名,它不是特定于抽象方法的;一般来说,Java不允许有两个参数类型相同的方法,但一个是静态的,另一个不是。大概是这样的:

public String doSomething(String X, String Y){return X + Y;}
public static String doSomething(String X, String Y){return X + Y;}
也将是非法的


(这是有意义的,当你认为你可以调用一个静态方法“on”一个实际的实例,或者说在任何适当的表达式上。编译器编译<代码>((a)null)。Stasic方法(< /代码>到<代码> A StActudio方法(< /代码>))/p>稍微澄清:它是编译器,而不是运行时。那就必须弄清楚要调用哪个方法。你不能重写静态方法。你能吗?@srikanthroids:不,静态方法不能被重写。就我个人而言,我不会说它难看。Java的乐趣在于它阻止您做误导性的事情。这是一个很好的例子。如果您想要一个“helper”方法,那么最好给它起一个不同的名称,以便阅读您代码的人一眼就能看出该方法本身和它的helper之间的差异。@couling:它很难看,因为它具有误导性

a.staticMethod()
看起来它在调用一个非静态虚拟方法,但实际上它在调用一个静态非虚拟方法。staticMethod()看起来应该抛出一个
NullPointerException
,但是它没有。