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?
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
}
}
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.
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.