【问题标题】:Why can I not have an abstract and static method in the same class in Java为什么Java的同一个类中不能有抽象和静态方法
【发布时间】:2012-01-09 20:11:25
【问题描述】:

我有以下课程:

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 abstract-class static-methods


    【解决方案1】:

    在 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 语言中少数丑陋的角落之一。

    【讨论】:

    • 稍微澄清一下:是编译器,而不是运行时,必须弄清楚要调用哪个方法。
    • 您不能覆盖静态方法。可以吗?
    • @srikanthradix:不,静态方法不能被覆盖。
    • 我个人不会说它丑陋。 Java 的乐趣在于它阻止你做误导性的事情。这是一个很好的例子。如果你想要一个“帮助”方法,那么最好给它一个不同的名字,这样阅读你的代码的人就能一眼看出方法本身和它的帮助方法之间的区别。
    • @couling:这很丑,因为它误导。 a.staticMethod() 看起来像是在调用一个非静态的虚方法,但实际上是在调用一个静态的非虚方法。 ((A)null).staticMethod() 看起来应该抛出 NullPointerException,但它没有。
    【解决方案2】:

    它并不特定于抽象方法;一般来说,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() .)

    【讨论】:

      【解决方案3】:

      每个方法都有一个签名,包括:

      method name
      parameter type
      Return type
      

      如果 2 个方法具有相同的签名,这将导致错误。

      static 这个词确实干扰方法的签名,就像const 一样。

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 2011-12-08
        • 2010-09-05
        • 2015-06-26
        • 1970-01-01
        • 2011-01-24
        相关资源
        最近更新 更多