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

时间:2013-07-01 14:42:46

标签: java interface static abstract

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

5 个答案:

答案 0 :(得分:47)

在Java中,您可以在抽象类中使用静态方法:

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

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

Foo.bar();

但是,出于同样的原因,您不能将静态方法声明为抽象。通常,编译器可以保证抽象方法在调用它时会有实际的实现,因为您无法创建抽象类的实例。但是由于可以直接调用静态方法,因此将其抽象为可以调用未定义的方法。

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

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

在界面中,所有方法都是implicitly abstract。这就是接口无法声明静态方法的原因。 (没有架构理由为什么接口不能有静态方法,但我怀疑JLS的编写者认为这会鼓励滥用接口)

答案 1 :(得分:21)

如果你在谈论java,答案是但你需要定义静态方法。您无法创建抽象静态方法。您可以创建的是非抽象静态方法。

原因是您不需要对象实例来访问静态方法,因此您需要使用某种功能来定义方法。

所以你不能拥有,

  abstract class AbstractClassExample{
     abstract static void method();


}  

但你可以拥有,

abstract class AbstractClassExample{

     static void method(){}
}  

希望这会有所帮助......

答案 2 :(得分:8)

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

答案 3 :(得分:3)

是的,当然你可以在抽象类中定义静态方法。 您可以通过使用抽象类或使用扩展抽象类的子类来调用该静态方法。此外,您还可以通过子类实例/对象调用静态方法。 为了说明进一步测试以下示例。

//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();
    }
}

答案 4 :(得分:0)

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

摘要可以包含静态方法。这是因为可以隐藏静态方法,尽管它不会被覆盖。

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