Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Recibo un error al intentar llamar a un método no estático en una clase estática.

  

No se puede hacer una referencia estática a la methodName método no estático () de la reproducción de tipo

No puedo hacer que el método estático, ya que me da un error también.

  

Este método estático no puede ocultar el método de instancia de xInterface

¿Hay alguna manera de recibir todo el año llamando a un método no estático en otro método estático? (Los dos métodos son en paquetes separados y clases separadas).

¿Fue útil?

Solución

La única manera para llamar a un método no estático de un método estático es tener una instancia de la clase que contiene el método no estático. Por definición, un método no estático es uno que se llama en una instancia de una clase, mientras que un método estático pertenece a la clase en sí.

Otros consejos

Se puede crear una instancia de la clase que desea llamar al método en, por ejemplo,

new Foo().nonStaticMethod();

En primer lugar crear una instancia de clase y llamar al método no estático usando esa instancia. por ejemplo,

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

el código anterior no se ejecutó porque el método estático que debe tener referencia de clase.

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

Esto sin duda puede conseguir ejecutado. Porque aquí estamos creando referencia que no es sino "sm" mediante el uso de esa referencia de esa clase que no es nada pero (StaticMethod=new Static method()) que están llamando a un método de (sm.methodOne()).

Espero que esto sea útil.

Parece que el método realmente debe ser estática (es decir, que no tiene acceso a ningún miembro de datos y que no necesita una instancia que se invoca en). Dado que utilizó el término "clase estática", entiendo que toda la clase es, probablemente, dedicada a métodos de utilidad similar que podrían ser estática.

Sin embargo, Java no permite la implementación de un método de interfaz definidos a ser estática. Así que cuando usted (naturalmente) intenta hacer que el método estático, se obtiene el error "no se puede ocultar-la-instance-método". (La especificación del lenguaje Java lo menciona en la sección rel="noreferrer"> : "Tenga en cuenta que un método declarado en una interfaz no debe ser declarado estática, o se produce un error en tiempo de compilación, porque los métodos estáticos no pueden ser abstractos." )

Así que, mientras el método está presente en xInterface, y su clase implementa xInterface, usted no será capaz de hacer que el método estático.

Si no puede cambiar la interfaz (o no quiere), hay varias cosas que puede hacer:

  • Hacer la clase un producto único: hacer que el constructor privado, y tienen un miembro de datos estáticos en la clase para mantener la única instancia existente. De esta manera usted puede invocar el método en una instancia, pero al menos no será la creación de nuevos casos cada vez que necesite llamar al método.
  • Implementar 2 métodos de su clase: un método de instancia (como se define en xInterface), y un método estático. El método de instancia constará de una sola línea que los delegados al método estático.

Es necesario una instancia de la clase que contiene el método no estático.

Es como cuando intenta invocar el método startsWith no estático de String clase sin una instancia:

 String.startsWith("Hello");

Lo que se necesita es tener una instancia y luego invocar el método no estático:

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

Por lo que necesita para crear y ejemplo para invocarlo.

La única manera para llamar a un método no estático de un método estático es tener una instancia de la clase que contiene el método no estático.

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

Hay dos maneras:

  1. Llamada el método no estático de una instancia en el método estático. Véase la respuesta de Fabien para una muestra oneliner ... aunque yo recomendaría fuertemente contra él. Con su ejemplo se crea una instancia de la clase y la utiliza con un método, sólo para que se disponga de ella más tarde. Yo no lo recomiendo porque trata una instancia como una función estática.
  2. Cambiar el método estático a un no estático.

No se puede evitar esta restricción directamente, no. Sin embargo, puede haber algunas cosas razonables que se pueden hacer en su caso particular.

Por ejemplo, usted podría "nuevo hasta" una instancia de su clase en el método estático, a continuación, llamar al método no estático.

Sin embargo, es posible obtener incluso mejores sugerencias si usted envía su clase (s) -. O una versión reducida de ellos

La forma más fácil de utilizar un / campo método no estático dentro de un método estático o viceversa es ...

(Para trabajar este debe haber al menos una instancia de esta clase)

Este tipo de situación es muy común en el desarrollo de aplicaciones para Android, por ejemplo: - Una actividad tiene por lo menos un caso-

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

Nota: - Esto no puede ser utilizado como un método constructor como éste .....

String.valueOf(100);

Yo uso una interfaz y crear una instancia en el anonimato de la misma, así:

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

No es tan elegante como la creación de una instancia de esa clase y llamar a su propio método, pero consigue el mismo efecto, esencialmente. Sólo otra manera de hacerlo.

Constructor es un método especial que en teoría es la "única" método no estático llamado por cualquier método estático. cosa que no es permitido.

Puede llamar a un método no estático dentro de una estática usando: Classname.class.method()

No es posible llamar método no estático dentro método estático. La lógica detrás de esto es que no crean un objeto para crear una instancia método estático, pero hay que crear un objeto de crear una instancia de método no estático. Así método no estático no va a obtener el objeto por su ejemplificación en el interior método estático, por lo que es incapaz de ser instanciado.

scroll top