web-dev-qa-db-fra.com

Pourquoi ne pouvons-nous pas utiliser le mot-clé «this» dans une méthode statique

class Sub {
    static int y;
    public static void foo() {
         this.y = 10;
    }
}

Je comprends que this représente l'objet invoquant la méthode et que les méthodes statiques ne sont liées à aucun objet. Mais dans le cas mentionné ci-dessus, la variable y est également statique.

Si nous pouvons invoquer une méthode statique sur un objet de classe, pourquoi ne pouvons-nous pas autoriser des méthodes statiques à définir les variables statiques de la classe.

Quel est le but de cette contrainte supplémentaire?

32
Pradeep Vairamani

Parce que this fait référence à l'instance d'objet. Il n'y a pas d'instance d'objet dans un appel d'une méthode statique. Mais bien sûr, vous pouvez accéder à votre champ statique (uniquement ceux statiques!). Utilisez simplement

class Sub {
    static int y;
    public static void foo() {
         y = 10;
    }
}

Si vous voulez vous assurer d'obtenir le champ statique y et non une variable locale du même nom, utilisez le nom de classe pour spécifier:

class Sub {
    static int y;
    public static void foo(int y) {
         Sub.y = y;
    }
}
78
brimborium

this fait référence à cette instance de l'objet Sub. Comme la méthode est static, il n'y a pas d'instance de Sub.

6
mrswadge

La principale raison pour laquelle nous ne pouvons pas utiliser "ceci" dans un contexte de méthode statique: -

this: - "this" signifie OBJECT de la classe actuelle, il est donc clair que "this" n'apparaît dans l'image que lorsque nous avons l'intention de créer un objet de cette classe.

méthode statique: - il n'est pas nécessaire de créer un objet pour utiliser la méthode statique. signifie "instance" ou la création d'objet n'a aucun sens avec "statique" selon la règle Java.

Il y aurait donc contradiction, si nous utilisons les deux ensemble (statique et ceci). C'est la raison pour laquelle nous ne pouvons pas utiliser "ceci" dans la méthode statique.

6

Pour que votre code fonctionne, écrivez-le comme ceci:

class Sub {
    static int y;
    public static void foo() {
         Sub.y = 10;
    }
}

Vous pouvez définir des champs statiques dans les méthodes statiques, mais vous n'avez pas accès à this dans la méthode statique car this représente l'instance actuelle de l'objet, et dans une méthode statique vous n'avez pas d'instance .

2
tibtof

Cela signifie "cet" objet mais il n'y en a pas. Dans votre cas, vous pouvez utiliser le nom de classe comme le suggère @tibtof.

2
Peter Lawrey

Je suis d'accord avec toutes les autres personnes qui ont répondu avant moi. Permettez-moi de l'essayer de manière différente pour répondre à ceci:

Je suppose que la méthode d'instance/la méthode non statique appartient à l'instance d'une classe (ce qui signifie tôt ou tard que nous avons besoin de la référence d'objet pour y accéder), donc ce mot-clé a du sens dans le bloc ou la méthode d'instance. Mais le mot-clé statique de tout membre d'une classe est interprété comme un actif direct à la classe auquel un objet, s'il existait, y a alors accès. Donc, dans un contexte statique, il n'est pas sûr que l'objet existe quelque part. C'est pourquoi l'utilisation de cette zone statique à l'intérieur n'est pas autorisée en Java.

0
Utpal Kumar

lorsque nous déclarons que la variable et la méthode sont statiques, cela est partagé entre les objets où ce mot-clé ne pointe que sur l'objet actuel. supposons que vous ayez créé cinq objets de classe foo, puis une seule copie de made of (int y) déchiquetée par all object.so si vous accédez à int y à l'aide de ce mot-clé, le compilateur obtient une ambiguïté sur quel objet doit pointer car l'int statique est partagé par tout objet. vous avez accès à une variable statique en utilisant le nom de classe.

0
anjli rajput

Le mot-clé "this" fait référence à l'objet avec lequel vous travaillez. Dans votre cas, ceci à l'intérieur de n'importe quelle méthode ou constructeur non statique (si vous en avez une et si vous utilisez "this" à l'intérieur de ça), alors "this" fait référence à cette instance particulière de la classe Sub. l'objet est créé. Mais tout dans le contexte statique d'une classe, vous pouvez l'utiliser sans même créer d'objet pour cela car il est résolu lors du chargement de la classe. "ceci" n'est résolu que lorsque l'objet est créé (vous pouvez même dire dynamiquement pour quel objet). Donc "cela" a du sens dans un contexte statique. J'espère que ça aide. Dieu vous protège.

0
sakthisundar

"ce" mot-clé n'est applicable que lorsqu'une instance d'un objet est créée. Et dans la méthode statique, aucune instance n'est créée car la méthode statique appartient à la zone de classe.

0
Rajat Saxena