在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的撰写者觉得这会鼓励接口的误用)
abstract class AbstractClassExample{
abstract static void method();
}
但是你可以拥有,
abstract class AbstractClassExample{
static void method(){}
}
希望这有所帮助...这里是一个简单的解释。抽象方法必须在以后被实现。我们知道静态方法不能被覆盖,因为静态方法不属于任何特定实例,而是属于类。因此,在不同的类中使用静态的抽象方法的不同实现是不符合直觉的。
当然可以在抽象类中定义静态方法。可以通过抽象类调用该静态方法,也可以通过扩展抽象类的子类调用它,还可以通过子类实例/对象调用静态方法。为了进一步说明,请尝试以下示例。
//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();
}
}
从Java 9开始,您可以在接口中拥有静态方法。但是,实现必须在块本身中提供。与类中的静态方法不同,接口中的静态方法不会通过类或子接口继承实现。
抽象类可以包含静态方法。这是因为静态方法虽然没有被覆盖,但可以被隐藏。
但是,抽象方法不能同时声明为静态方法,因为抽象方法必须由子类的方法重写和实现,并且声明为静态方法将防止重写。换句话说,您不能使用抽象和静态关键字来声明相同的方法。但是,您可以在抽象类中拥有静态方法。
static
方法必须在接口上 实现。这个:public interface Rabbit { static boolean doIt (); }
…会导致错误:编译失败 [ERROR] /Users/…/Rabbit.java:[4,42] missing method body, or declare abstract
。 - Basil Bourquestatic
方法必须在它们被“声明”的地方实现。它们是静态的,不会改变。 - HelloWorld