Pour être précis, j'essayais ce code:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Mais cela a donné l'erreur
Impossible d'accéder au champ non statique dans la méthode statique principale
J'ai donc changé la déclaration de clock
ceci:
static Clock clock = new Clock();
Et ça a marché. Que signifie mettre ce mot-clé avant la déclaration? Que va-t-il faire exactement et / ou restreindre en termes de ce qui peut être fait pour cet objet?
java
static
oop
language-features
restriction
Cliquez Upvote
la source
la source
Réponses:
static
les membres appartiennent à la classe au lieu d'une instance spécifique.Cela signifie qu'une seule instance d'un
static
champ existe [1] même si vous créez un million d'instances de la classe ou si vous n'en créez pas. Il sera partagé par toutes les instances.Étant donné que les
static
méthodes n'appartiennent pas non plus à une instance spécifique, elles ne peuvent pas faire référence aux membres de l'instance. Dans l'exemple donné,main
ne sait pas à quelle instance de laHello
classe (et donc à quelle instance de laClock
classe) il doit se référer.static
les membres ne peuvent se référer qu'auxstatic
membres. Les membres de l'instance peuvent, bien sûr, accéderstatic
membres.Note latérale: Bien sûr, les
static
membres peuvent accéder aux membres d'instance via une référence d'objet .Exemple:
[1]: Selon les caractéristiques d'exécution, il peut s'agir d'un par ClassLoader ou AppDomain ou thread, mais c'est à côté du point.
la source
Cela signifie qu'il n'y a qu'une seule instance de "horloge" dans Hello, pas une pour chaque instance distincte de la classe "Hello", ou plus, cela signifie qu'il y aura une référence "d'horloge" communément partagée entre toutes les instances de la classe "Bonjour".
Donc, si vous deviez faire un "nouveau Bonjour" n'importe où dans votre code: A- dans le premier scénario (avant le changement, sans utiliser "statique"), cela ferait une nouvelle horloge chaque fois qu'un "nouveau Bonjour" est appelé, mais B- dans le deuxième scénario (après le changement, en utilisant "statique"), chaque "nouvelle Bonjour" instance partagerait et utiliserait la référence initiale et identique "d'horloge" créée en premier.
Sauf si vous aviez besoin d'une "horloge" quelque part en dehors du principal, cela fonctionnerait aussi bien:
la source
main()
routine doit être autonome.main
méthode uniquement parce que l'OP l'a fait. Si, à la place, il s'agissait d'une méthode publique appelée ailleurs et que la classe Hello était instanciée plusieurs fois, elle pouvait créer une instance Clock pour chaque instance Hello, sauf si elleclock
était statique.Le
static
mot-clé signifie que quelque chose (un champ, une méthode ou une classe imbriquée) est lié au type plutôt qu'à une instance particulière du type. Ainsi, par exemple, on appelleMath.sin(...)
sans aucune instance de laMath
classe, et en effet vous ne pouvez pas créer une instance de laMath
classe.Pour plus d'informations, consultez la partie pertinente du didacticiel Java d'Oracle .
Sidenote
Java vous permet malheureusement d'accéder aux membres statiques comme s'ils étaient des membres d'instance, par exemple
Cela donne l' impression que
sleep
c'est une méthode d'instance, mais c'est en fait une méthode statique - cela fait toujours dormir le thread actuel. Il est préférable de clarifier cela dans le code appelant:la source
System.out
un nom de type.Le
static
mot clé en Java signifie que la variable ou la fonction est partagée entre toutes les instances de cette classe car elle appartient au type , pas les objets réels eux-mêmes.Donc, si vous avez une variable:
private static int i = 0;
et que vous l'incrémentez (i++
) dans une instance, le changement sera reflété dans toutes les instances.i
sera désormais égal à 1 dans tous les cas.Les méthodes statiques peuvent être utilisées sans instancier un objet.
la source
Utilisation de base des membres statiques ...
C'est ainsi que vous pouvez partager des valeurs dans tous les membres de la classe sans envoyer l'instance de classe Hello à une autre classe. Et avec statique, vous n'avez pas besoin de créer d'instance de classe.
Vous pouvez simplement appeler des valeurs ou des méthodes statiques par nom de classe:
la source
Statique signifie que vous n'avez pas besoin de créer une instance de la classe pour utiliser les méthodes ou variables associées à la classe. Dans votre exemple, vous pouvez appeler:
directement, au lieu de:
De l'intérieur d'une méthode statique (qui appartient à une classe), vous ne pouvez pas accéder aux membres qui ne sont pas statiques, car leurs valeurs dépendent de votre instanciation de la classe. Un objet Clock non statique, qui est un membre d'instance, aurait une valeur / référence différente pour chaque instance de votre classe Hello, et vous ne pouvez donc pas y accéder à partir de la partie statique de la classe.
la source
Statique en Java:
Static est un modificateur sans accès. Le mot-clé statique appartient à la classe que l'instance de la classe. peut être utilisé pour attacher une variable ou une méthode à une classe.
Le mot-clé statique PEUT être utilisé avec:
Méthode
Variable
Classe imbriquée dans une autre classe
Bloc d'initialisation
NE PEUT PAS être utilisé avec:
Classe (non imbriquée)
Constructeur
Interfaces
Méthode classe interne locale (différence puis classe imbriquée)
Méthodes de classe interne
Variables d'instance
Variables locales
Exemple:
Imaginez l'exemple suivant qui a une variable d'instance nommée count qui est incrémentée dans le constructeur:
Production:
Puisque la variable d'instance obtient la mémoire au moment de la création de l'objet, chaque objet aura la copie de la variable d'instance, si elle est incrémentée, elle ne se reflétera pas sur les autres objets.
Maintenant, si nous changeons le nombre de variables d'instance en nombre statique, le programme produira une sortie différente:
Production:
Dans ce cas, la variable statique n'obtiendra la mémoire qu'une seule fois, si un objet modifie la valeur de la variable statique, il conservera sa valeur.
Statique avec finale:
La variable globale qui est déclarée finale et statique reste inchangée pour toute l'exécution. Parce que, les membres statiques sont stockés dans la mémoire de classe et ils ne sont chargés qu'une seule fois dans l'exécution entière. Ils sont communs à tous les objets de la classe. Si vous déclarez des variables statiques comme finales, aucun des objets ne peut changer leur valeur car elle est finale. Par conséquent, les variables déclarées comme finales et statiques sont parfois appelées constantes. Tous les champs des interfaces sont appelés constantes, car ils sont définitifs et statiques par défaut.
Ressource d'image: Statique final
la source
Pour ajouter aux réponses existantes, permettez-moi d'essayer avec une image:
Un taux d'intérêt de 2% est appliqué à TOUS les comptes d'épargne. Il est donc statique .
Un équilibre doit être individuel , il n'est donc pas statique.
la source
Cette discussion a jusqu'à présent ignoré les considérations relatives au chargeur de classe. À strictement parler, les champs statiques Java sont partagés entre toutes les instances d'une classe pour un chargeur de classe donné .
la source
Un champ peut être affecté à la classe ou à une instance d'une classe. Par défaut, les champs sont des variables d'instance. En utilisant
static
le champ devient une variable de classe, il y a donc un et un seulclock
. Si vous apportez des modifications à un seul endroit, il est visible partout. Les variables d'instance sont modifiées indépendamment les unes des autres.la source
Le mot
static
- clé est utilisé pour désigner un champ ou une méthode comme appartenant à la classe elle-même et non à l'instance. À l'aide de votre code, si l'objetClock
est statique, toutes les instances de laHello
classe partageront ceClock
membre de données (champ) en commun. Si vous le rendez non statique, chaque instance individuelle deHello
peut avoir un uniqueClock
champ .Le problème est que vous avez ajouté une méthode principale à votre classe
Hello
afin de pouvoir exécuter le code. Le problème ici est que la méthode principale est statique et en tant que telle, elle ne peut pas faire référence à des champs ou des méthodes non statiques à l'intérieur. Vous pouvez résoudre ce problème de deux manières:Hello
classe statiques afin qu'ils puissent être référencés à l'intérieur du principal méthode . Ce n'est vraiment pas une bonne chose à faire (ou la mauvaise raison pour rendre un champ et / ou une méthode statique)Hello
classe à l'intérieur de la méthode principale et accédez à tous ses champs et méthodes comme ils étaient destinés à l'origine.Pour vous, cela signifie la modification suivante de votre code:
la source
En Java, le
static
mot - clé peut simplement être considéré comme indiquant ce qui suit:Si vous pensez de
static
cette manière, il devient plus facile de comprendre son utilisation dans les différents contextes dans lesquels il est rencontré:Un
static
champ est un champ qui appartient à la classe plutôt qu'à une instance particulièreUne
static
méthode est une méthode qui n'a aucune notion dethis
; il est défini sur la classe et ne connaît aucune instance particulière de cette classe, sauf si une référence lui est transmiseUne
static
classe membre est une classe imbriquée sans aucune notion ou connaissance d'une instance de sa classe englobante (sauf si une référence à une instance de classe englobante lui est transmise)la source
Statique fait du membre d'horloge un membre de classe au lieu d'un membre d'instance. Sans le mot clé statique, vous auriez besoin de créer une instance de la classe Hello (qui a une variable membre d'horloge) - par exemple
la source
les méthodes statiques n'utilisent aucune variable d'instance de la classe dans laquelle elles sont définies. Une très bonne explication de la différence peut être trouvée sur cette page
la source
J'ai développé un penchant pour les méthodes statiques (uniquement, si possible) dans les classes "helper".
La classe appelante n'a pas besoin de créer une autre variable membre (instance) de la classe d'assistance. Vous appelez simplement les méthodes de la classe d'assistance. La classe d'assistance est également améliorée car vous n'avez plus besoin d'un constructeur et vous n'avez besoin d'aucune variable membre (instance).
Il y a probablement d'autres avantages.
la source
la source
Peut également penser à des membres statiques n'ayant pas de pointeur "this". Ils sont partagés entre toutes les instances.
la source
Comprendre les concepts statiques
Seconde classe
la source
main()
est une méthode statique qui a deux restrictions fondamentales:this()
etsuper()
ne peut pas être utilisé dans un contexte statique.la source
Variables statiques accessibles uniquement dans les méthodes statiques, donc lorsque nous déclarons les variables statiques, ces méthodes getter et setter seront des méthodes statiques
les méthodes statiques sont un niveau de classe auquel nous pouvons accéder en utilisant le nom de classe
Voici un exemple pour les getters et setters de variables statiques:
la source
Une question a été posée ici sur le choix du mot «statique» pour ce concept. C'était dupé à cette question, mais je ne pense pas que l'étymologie ait été clairement abordée. Donc...
Cela est dû à la réutilisation des mots clés, en commençant par C.
Considérez les déclarations de données en C (à l'intérieur d'un corps de fonction):
La variable foo est créée sur la pile lorsque la fonction est entrée (et détruite lorsque la fonction se termine). En revanche, le bar est toujours là, donc c'est «statique» dans le sens de l'anglais courant - ça ne va nulle part.
Java et les langages similaires ont le même concept pour les données. Les données peuvent être allouées par instance de la classe (par objet) ou une fois pour la classe entière. Étant donné que Java vise à avoir une syntaxe familière pour les programmeurs C / C ++, le mot clé «statique» est approprié ici.
Enfin, nous arrivons aux méthodes.
Sur le plan conceptuel, il existe une instance de foo () pour chaque instance de la classe C. Il n'y a qu'une seule instance de bar () pour toute la classe C. "est à nouveau un choix judicieux, surtout si vous ne voulez pas ajouter plus de mots-clés réservés à votre langue.
la source