在Java编程中,我们可以调用抽象类的静态方法吗?
是的,我知道我们不能将静态与抽象类的方法一起使用。但我想知道为什么..?
5 回答
在 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 的作者认为这会鼓励滥用接口)
如果您在谈论 java,答案是Yes但是您需要定义静态方法。您不能创建抽象静态方法。您可以创建的是非抽象静态方法。
原因是您不需要对象实例来访问静态方法,因此您需要定义具有特定功能的方法。
所以你不能拥有,
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 开始,您可以在接口中使用静态方法。但是,必须在块本身中提供实现。与类中的静态方法不同,接口中的静态方法不是由实现通过类或子接口继承的。
摘要可以包含静态方法。这是因为静态方法虽然没有被覆盖,但可以隐藏。
但是抽象方法不能同时声明为静态的,因为抽象方法必须被覆盖并由子类的方法实现,并且将其声明为静态将防止覆盖。换句话说,您不能使用抽象和静态关键字来声明相同的方法。但是,您可以在抽象类中使用静态方法。