вызов нестатического метода в статическом методе в Java [дубликат]



этот вопрос уже есть ответ здесь:



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




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




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




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




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

1818   14  

14 ответов:

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

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

new Foo().nonStaticMethod();

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

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

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

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

однако Java не позволяет реализовать определенный интерфейсом метод, чтобы быть статическим. Поэтому, когда вы (естественно) пытаетесь сделать метод статическим, вы получаете ошибка "не удается скрыть метод экземпляра". (Спецификация языка Java упоминает об этом в 9.4:"обратите внимание, что метод, объявленный в интерфейсе, не должен быть объявлен статическим, или возникает ошибка времени компиляции, потому что статические методы не могут быть абстрактными.")

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

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

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

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

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

 String.startsWith("Hello");

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

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

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

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

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

есть два пути:

  1. вызовите нестатический метод из экземпляра внутри статического метода. Ознакомиться с Фабьен ответ на образец, проявляющаяся... хотя я бы настоятельно рекомендовал против этого. Своим примером он создает экземпляр класса и использует его только для одного метода, только чтобы он это потом утилизировать. Я не рекомендую его, потому что он обрабатывает экземпляр как статическую функцию.
  2. измените статический метод на нестатический.

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

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

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

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

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

этот тип ситуации очень распространен в разработке приложений для 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);

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

AppEntryPoint.java

public interface AppEntryPoint
{
    public void entryMethod();
}

Главная.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;
    }
}

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

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

вы можете вызвать нестатический метод внутри статического с помощью: Classname.class.method()

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

Comments

    Ничего не найдено.