为什么静态方法不能在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.