Вызов нестатического метода в статическом методе в Java

Я получаю сообщение об ошибке при попытке вызвать нестатический метод в статическом классе.

Невозможно сделать статическую ссылку на нестатический метод methodName() из типа воспроизведения

Я не могу сделать метод статическим, так как это также дает мне ошибку.

Этот статический метод не может скрыть метод экземпляра из xInterface

Есть ли способ обойти вызов нестатического метода в другом статическом методе? (Эти два метода находятся в отдельных пакетах и ​​отдельных классах).

Ответ 1

Единственным способом вызова нестатического метода из статического метода является наличие экземпляра класса, содержащего нестатический метод. По определению, нестатический метод - это тот, который называется ON экземпляром некоторого класса, тогда как статический метод принадлежит самому классу.

Ответ 2

Вы можете создать экземпляр класса, на который хотите вызвать метод, например.

new Foo().nonStaticMethod();

Ответ 3

Сначала создайте экземпляр класса и вызовите нестатический метод, используя этот экземпляр. например,

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

Ответ 4

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()) мы вызываем метод one (sm.methodOne()).

Я надеюсь, что это будет полезно.

Ответ 5

Похоже, что метод действительно должен быть статичным (т.е. он не получает доступа к каким-либо элементам данных, и ему не нужен экземпляр, который нужно вызвать). Поскольку вы использовали термин "статический класс", я понимаю, что весь класс, вероятно, посвящен утилитарным методам, которые могут быть статическими.

Тем не менее, Java не разрешает статическую реализацию интерфейса. Поэтому, когда вы (естественно) пытаетесь сделать метод статическим, вы получаете ошибку "can not-hide-the-instance-method". (Спецификация языка Java упоминает это в разделе раздел 9.4: "Обратите внимание, что метод, объявленный в интерфейсе, не должен быть объявлен статическим или время компиляции ошибка возникает, потому что статические методы не могут быть абстрактными." )

Итак, пока метод присутствует в xInterface, а ваш класс реализует xInterface, вы не сможете сделать статический метод.

Если вы не можете изменить интерфейс (или не хотите), вы можете сделать несколько действий:

  • Сделать класс singleton: сделать конструктор закрытым и иметь статический член данных в классе, чтобы удерживать единственный существующий экземпляр. Таким образом вы будете вызывать метод в экземпляре, но по крайней мере вы не будете создавать новые экземпляры каждый раз, когда вам нужно вызвать метод.
  • Внесите в свой класс 2 метода: метод экземпляра (как определено в xInterface) и статический метод. Метод экземпляра будет состоять из одной строки, которая делегирует статический метод.

Ответ 6

Вам нужен экземпляр класса, содержащего нестационарный метод.

Как при попытке вызвать нестатический метод startsWith класса String без экземпляра:

 String.startsWith("Hello");

Вам нужно иметь экземпляр, а затем вызвать нестатический метод:

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

Итак, вам нужно создать экземпляр и вызвать его.

Ответ 7

Единственным способом вызова нестатического метода из статического метода является наличие экземпляра класса, содержащего нестатический метод.

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*/
    }
}

Ответ 8

Существует два способа:

  • Вызов нестатического метода из экземпляра в статическом методе. См. Ответ Fabien для образца oneliner... хотя я бы настоятельно рекомендовал против него. С его примером он создает экземпляр класса и использует его только для одного метода, только для того, чтобы избавиться от него позже. Я не рекомендую его, потому что он рассматривает экземпляр как статическую функцию.
  • Измените статический метод на нестатический.

Ответ 9

Вы не можете обойти это ограничение напрямую, нет. Но в вашем конкретном случае могут быть некоторые разумные вещи.

Например, вы можете просто "обновить" экземпляр вашего класса в статическом методе, а затем вызвать нестатический метод.

Но вы можете получить даже лучшие предложения, если вы публикуете свой класс - или их уменьшенную версию.

Ответ 10

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

(Для этого должен быть хотя бы один экземпляр этого класса)

Этот тип ситуации очень распространен в разработке приложений для Android, например: - у Activity есть как минимум один экземпляр.

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);

Ответ 11

Я использую интерфейс и создаю его анонимный экземпляр так:

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;
    }
}

Не так изящно, как создание экземпляра этого класса и вызов его собственного метода, но он по сути делает то же самое. Это еще один способ сделать это.

Ответ 12

Конструктор - это особый метод, который в теории является "единственным" нестатистическим методом, вызываемым любым статическим методом. иначе его не разрешено.

Ответ 13

Вы можете вызвать нестатический метод в статическом режиме, используя: Classname.class.method()

Ответ 14

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