📜  为什么静态方法不能在Java中是抽象的?

📅  最后修改于: 2022-05-13 01:54:37.014000             🧑  作者: Mango

为什么静态方法不能在Java中是抽象的?

在Java中,静态方法不能是抽象的。这样做会导致编译错误。
例子:

Java
// Java program to demonstrate
// abstract static method
 
import java.io.*;
 
// super-class A
abstract class A {
 
    // abstract static method func
    // it has no body
    abstract static void func();
}
 
// subclass class B
class B extends A {
 
    // class B must override func() method
    static void func()
    {
        System.out.println(
            "Static abstract"
            + " method implemented.");
    }
}
 
// Driver class
public class Demo {
    public static void main(String args[])
    {
 
        // Calling the abstract
        // static method func()
        B.func();
    }
}


Java
// Java program to demonstrate
// abstract static method
 
import java.io.*;
 
// super-class A
abstract class A {
 
    // static method func
    static void func()
    {
        System.out.println(
            "Static method implemented.");
    }
 
    // abstract method func1
    // it has no body
    abstract void func1();
}
 
// subclass class B
class B extends A {
 
    // class B must override func1() method
    void func1()
    {
        System.out.println(
            "Abstract method implemented.");
    }
}
 
// Driver class
public class Demo {
    public static void main(String args[])
    {
 
        // Calling the abstract
        // static method func()
        B.func();
        B b = new B();
        b.func1();
    }
}


上面的代码是不正确的,因为静态方法不能是抽象的。运行时出现的编译错误是:
编译错误:

prog.java:12: error: illegal combination of modifiers: abstract and static
    abstract static void func();
                         ^
1 error

如果将静态方法设为抽象会发生什么?
假设我们将静态方法抽象化。那么该方法将被写为:

public abstract static void func();

  • 场景1:当使用抽象类型修饰符将方法描述为抽象时,子类有责任实现它,因为它们在超类中没有指定的实现。因此,子类必须覆盖它们以提供方法定义。

  • 场景 2:现在当一个方法被描述为静态时,很明显这个静态方法不能被任何子类覆盖(它使静态方法隐藏),因为静态成员是编译时元素,覆盖它们将使其成为运行时元素(运行时多态性)。

现在考虑场景 1 ,如果 func 方法被描述为抽象的,它必须在子类中有定义。但是根据场景 2 ,静态 func 方法不能在任何子类中被覆盖,因此它不能有定义。因此,这些场景似乎相互矛盾。因此,我们对静态 func 方法是抽象的假设失败了。因此,静态方法不能是抽象的。
然后该方法将被编码为:

public static void func();

例子:

Java

// Java program to demonstrate
// abstract static method
 
import java.io.*;
 
// super-class A
abstract class A {
 
    // static method func
    static void func()
    {
        System.out.println(
            "Static method implemented.");
    }
 
    // abstract method func1
    // it has no body
    abstract void func1();
}
 
// subclass class B
class B extends A {
 
    // class B must override func1() method
    void func1()
    {
        System.out.println(
            "Abstract method implemented.");
    }
}
 
// Driver class
public class Demo {
    public static void main(String args[])
    {
 
        // Calling the abstract
        // static method func()
        B.func();
        B b = new B();
        b.func1();
    }
}
输出:
Static method implemented.
Abstract method implemented.