52

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

4

5 に答える 5

56

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

于 2013-07-01T14:54:40.030 に答える
24

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

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

だからあなたは持つことができません、

  abstract class AbstractClassExample{
     abstract static void method();


}  

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

abstract class AbstractClassExample{

     static void method(){}
}  

お役に立てれば...

于 2013-07-01T14:55:17.320 に答える
7

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

//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();
    }
}
于 2015-08-26T14:50:29.703 に答える