Que fait le mot clé "statique" dans une classe?

pour être précis, j'ai essayé ce code:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

mais il a donné l'erreur

impossible d'accéder au champ non statique dans la méthode principale statique

donc j'ai changé la déclaration de clock en ceci:

static Clock clock = new Clock();

et ça a marché. Que signifie mettre ce mot-clé avant la déclaration? Que va-t-elle faire exactement et/ou limiter en termes de ce qui peut être fait à cet objet?

378
demandé sur Hamid Pourjam 2009-01-05 20:41:38

21 réponses

static membres appartiennent à la classe au lieu d'une instance spécifique.

cela signifie que il n'existe qu'une seule instance d'un champ static [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.

puisque les méthodes static n'appartiennent pas non plus à une instance spécifique, elles ne peuvent pas se référer à des membres d'instance (comment tu sais à quelle instance tu veux te référer?). Les membres static ne peuvent faire référence qu'aux membres static . Les membres d'Instance peuvent, bien sûr, accéder aux membres static .

note de Côté: bien sûr, static les membres ont accès les membres de l'instance par l'intermédiaire d'un objet de référence .

exemple:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]: selon les caractéristiques d'exécution, il peut être un par ClassLoader ou AppDomain ou thread, mais c'est à côté du point.

560
répondu Mehrdad Afshari 2015-12-08 12:29:21

cela signifie qu'il n'y a qu'une seule instance de" clock "dans Hello, pas une par chaque instance séparée de la classe" Hello", ou plus-donc, cela signifie qu'il y aura une référence commune de" clock "parmi toutes les instances de la classe" Hello".

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 "static"), il ferait une nouvelle horloge chaque fois qu'un "nouveau Bonjour" est appelé, mais B - dans la seconde scénario (après le changement, en utilisant "static"), chaque instance "New Hello" partagerait et utiliserait toujours la référence initiale et la même "horloge" créée.

à moins que vous ayez besoin de "Horloge" quelque part en dehors de main, cela fonctionnerait aussi bien:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}
125
répondu Paul Tomblin 2016-12-21 16:57:45

le mot-clé static signifie que quelque chose (un champ, une méthode ou une classe imbriquée) est lié au type plutôt que n'importe quelle instance du type. Ainsi par exemple, on appelle Math.sin(...) sans aucune instance de la classe Math , et en effet vous ne pouvez pas créer une instance de la classe Math .

pour plus d'informations, voir le Java Tutorial .


Sidenote

Java malheureusement vous permet d'accéder aux membres statiques comme s'ils étaient des membres d'instance, par exemple

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

qui le fait regarder comme si sleep est une méthode d'instance, mais il est en fait une méthode statique - il toujours fait le fil courant dormir. Il est préférable de le préciser dans le code d'appel:

// Clearer
Thread.sleep(5000);
92
répondu Jon Skeet 2015-04-24 22:39:14

le mot-clé static 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 eux-mêmes.

donc si vous avez une variable: private static int i = 0; et que vous l'incrémentez ( i++ ) dans une seule instance, le changement sera reflété dans toutes les instances. i sera désormais 1 dans tous les cas.

Les méthodes statiques

peuvent être utilisées sans l'instanciation d'un objet.

38
répondu geowa4 2009-07-04 06:46:34

utilisation de Base de la statique des membres...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

C'est comme ça que vous pouvez avoir des valeurs partagées dans tous les membres de la classe sans envoyer l'instance Hello à une autre classe. Et whit static vous n'avez pas besoin de créer une instance de classe.

Hello hello = new Hello();
hello.staticValue = "abc";

vous pouvez simplement appeler des valeurs statiques ou des méthodes par le nom de classe:

Hello.staticValue = "abc";
21
répondu Vasil Valchev 2015-12-08 12:22:49

statique signifie que vous n'avez pas à créer une instance de la classe pour utiliser les méthodes ou variables associées à la classe. Dans votre exemple, vous pouvez appeler:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

directement, au lieu de:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

de l'intérieur d'une méthode statique (qui appartient à une classe) vous ne pouvez pas accéder à des membres qui ne sont pas statiques, puisque leurs valeurs dépendent de votre instanciation de la classe. Un objet D'horloge non statique, qui est une instance Membre, aurait une valeur/référence différente pour chaque instance de votre classe Hello, et donc vous ne pouviez pas y accéder à partir de la partie statique de la classe.

19
répondu Elie 2018-04-01 09:34:53

Statique en Java:

Statique est un Non Modificateur d'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 d'une Classe.

le mot-clé statique peut être utilisé avec:

Méthode

Variable

classe imbriquée dans une autre classe

Initialisation de la Bloc

ne peut pas être utilisé avec:

Classe (Non Emboîtée)

constructeur

Interfaces

méthode Classe intérieure locale (différence puis classe imbriquée)

Intérieure méthodes de la Classe

Instance Variables

Variables Locales

exemple:

imaginez l'exemple suivant qui a une variable d'instance appelée count qui est incrémentée dans le constructeur:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

sortie:

1 1 1

puisque la variable d'instance reçoit 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 reflétera pas à d'autres objet.

maintenant si nous changer le nombre de variables d'instance à une statique alors le programme produira une sortie différente:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

sortie:

1 2 3

dans ce cas, la variable statique n'obtiendra la mémoire qu'une seule fois, si un objet change la valeur de la variable statique, il conservera sa valeur.

statique avec Finale:

la variable globale qui est déclarée comme finale et statique reste inchangée pour l'exécution entière. Parce que, les membres statiques sont stockés dans la mémoire de la classe et ils ne sont chargés qu'une seule fois dans toute l'exécution. Ils sont communs à tous les objets de la classe. Si vous déclarez des variables statiques comme définitive, aucun des objets ne peuvent pas changer leur valeur finale. Par conséquent, les variables déclarées comme finale et statique sont parfois appelés constantes. Tous les champs d'interfaces sont appelés constantes, car ils sont finaux et statiques par défaut.

enter image description here

Image Ressource : "1519850920 Final" Statique

17
répondu Aftab Virtual 2016-08-14 13:03:23

cette discussion a jusqu'à présent ignoré les considérations classloader. À proprement parler, les champs statiques Java sont partagés entre toutes les instances D'une classe pour un classloader .

13
répondu Julien Chastang 2009-01-05 18:14:03

pour ajouter aux réponses existantes, laissez-moi essayer avec une image:

un taux d'intérêt de 2% est appliqué à tous les comptes d'épargne. Par conséquent, il est statique .

Un équilibre doit être individu , il est pas statique.

enter image description here

11
répondu Andrejs 2017-12-12 21:00:16

Un champ peuvent être attribuées à 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, donc il y a une et une seule clock . Si vous faites un changement à un endroit, il est visible partout. Les variables d'Instance sont modifiées indépendamment les unes des autres.

7
répondu sblundy 2009-01-05 17:48:41

en Java, le mot-clé static peut être simplement considéré comme indiquant ce qui suit:

"sans égard ou de la relation d'un cas particulier"

si vous pensez à static de cette façon, 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'à un cas particulier

  • Un static est une méthode qui n'a aucune notion de this ; elle est définie sur la classe et ne savez pas au sujet de toute instance de cette classe, sauf si une référence est passé

  • Un static membre de la classe est une classe imbriquée sans aucune notion ou la connaissance d'une instance de sa classe englobante (à moins qu'une référence à un enfermant instance de classe est passé)

6
répondu scottb 2015-10-03 16:15:32

Statique rend l'horloge membre un membre de la classe au lieu d'un membre de l'instance. Sans le mot-clé statique, vous auriez besoin de créer une instance de la classe Hello (qui a une variable membre clock) - par exemple

Hello hello = new Hello();
hello.clock.sayTime();
5
répondu Stephen Doyle 2009-01-05 17:45:58

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

5
répondu Marc Novakowski 2009-01-05 17:45:58

j'ai développé un goût pour les méthodes statiques (seulement, si possible) dans les classes" helper".

la classe calling n'a pas besoin de créer une autre variable member (instance) de la classe helper. Vous appelez juste les méthodes de la classe helper. Aussi la classe helper est améliorée parce que vous n'avez plus besoin d'un constructeur, et vous n'avez pas besoin de membre (exemple) variables.

Il y a probablement d'autres avantages.

5
répondu javaguy 2012-12-17 20:54:46

le mot-clé static est utilisé pour désigner un champ ou une méthode comme appartenant à la classe elle-même et non l'instance. En utilisant votre code, si l'objet Clock est statique, toutes les instances de la classe Hello partageront ce Clock membre de données (champ) en commun. Si vous le rendez non statique, chaque instance individuelle de Hello peut avoir un champ unique Clock .

le problème est que vous avez ajouté un principal méthode de votre classe Hello afin que vous puissiez 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 se référer à des champs non-statiques ou des méthodes à l'intérieur de celui-ci. Vous pouvez résoudre cela de deux façons:

  1. Faire tous les champs et méthodes de la Hello classe statique de sorte qu'ils peuvent être renvoyés à l'intérieur de la principal la méthode. Ce n'est vraiment pas une bonne chose pour faire (ou de la mauvaise raison que t en faire un terrain et/ou une méthode statique)
  2. créez une instance de votre classe Hello à l'intérieur de la méthode principale et accédez à tous ses champs et méthodes de la façon dont ils étaient prévus en premier lieu.

pour vous, cela signifie le changement de code suivant:

package hello;

public class Hello {

    private Clock clock = new Clock();

    public Clock getClock() {
        return clock;
    }

    public static void main(String args[]) {
        Hello hello = new Hello();
        hello.getClock().sayTime();
    }
}
5
répondu hfontanez 2014-11-12 19:50:25

peut aussi penser à des membres statiques n'ayant pas de pointeur" ceci". Elles sont partagées entre toutes les instances.

3
répondu kal 2009-01-05 19:36:22

comprendre les concepts statiques

public class StaticPractise1 {
    public static void main(String[] args) {
        StaticPractise2 staticPractise2 = new StaticPractise2();
        staticPractise2.printUddhav(); //true
        StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */

        StaticPractise2.printUddhavsStatic1(); //true
        staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */

    }
}

Deuxième Classe

public class StaticPractise2 {
    public static void printUddhavsStatic1() {
        System.out.println("Uddhav");
    }

    public void printUddhav() {
        System.out.println("Uddhav");
    }
}
3
répondu Uddhav Gautam 2017-04-04 05:48:02

main() est une méthode statique qui comporte deux restrictions fondamentales:

  1. la méthode statique ne peut pas utiliser un élément de données non statique ou appeler directement une méthode non statique.
  2. this() et super() ne peut pas être utilisé dans le contexte statique.

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }
    

Sortie: Erreur De Compilation Dans Le Temps

2
répondu Bharthan 2018-04-02 06:17:37

les Variables statiques ne peuvent être consultées que dans les méthodes statiques, donc quand nous déclarons les variables statiques ces méthodes getter et setter seront des méthodes statiques

méthodes statiques est un niveau de classe que nous pouvons accéder en utilisant le nom de classe

exemple pour les variables statiques Getters et Setters:

public class Static 
{

    private static String owner;
    private static int rent;
    private String car;
    public String getCar() {
        return car;
    }
    public void setCar(String car) {
        this.car = car;
    }
    public static int getRent() {
        return rent;
    }
    public static void setRent(int rent) {
        Static.rent = rent;
    }
    public static String getOwner() {
        return owner;
    }

    public static void setOwner(String owner) {
        Static.owner = owner;
    }

}
1
répondu Bala Krishna 2016-11-11 21:15:16

quand exécuter quelque projet d'abord charger des choses statiques (variables, méthodes, blocs..).

lors de l'exécution de ce projet principale méthode charge d'abord. Parce que c'est static method . Puis il regarde objet "a" object .Mais l'objet d'un définissent pas encore. En raison de sa non-statiques. Alors viens comme cette erreur.

0
répondu Dev4World 2017-10-26 06:35:17
//Here is an example 

public class StaticClass 
{
    static int version;
    public void printVersion() {
         System.out.println(version);
    }
}

public class MainClass 
{
    public static void main(String args[]) {  
        StaticClass staticVar1 = new StaticClass();
        staticVar1.version = 10;
        staticVar1.printVersion() // Output 10

        StaticClass staticVar2 = new StaticClass();
        staticVar2.printVersion() // Output 10
        staticVar2.version = 20;
        staticVar2.printVersion() // Output 20
        staticVar1.printVersion() // Output 20
    }
}
0
répondu Mohammad Parvez 2018-09-18 12:59:33