Подтвердить что ты не робот

Можем ли мы использовать статический метод в абстрактном классе?

В программировании на Java, можно ли вызвать статический метод абстрактного класса?
Да, я знаю, что мы не можем использовать static с методом абстрактного класса. но я хочу знать, почему..?

4b9b3361

Ответ 1

В Java вы можете иметь статический метод в абстрактном классе:

abstract class Foo {
   static void bar() { }
}

Это разрешено, потому что этот метод можно вызвать напрямую, даже если у вас нет экземпляра абстрактного класса:

Foo.bar();

Однако по той же причине вы не можете объявить статический метод абстрактным. Обычно компилятор может гарантировать, что абстрактный метод будет иметь реальную реализацию в любое время, когда он вызывается, потому что вы не можете создать экземпляр абстрактного класса. Но так как статический метод можно вызывать напрямую, делая его абстрактным, можно вызвать метод undefined.

abstract class Foo {
   abstract static void bar();
}

// Calling a method with no body!
Foo.bar();

В интерфейсе все методы неявно абстрактны. Вот почему интерфейс не может объявить статический метод. (Нет никакой архитектурной причины, почему интерфейс не может иметь статический метод, но я подозреваю, что авторы JLS считают, что это будет способствовать неправильному использованию интерфейсов)

Ответ 2

Если вы говорите о java, ответ Да Но вам нужно определить статический метод. Вы не можете создать абстрактный статический метод. То, что вы можете создать, - это не абстрактный статический метод.

Причина в том, что вам не нужен экземпляр объекта для доступа к статическому методу, поэтому вам нужно, чтобы метод определялся с определенной функциональностью.

чтобы вы не могли,

  abstract class AbstractClassExample{
     abstract static void method();


}  

Но вы можете иметь

abstract class AbstractClassExample{

     static void method(){}
}  

Надеюсь, что это поможет...

Ответ 3

Вот простое объяснение. Методы аббрекации должны быть реализованы позже. Мы знаем, что статические методы не могут быть переопределены, потому что статические методы не принадлежат ни одному конкретному экземпляру, скорее принадлежит классу. Затем различная реализация абстрактного метода, который является статичным, в разных классах является противоинтуитивным.

Ответ 4

Да, конечно, вы можете определить статический метод в абстрактном классе. вы можете вызвать этот статический метод с помощью абстрактного класса или с помощью дочернего класса, который расширяет абстрактный класс. Также вы можете вызвать статический метод через экземпляр/объект дочернего класса. Чтобы проиллюстрировать дальнейшую проверку в следующем примере.

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

Ответ 5

Начиная с Java 9 вы можете использовать статические методы в интерфейсе. Однако реализация должна быть предоставлена в самом блоке. В отличие от статических методов в классе, статический метод в интерфейсе не наследуется реализацией через класс или подчиненный интерфейс.

Аннотация может содержать статический метод. Это потому, что статический метод, хотя и не переопределенный, может быть скрыт.

Но абстрактный метод не может быть объявлен статическим одновременно с тем, что абстрактный метод должен быть переопределен и реализован методом подкласса, и объявление его статическим предотвратит переопределение. Другими словами, вы не можете использовать абстрактные и статические ключевые слова для объявления одного и того же метода. Тем не менее, вы можете иметь статический метод внутри абстрактного класса.