web-dev-qa-db-fra.com

La méthode statique peut-elle accéder à une variable d'instance non statique?

Donc, si j'ai bien compris, vous ne pouvez pas utiliser de méthode statique pour accéder à des variables non statiques, mais je suis tombé sur le code suivant.

class Laptop {
  String memory = "1GB";
}
class Workshop {
  public static void main(String args[]) {
    Laptop life = new Laptop();
    repair(life);
    System.out.println(life.memory);
    }
  public static void repair(Laptop laptop) {
    laptop.memory = "2GB";
  }
}

Qui compile sans erreurs.

Donc n'est pas

public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}

accéder à la mémoire de chaîne définie dans la classe Laptop, qui est une variable d’instance non statique?

Puisque le code est compilé sans erreur, je suppose que je ne comprends pas quelque chose ici. Est-ce que quelqu'un peut me dire ce que je ne comprends pas?

5
SERich

Une méthode statique peut accéder à des méthodes et des champs non statiques de toutes les instances connues. Cependant, il ne peut accéder à aucun élément non statique s'il ne sait pas sur quelle instance opérer.

Je pense que vous vous trompez avec des exemples comme celui-ci qui ne fonctionnent pas:

class Test {
  int x;

  public static doSthStatically() {
    x = 0; //doesn't work!
  }
}

Ici, la méthode statique ne sait pas à quelle instance de Test elle doit accéder. En revanche, s'il s'agissait d'une méthode non statique, il saurait que x fait référence à this.x (la this est implicite ici) mais que this n'existe pas dans un contexte statique.

Si, toutefois, vous fournissez l'accès à une instance, même une méthode statique peut accéder à x

Exemple:

class Test {
  int x;
  static Test globalInstance = new Test();

  public static doSthStatically( Test paramInstance ) {
    paramInstance.x = 0; //a specific instance to Test is passed as a parameter
    globalInstance.x = 0; //globalInstance is a static reference to a specific instance of Test

    Test localInstance = new Test();
    localInstance.x = 0; //a specific local instance is used
  }
}
19
Thomas

Vous pouvez accéder uniquement avec object reference.

Les variables d'instance définies au niveau de la classe doivent être qualifiées avec un nom d'objet si vous utilisez un contexte statique. Mais cela ne signifie pas que vous ne pouvez pas accéder du tout.

0
Bhargav Kumar R

Les méthodes statiques ne peuvent pas modifier leur valeur. Vous pouvez obtenir leur valeur actuelle en y accédant avec la référence de la classe en cours.

0
Arun Raaj