我们能在抽象类中使用静态方法吗?

55

在Java编程中,我们能调用抽象类的静态方法吗?
不可以。但我想知道为什么不能呢..?

5个回答

60
在Java中,你可以在抽象类中定义一个静态方法:
abstract class Foo {
   static void bar() { }
}

这是允许的,因为该方法可以直接调用,即使您没有抽象类的实例:

Foo.bar();

然而,出于同样的原因,您不能将静态方法声明为抽象方法。通常情况下,编译器可以保证在任何时候调用抽象方法时都会有真正的实现,因为您无法创建抽象类的实例。但由于静态方法可以直接调用,使其成为抽象方法将使未定义的方法可被调用。

abstract class Foo {
   abstract static void bar();
}

// Calling a method with no body!
Foo.bar();

在接口中,所有的方法都是隐式抽象的。这就是为什么接口不能声明静态方法的原因。(并没有架构上的限制导致接口不能有静态方法,但我猜测JLS的撰写者觉得这会鼓励接口的误用)


22
注意:从Java 8开始,你可以在接口中声明静态方法和默认方法。 - HelloWorld
1
@HelloWorld 不完全正确 - 接口上的 static 方法必须在接口上 实现。这个:public interface Rabbit { static boolean doIt (); } …会导致错误:编译失败 [ERROR] /Users/…/Rabbit.java:[4,42] missing method body, or declare abstract - Basil Bourque
1
@BasilBourque 当然可以。抱歉没有表达清楚。static方法必须在它们被“声明”的地方实现。它们是静态的,不会改变。 - HelloWorld

26
如果您在谈论Java,答案是是的,但您需要定义静态方法。您无法创建抽象静态方法,但可以创建非抽象的静态方法。 原因是您不需要对象实例来访问静态方法,所以需要使用特定的功能来定义该方法。
因此,您不能有以下内容:
  abstract class AbstractClassExample{
     abstract static void method();


}  

但是你可以拥有,

abstract class AbstractClassExample{

     static void method(){}
}  
希望这有所帮助...

9

这里是一个简单的解释。抽象方法必须在以后被实现。我们知道静态方法不能被覆盖,因为静态方法不属于任何特定实例,而是属于类。因此,在不同的类中使用静态的抽象方法的不同实现是不符合直觉的。


7

当然可以在抽象类中定义静态方法。可以通过抽象类调用该静态方法,也可以通过扩展抽象类的子类调用它,还可以通过子类实例/对象调用静态方法。为了进一步说明,请尝试以下示例。

//Parent class
public abstract class TestAbstractClass {
    static void testStaticMethod(){
        System.out.println("In Parent class static method");
    }
}

//child class
public class ChildClass extends TestAbstractClass {
    public static void main(String[] args) {
        TestAbstractClass parentObj = new ChildClass();
        parentObj .testStaticMethod();
        ChildClass childObj = new ChildClass();
        childObj.testStaticMethod();
        TestAbstractClass.testStaticMethod();
        childClass.testStaticMethod();
    }
}

0

从Java 9开始,您可以在接口中拥有静态方法。但是,实现必须在块本身中提供。与类中的静态方法不同,接口中的静态方法不会通过类或子接口继承实现。

抽象类可以包含静态方法。这是因为静态方法虽然没有被覆盖,但可以被隐藏。

但是,抽象方法不能同时声明为静态方法,因为抽象方法必须由子类的方法重写和实现,并且声明为静态方法将防止重写。换句话说,您不能使用抽象和静态关键字来声明相同的方法。但是,您可以在抽象类中拥有静态方法。


3
实际上,从Java 8开始,我们就可以在接口中具有静态方法,而不是9。 - viveknaskar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接