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

Neh*_*pta 41 java static interface abstract

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

Rus*_*ser 47

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

abstract class Foo {
   static void bar() { }
}
Run Code Online (Sandbox Code Playgroud)

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

Foo.bar();
Run Code Online (Sandbox Code Playgroud)

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

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

// Calling a method with no body!
Foo.bar();
Run Code Online (Sandbox Code Playgroud)

在接口中,所有方法都是隐式抽象的.这就是接口无法声明静态方法的原因.(没有架构原因,为什么接口不能有静态方法,但我怀疑JLS的编写者认为这会鼓励滥用接口)

  • 注意:从java 8开始,您可以在接口中声明静态和默认方法 (16认同)

Dul*_*nga 21

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

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

所以你不能拥有,

  abstract class AbstractClassExample{
     abstract static void method();


}  
Run Code Online (Sandbox Code Playgroud)

但是你可以拥有,

abstract class AbstractClassExample{

     static void method(){}
}  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...


Raf*_*her 8

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


小智 5

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

//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();
    }
}
Run Code Online (Sandbox Code Playgroud)