web-dev-qa-db-ja.com

抽象クラスで静的メソッドを使用できますか?

Javaプログラミングで、抽象クラスの静的メソッドを呼び出すことはできますか?
はい、抽象クラスのメソッドでstaticを使用できないことは知っています。しかし、私は理由を知りたい..?

41
Neha Gupta

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の作者はインターフェイスの誤用を助長すると感じたと思います)

47

Javaについて話している場合、答えははいです。しかし、静的メソッドを定義する必要があります。抽象静的メソッドを作成することはできません。作成できるのは非抽象静的メソッドです

理由は、静的メソッドにアクセスするためにオブジェクトインスタンスが必要ないため、特定の機能でメソッドを定義する必要があるためです。

あなたは持てません

  abstract class AbstractClassExample{
     abstract static void method();


}  

しかし、あなたは持つことができます、

abstract class AbstractClassExample{

     static void method(){}
}  

お役に立てれば...

21
Dulanga

ここで簡単な説明です。抽象メソッドは後で実装する必要があります。静的メソッドは特定のインスタンスに属しているのではなく、クラスに属しているため、静的メソッドをオーバーライドできないことを知っています。異なるクラスでは直感に反します。

8
Rafsan Mobasher

はい、もちろん、抽象クラスで静的メソッドを定義できます。抽象クラスを使用して、または抽象クラスを拡張する子クラスを使用して、静的メソッドを呼び出すことができます。また、子クラスのインスタンス/オブジェクトを介して静的メソッドを呼び出すことができます。次の例でさらにテストを説明します。

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

Java 9以降では、インターフェイスに静的メソッドを含めることができます。ただし、実装はブロック自体で提供する必要があります。クラスの静的メソッドとは異なり、インターフェイスの静的メソッドは継承されませんクラスまたはサブインターフェイスを介した実装。

要約には静的メソッドを含めることができます。オーバーライドされていない静的メソッドは非表示にできるためです。

ただし、抽象メソッドは、サブクラスのメソッドによって実装されるか、またはサブクラスのメソッドによって実装される必要があるため、静的メソッドとして宣言することはできません。つまり、抽象キーワードと静的キーワードを使用して同じメソッドを宣言することはできません。ただし、抽象クラス内に静的メソッドを含めることができます。

0
Abhishek Podder