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

Posted

技术标签:

【中文标题】我们可以在抽象类中使用静态方法吗?【英文标题】:Can we use static method in an abstract class? 【发布时间】:2013-06-28 17:39:03 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

抽象可以包含静态方法。这是因为静态方法虽然没有被覆盖,但可以隐藏。

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

【讨论】:

实际上,从 Java 8 开始,我们可以在接口中使用静态方法,而不是 9。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果你说的是java,答案是是的 但是你需要定义静态方法。您不能创建抽象静态方法。您可以创建的是非抽象静态方法。

原因是您不需要对象实例来访问静态方法,因此您需要定义具有特定功能的方法。

所以你不能拥有,

  abstract class AbstractClassExample
     abstract static void method();


  

但你可以拥有,

abstract class AbstractClassExample

     static void method()
  

希望这会有所帮助...

【讨论】:

【参考方案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();

在一个接口中,所有方法都是implicitly abstract。这就是接口不能声明静态方法的原因。 (接口不能有静态方法没有架构上的原因,但我怀疑 JLS 的作者认为这会鼓励滥用接口)

【讨论】:

注意:从 java 8 开始,您可以在接口中声明静态和默认方法 @HelloWorld 不完全——接口上的static 方法必须在接口上实现。这:public interface Rabbit static boolean doIt (); …导致错误:Compilation failure [ERROR] /Users/…/Rabbit.java:[4,42] missing method body, or declare abstract @BasilBourque 当然可以。抱歉,不清楚。 static 方法必须始终在“声明”的地方实现。它们是静态的,不会改变。

以上是关于我们可以在抽象类中使用静态方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE8基础 抽象类中可以有 静态方法,直接调用

PHP 抽象类,接口,抽象方法,静态方法

我们可以在java中使用类外的静态方法吗?

一个类中直接调用另一个类的静态方法吗

2017-4-16 多态 构造函数 方法重载 静态方法和静态成员

java中级,知识点归纳