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

В програмирането на Java, можем ли да извикаме статичен метод на абстрактен клас?
Да, знам, че не можем да използваме статичен метод с метод на абстрактен клас. но искам да знам защо.. ?


person Neha Gupta    schedule 01.07.2013    source източник


Отговори (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 смятат, че това би насърчило злоупотребата с интерфейси)

person Russell Zahniser    schedule 01.07.2013
comment
Забележка: от java 8 можете да декларирате статични методи и методи по подразбиране в интерфейс - person HelloWorld; 12.05.2015
comment
@HelloWorld Не съвсем - методът static на интерфейса трябва да бъде имплементиран на интерфейса. Това: public interface Rabbit { static boolean doIt (); } … води до грешка: Compilation failure [ERROR] /Users/…/Rabbit.java:[4,42] missing method body, or declare abstract - person Basil Bourque; 17.02.2019
comment
@BasilBourque, да, разбира се. Съжалявам, че не беше ясно. static методите винаги трябва да се прилагат там, където са декларирани. те са статични, не се променят. - person HelloWorld; 18.02.2019

Ако говорите за java, отговорът е Да Но трябва да дефинирате статичния метод. Не можете да създадете абстрактен статичен метод. Това, което можете да създадете, е неабстрактен статичен метод.

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

така че не можете да имате,

  abstract class AbstractClassExample{
     abstract static void method();


}  

Но можете да имате,

abstract class AbstractClassExample{

     static void method(){}
}  

Надявам се това да помогне...

person Dulanga    schedule 01.07.2013

Ето едно просто обяснение. Абстрактните методи трябва да бъдат имплементирани по-късно. Знаем, че статичните методи не могат да бъдат отменени, тъй като статичните методи не принадлежат към нито един конкретен екземпляр, по-скоро той принадлежи към класа. Тогава различна реализация на абстрактния метод, който е статичен, в различни класове е контраинтуитивно.

person Rafsan Mobasher    schedule 27.05.2016

Да, разбира се, можете да дефинирате статичния метод в абстрактен клас. можете да извикате този статичен метод, като използвате абстрактен клас или като използвате дъщерен клас, който разширява абстрактния клас. Също така можете да извикате статичен метод чрез екземпляр/обект на дъщерен клас. За да илюстрираме по-нататъшен тест, следният пример.

//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();
    }
}
person CodeNinja    schedule 26.08.2015

От Java 9 нататък можете да имате статични методи в интерфейс. Реализацията обаче трябва да бъде осигурена в самия блок. За разлика от статичните методи в клас, статичен метод в интерфейс не се наследява чрез имплементация чрез клас или подинтерфейс.

Резюмето може да съдържа статичен метод. Това е така, защото статичен метод, въпреки че не е отменен, може да бъде скрит.

Но абстрактен метод не може да бъде деклариран статичен едновременно, тъй като абстрактен метод трябва да бъде отменен и имплементиран от метод на подклас и декларирането му като статичен ще предотврати отмяната. С други думи, не можете да използвате абстрактни и статични ключови думи, за да декларирате един и същи метод. Можете обаче да имате статичен метод вътре в абстрактен клас.

person Abhishek Podder    schedule 16.07.2019
comment
Всъщност от Java 8 нататък можем да имаме статични методи в интерфейсите, а не 9. - person viveknaskar; 23.10.2020