Извикване на нестатичен метод в статичен метод в Java

Получавам грешка, когато се опитвам да извикам нестатичен метод в статичен клас.

Не може да се направи статична препратка към нестатичния метод methodName() от възпроизвеждането на типа

Не мога да направя метода статичен, тъй като това също ми дава грешка.

Този статичен метод не може да скрие метода на екземпляра от xInterface

Има ли някакъв начин да заобиколите извикването на нестатичен метод в друг статичен метод? (Двата метода са в отделни пакети и отделни класове).


person me123    schedule 11.01.2010    source източник


Отговори (14)


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

person danben    schedule 11.01.2010

Можете да създадете екземпляр на класа, на който искате да извикате метода, напр.

new Foo().nonStaticMethod();
person Fabian Steeg    schedule 11.01.2010
comment
@EJP За целите на сигурността и това е, което правя с моя проект, в случай на инжектиране на зависимости е полезно само кодът за инициализиране да бъде инстанциран за инициализация, а не по произволна преценка на код, използващ моя API. По този начин, когато се случи цикъл на инициализация, временният обект, съдържащ само константи и нестатични методи, които се инициализират динамично чрез инжектиране на зависимости, може безопасно да бъде зареден и изхвърлен, ако е необходимо. Целта на статичните методи е по-скоро като целта на чистите функции, като например във функционалните езици за програмиране. - person AMDG; 19.06.2018

Първо създайте екземпляр на клас и извикайте нестатичния метод, като използвате този екземпляр. напр.

class demo {

    public static void main(String args[]) {
        demo d = new demo();
        d.add(10,20);     // to call the non-static method
    }

    public void add(int x ,int y) {
        int a = x;
        int b = y;
        int c = a + b;
        System.out.println("addition" + c);
    }
}
person Parmeshwar    schedule 12.06.2012

public class StaticMethod{

    public static void main(String []args)throws Exception{
        methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

горният код не се изпълнява, защото статичният метод трябва да има тази препратка към клас.

public class StaticMethod{
    public static void main(String []args)throws Exception{

        StaticMethod sm=new StaticMethod();
        sm.methodOne();
    }

    public int methodOne(){
        System.out.println("we are in first methodOne");
        return 1;
    }
}

Това определено ще бъде изпълнено. Тъй като тук създаваме препратка, която не е нищо друго освен "sm", като използваме тази препратка на този клас, която не е нищо друго освен (StaticMethod=new Static method()), ние извикваме метод едно (sm.methodOne()).

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

person chinnu geddi    schedule 25.11.2015

Изглежда, че методът наистина трябва да е статичен (т.е. няма достъп до никакви членове на данни и не се нуждае от екземпляр, за да бъде извикан). Тъй като използвахте термина "статичен клас", разбирам, че целият клас вероятно е посветен на подобни на помощни програми методи, които могат да бъдат статични.

Java обаче не позволява внедряването на дефиниран от интерфейс метод да бъде статичен. Така че, когато (естествено) се опитвате да направите метода статичен, получавате грешката „cannot-hide-the-instance-method“. (Спецификацията на езика Java споменава това в раздел 9.4: "Имайте предвид, че метод, деклариран в интерфейс, не трябва да се декларира като статичен или възниква грешка по време на компилиране, тъй като статичните методи не могат да бъдат абстрактни.")

Така че докато методът присъства в xInterface и вашият клас имплементира xInterface, няма да можете да направите метода статичен.

Ако не можете да промените интерфейса (или не искате), има няколко неща, които можете да направите:

  • Направете класа сингълтон: направете конструктора частен и имайте статичен член на данните в класа, който да държи единствения съществуващ екземпляр. По този начин ще извиквате метода на екземпляр, но поне няма да създавате нови екземпляри всеки път, когато трябва да извикате метода.
  • Внедрете 2 метода във вашия клас: метод на екземпляр (както е дефиниран в xInterface) и статичен метод. Методът на екземпляра ще се състои от един ред, който делегира на статичния метод.
person Eli Acherkan    schedule 11.01.2010
comment
Много напреднал отговор! Благодаря ти! - person Hermann Schwarz; 19.06.2021

Имате нужда от екземпляр на класа, съдържащ нестатичния метод.

Това е като когато се опитвате да извикате нестатичния метод startsWith от клас String без екземпляр:

 String.startsWith("Hello");

Това, от което се нуждаете, е да имате екземпляр и след това да извикате нестатичния метод:

 String greeting = new String("Hello World");
 greeting.startsWith("Hello"); // returns true 

Така че трябва да създадете и екземпляр, за да го извикате.

person OscarRyz    schedule 11.01.2010

Единственият начин да извикате нестатичен метод от статичен метод е да имате екземпляр на класа, съдържащ нестатичния метод.

class A
{
    void method()
    {
    }
}
class Demo
{
    static void method2()
    {
        A a=new A();

        a.method();
    }
    /*
    void method3()
    {
        A a=new A();
        a.method();
    }
    */

    public static void main(String args[])
    {
        A a=new A();
        /*an instance of the class is created to access non-static method from a static method */
        a.method();

        method2();

        /*method3();it will show error non-static method can not be  accessed from a static method*/
    }
}
person Sourav Saha    schedule 27.01.2015
comment
благодаря, подходът е по-ясен, помогнете ми много! понякога момчета с по-ниска репутация са полезни за този начин. - person Noor Hossain; 26.12.2020

Има два начина:

  1. Извикайте нестатичния метод от екземпляр в статичния метод. Вижте отговора на fabien за еднолинейна проба... въпреки че силно бих го препоръчал. С неговия пример той създава екземпляр на класа и го използва само за един метод, само за да го изхвърли по-късно. Не го препоръчвам, защото третира екземпляр като статична функция.
  2. Променете статичния метод на нестатичен.
person monksy    schedule 11.01.2010

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

Например, можете просто да „обновите“ екземпляр на вашия клас в статичния метод, след което да извикате нестатичния метод.

Но може да получите още по-добри предложения, ако публикувате своя(те) клас(ове) – или тяхна намалена версия.

person Drew Wills    schedule 11.01.2010

Най-лесният начин да използвате нестатичен метод/поле в рамките на статичен метод или обратното е...

(За да работи това трябва да има поне един екземпляр от този клас)

Този тип ситуация е много често срещана при разработката на приложения за Android, напр.: - Дейност има поне един екземпляр.

public class ParentClass{

private static ParentClass mParentInstance = null;

ParentClass(){
  mParentInstance = ParentClass.this;           
}


void instanceMethod1(){
}


static void staticMethod1(){        
    mParentInstance.instanceMethod1();
}


public static class InnerClass{
      void  innerClassMethod1(){
          mParentInstance.staticMethod1();
          mParentInstance.instanceMethod1();
      }
   }
}

Забележка: - Това не може да се използва като метод за изграждане като този.....

String.valueOf(100);
person mifthi    schedule 01.09.2014

Използвам интерфейс и създавам негов анонимен екземпляр така:

AppEntryPoint.java

public interface AppEntryPoint
{
    public void entryMethod();
}

Main.java

public class Main
{
    public static AppEntryPoint entryPoint;

    public static void main(String[] args)
    {
        entryPoint = new AppEntryPoint()
        {

            //You now have an environment to run your app from

            @Override
            public void entryMethod()
            {
                //Do something...
                System.out.println("Hello World!");
            }
        }

        entryPoint.entryMethod();
    }

    public static AppEntryPoint getApplicationEntryPoint()
    {
        return entryPoint;
    }
}

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

person JDSweetBeat    schedule 16.10.2015

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

person Usman    schedule 02.05.2017
comment
Възможно е, ако имате екземпляр за извикване на метода non-statc. Може да бъде предоставен като параметър, например, или да бъде член на статични данни на класа. - person user207421; 17.06.2017
comment
Всъщност според моето разбиране извикването на нестатичен метод с екземпляр е извън обхвата на този въпрос. - person Usman; 03.07.2017

Конструкторът е специален метод, който на теория е "единственият" нестатичен метод, извикан от всеки статичен метод. иначе не е позволено.

person JavaDeveloper    schedule 09.10.2013
comment
Въпросът не е в конструкторите. - person user207421; 17.06.2017

Можете да извикате нестатичен метод в рамките на статичен, като използвате: Classname.class.method()

person george kanakis    schedule 30.12.2014
comment
добавянето на .class между класа и метода свърши работа благодаря - person CrandellWS; 30.01.2016
comment
Не, не можеш. Това е просто фантазия, освен ако методът, който искате да извикате, не е дефиниран вjava.lang.Class. - person user207421; 17.06.2017