В програмирането на Java, можем ли да извикаме статичен метод на абстрактен клас?
Да, знам, че не можем да използваме статичен метод с метод на абстрактен клас. но искам да знам защо.. ?
Можем ли да използваме статичен метод в абстрактен клас?
Отговори (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 смятат, че това би насърчило злоупотребата с интерфейси)
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
static
методите винаги трябва да се прилагат там, където са декларирани. те са статични, не се променят.
- person HelloWorld; 18.02.2019
Ако говорите за java, отговорът е Да Но трябва да дефинирате статичния метод. Не можете да създадете абстрактен статичен метод. Това, което можете да създадете, е неабстрактен статичен метод.
Причината е, че не се нуждаете от екземпляр на обект за достъп до статичен метод, така че трябва методът да бъде дефиниран с определена функционалност.
така че не можете да имате,
abstract class AbstractClassExample{
abstract static void method();
}
Но можете да имате,
abstract class AbstractClassExample{
static void method(){}
}
Надявам се това да помогне...
Ето едно просто обяснение. Абстрактните методи трябва да бъдат имплементирани по-късно. Знаем, че статичните методи не могат да бъдат отменени, тъй като статичните методи не принадлежат към нито един конкретен екземпляр, по-скоро той принадлежи към класа. Тогава различна реализация на абстрактния метод, който е статичен, в различни класове е контраинтуитивно.
Да, разбира се, можете да дефинирате статичния метод в абстрактен клас. можете да извикате този статичен метод, като използвате абстрактен клас или като използвате дъщерен клас, който разширява абстрактния клас. Също така можете да извикате статичен метод чрез екземпляр/обект на дъщерен клас. За да илюстрираме по-нататъшен тест, следният пример.
//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();
}
}
От Java 9 нататък можете да имате статични методи в интерфейс. Реализацията обаче трябва да бъде осигурена в самия блок. За разлика от статичните методи в клас, статичен метод в интерфейс не се наследява чрез имплементация чрез клас или подинтерфейс.
Резюмето може да съдържа статичен метод. Това е така, защото статичен метод, въпреки че не е отменен, може да бъде скрит.
Но абстрактен метод не може да бъде деклариран статичен едновременно, тъй като абстрактен метод трябва да бъде отменен и имплементиран от метод на подклас и декларирането му като статичен ще предотврати отмяната. С други думи, не можете да използвате абстрактни и статични ключови думи, за да декларирате един и същи метод. Можете обаче да имате статичен метод вътре в абстрактен клас.