Dado que es una variable no estática, estoy tratando de entender cómo debemos llamar a esta variable de clase tanto en el método estático como en el no estático.

Código:

public class Person {
    String firstName;

public static void main(String[] args) {
        Person pps = new Person();
        pps.setFirstName("Surendra");
        System.out.println(getFirstName());
}

public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

public static String getFirstName() {
        Person pps = new Person();
        return pps.firstName;
    }

}
-3
Surendra Anand 4 oct. 2021 a las 20:38

4 respuestas

La mejor respuesta

No se puede acceder a los miembros de datos no estáticos desde métodos estáticos sin que se proporcione una instancia de alguna manera (por ejemplo, como un argumento o creada localmente). Los métodos estáticos no se adjuntan naturalmente a ninguna instancia de la clase, por lo que no hay this dentro del método.

Para acceder al miembro de datos desde una instancia específica, necesita un método no estático llamado en la instancia específica.

public String getFirstName() {
    return this.firstName;
}

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(pps.getFirstName());
}

Si desea que se comparta el mismo nombre entre todas las instancias de la clase, entonces todo debería ser estático:

public class Person {

    static String firstName;

    public static void main(String[] args) {
        Person.setFirstName("Surendra");
        System.out.println(Person.getFirstName());
    }

    public static void setFirstName(String newFirstName) {
        firstName = newFirstName;
    }

    public static String getFirstName() {
        return firstName;
    }

}
3
rkechols 4 oct. 2021 a las 19:36

El problema es que está creando una nueva Persona dentro de su getter, lo que hace que su código anterior dentro de su método Main sea irrelevante porque está consultando el nombre de la segunda Persona que nunca se estableció. Dado que su método estático no tiene acceso a las instancias, deberá pasar la instancia.

Así es como debería verse su código si desea que un método estático devuelva una variable de instancia:

public static String getFirstName(Person pps) {
        return pps.firstName;
    }

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(Person.getFirstName(pps));
}

La respuesta de PS- rkeckol es correcta sobre cómo debería establecer / obtener una variable normalmente, pero me parece que está experimentando a propósito con métodos cruzados estáticos / de miembros. Si entendí mal, entonces sigue su respuesta.

PPS: también es una buena práctica que su método principal esté en su propia clase.

1
dbrewster 4 oct. 2021 a las 19:41

Las variables estáticas se declaran dentro de una clase y se pueden usar fuera de la clase con el nombre de la clase y el objeto de la clase. Pero se prefiere el nombre de la clase.

La variable no estática no se puede usar dentro de un bloque estático o un método estático, pero la variable estática se puede usar dentro de métodos no estáticos y estáticos.

Entonces, 'firstName' como variable estática. o haga getFirstName como un método no estático de la siguiente manera.

     String firstName;

public static void main(String[] args) {
    StackOverFlowTesting pps = new StackOverFlowTesting();
        pps.setFirstName("Surendra");
        System.out.println(pps.getFirstName());
}
public  String getFirstName() {
    //StackOverFlowTesting pps = new StackOverFlowTesting();
        return this.firstName;
    }
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
-1
Arvind G 4 oct. 2021 a las 18:51

Intente eliminar la parte estática de getFirstName y luego cambie println para llamar al método getFirstName desde el objeto Person creado.

public class Person {
        String firstName;
    
    public static void main(String[] args) {
            Person pps = new Person();
            pps.setFirstName("Surendra");
            System.out.println(pps.getFirstName());
    }
    
    public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
    public String getFirstName() {
            Person pps = new Person();
            return pps.firstName;
        }
    
    }
-3
RoJack 4 oct. 2021 a las 18:13