Différence entre statique et final?

174

Je suis toujours confus entre staticet les finalmots clés dans java .

Comment sont-ils différents ?

TechnoCorner
la source

Réponses:

238

Le mot-clé static peut être utilisé dans 4 scénarios

  • variables statiques
  • méthodes statiques
  • blocs de code statiques
  • classe imbriquée statique

Regardons d'abord les variables statiques et les méthodes statiques.

Variable statique

  • C'est une variable qui appartient à la classe et non à l'objet (instance).
  • Les variables statiques ne sont initialisées qu'une seule fois, au début de l'exécution. Ces variables seront initialisées en premier, avant l'initialisation de toute variable d'instance.
  • Une seule copie à partager par toutes les instances de la classe.
  • Une variable statique est accessible directement par le nom de la classe et n'a besoin d'aucun objet.
  • Syntaxe: Class.variable

Méthode statique

  • C'est une méthode qui appartient à la classe et non à l'objet (instance).
  • Une méthode statique ne peut accéder qu'aux données statiques. Il ne peut pas accéder aux données non statiques (variables d'instance) sauf s'il a / crée une instance de la classe.
  • Une méthode statique ne peut appeler que d'autres méthodes statiques et ne peut pas appeler une méthode non statique à partir de celle-ci, sauf si elle a / crée une instance de la classe.
  • Une méthode statique est accessible directement par le nom de la classe et n'a besoin d'aucun objet.
  • Syntaxe: Class.methodName()
  • Une méthode statique ne peut en aucun cas faire référence à des mots this- superclés.

Classe statique

Java a également des «classes imbriquées statiques». Une classe imbriquée statique est juste une classe qui n'a pas implicitement de référence à une instance de la classe externe.

Les classes imbriquées statiques peuvent avoir des méthodes d'instance et des méthodes statiques.

Il n'y a pas de classe statique de premier niveau en Java.

Note latérale:

La méthode principale est staticqu'elle doit être accessible pour qu'une application s'exécute avant toute instanciation.

final Le mot-clé est utilisé dans plusieurs contextes différents pour définir une entité qui ne peut pas être modifiée ultérieurement.

  • Une finalclasse ne peut pas être sous-classée. Ceci est fait pour des raisons de sécurité et d'efficacité. En conséquence, de nombreuses classes de bibliothèques standard Java sont final, par exemple, java.lang.Systemet java.lang.String. Toutes les méthodes d'une finalclasse sont implicitement final.

  • Une finalméthode ne peut pas être remplacée par des sous-classes. Ceci est utilisé pour empêcher un comportement inattendu d'une sous-classe modifiant une méthode qui peut être cruciale pour la fonction ou la cohérence de la classe.

  • Une finalvariable ne peut être initialisée qu'une seule fois, via un initialiseur ou une instruction d'affectation. Elle n'a pas besoin d'être initialisée au point de déclaration: c'est ce qu'on appelle une blank finalvariable. Une variable d'instance finale vide d'une classe doit être définitivement affectée à la fin de chaque constructeur de la classe dans laquelle elle est déclarée; de même, une variable statique finale vide doit être définitivement affectée dans un initialiseur statique de la classe dans laquelle elle est déclarée; sinon, une erreur de compilation se produit dans les deux cas.

Remarque: si la variable est une référence, cela signifie que la variable ne peut pas être reliée à nouveau pour référencer un autre objet. Mais l'objet auquel il fait référence est toujours mutable, s'il était à l'origine mutable.

Lorsqu'une classe interne anonyme est définie dans le corps d'une méthode, toutes les variables déclarées finaldans la portée de cette méthode sont accessibles depuis la classe interne. Une fois affectée, la valeur de la variable finale ne peut pas changer.

Ashish
la source
5
(Je ne vous ai pas voté contre) Quelques clarifications supplémentaires: "Une méthode statique ne peut accéder qu'aux données statiques. Elle ne peut pas accéder aux données non statiques (variables d'instance)" - À MOINS qu'elle ne possède / crée une instance de la classe. "Une méthode statique ne peut appeler que d'autres méthodes statiques et ne peut pas en appeler de méthode non statique." - A MOINS qu'il n'ait / crée une instance de la classe.
xagyg
1
dans la méthode statique Explication de la syntaxe que vous avez mentionné à tort je pense. ça pourrait êtreClass.methodName()
Mdhar9e
nous pouvons aussi avoir une classe statique. Corrigez votre réponse. Merci :)
Madhusudan
Depuis Java 8, une classe anonyme (et lambda) peut accéder efficacement aux variables finales et sans restriction de mot-clé final.
akhil_mittal
38

static signifie qu'il appartient à la classe et non à une instance, cela signifie qu'il n'y a qu'une seule copie de cette variable / méthode partagée entre toutes les instances d'une classe particulière .

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

final est totalement indépendant, c'est une manière de définir une initialisation unique. Vous pouvez soit initialiser lors de la définition de la variable, soit dans le constructeur, nulle part ailleurs.

note Remarque sur les méthodes finales et les classes finales, c'est une manière de déclarer explicitement que la méthode ou la classe ne peut pas être remplacée / étendue respectivement.

Lecture supplémentaire Donc sur le thème de la statique, nous parlions des autres utilisations qu'elle peut avoir, elle est parfois utilisée dans des blocs statiques. Lors de l'utilisation de variables statiques, il est parfois nécessaire de définir ces variables avant d'utiliser la classe, mais malheureusement, vous n'obtenez pas de constructeur. C'est là qu'intervient le mot-clé static.

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

Vous ne devez pas confondre cela avec les blocs d'initialisation d'instance qui sont appelés avant le constructeur par instance.

Jon Taylor
la source
Suite à l'entrée fournie par vous est en mesure de dissiper toute confusion grâce ...final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
prashant thakre
2
Simple et clair comme les choses devraient être. La réponse acceptée est juste ... verbeuse.
22

Les deux ne sont vraiment pas similaires. staticLes champs sont des champs qui n'appartiennent à aucune instance particulière d'une classe .

class C {
    public static int n = 42;
}

Ici, le staticchamp nn'est associé à aucune instance particulière de Cmais à la classe entière en général (c'est pourquoi il C.npeut être utilisé pour y accéder). Pouvez-vous toujours utiliser une instance de Cpour accéder n? Oui, mais ce n'est pas considéré comme une pratique particulièrement bonne.

final d'autre part indique qu'une variable particulière ne peut pas changer après avoir été initialisée.

class C {
    public final int n = 42;
}

Ici, nne peut pas être réaffecté parce que c'est le cas final. Une autre différence est que n'importe quelle variable peut être déclarée final, alors que toutes les variables ne peuvent pas être déclarées statiques.

En outre, les classes peuvent être déclarées, finalce qui indique qu'elles ne peuvent pas être étendues:

final class C {}

class B extends C {}  // error!

De même, les méthodes peuvent être déclarées finales pour indiquer qu'elles ne peuvent pas être remplacées par une classe étendue:

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}
arshajii
la source
Merci pour les contributions. Le code donne une erreur: classe C {public static int n = 42; } il indique que le champ ne peut pas déclarer statique en type non statique. Pourquoi ne puis-je pas déclarer ou faire du Cn?
TechnoCorner
@TechnoCorner seules les classes de premier niveau (la publicclasse potentiellement qui définit le fichier) ou staticles classes internes peuvent définir des staticvariables. Les autres classes internes sont des instances de la classe externe et ne peuvent pas avoir de variables statiques.
zapl
17

final -

1) Lorsque nous appliquons le mot-clé « final » à une variable , la valeur de cette variable reste constante. (ou) Une fois que nous déclarons une variable comme finale, la valeur de cette variable ne peut pas être modifiée.

2) Il est utile lorsqu'une valeur de variable ne change pas pendant la durée de vie d'un programme

statique -

1) lorsque nous appliquons un mot-clé " statique " à une variable , cela signifie qu'il appartient à la classe.
2) Lorsque nous appliquons le mot-clé " statique " à une méthode , cela signifie que la méthode est accessible sans créer d'instance de la classe

Rohit
la source
12

static signifie qu'il n'y a qu'une seule copie de la variable en mémoire partagée par toutes les instances de la classe.

Le finalmot clé signifie simplement que la valeur ne peut pas être modifiée. Sans final, tout objet peut modifier la valeur de la variable.

Emmanuel Osimosu
la source
3

Static et final ont de grandes différences:

Les variables ou classes statiques seront toujours disponibles (à peu près) n'importe où. Final n'est qu'un mot clé qui signifie qu'une variable ne peut pas être modifiée. Donc si avait:

public class Test{    
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

Le programme s'exécutait jusqu'à ce qu'il essaie de changer le "premier" entier, ce qui provoquerait une erreur. En dehors de cette classe, vous n'auriez accès à la "première" variable que si vous aviez instancié la classe. Ceci est en contraste avec "second", qui est disponible tout le temps.

alistair
la source
3

Pensez à un objet comme un haut-parleur. Si Speaker est une classe, il aura différentes variables telles que le volume, les aigus, les graves, la couleur etc. Vous définissez tous ces champs lors de la définition de la classe Speaker. Par exemple, vous avez déclaré le champ de couleur avec un modificateur statique, ce qui signifie que vous dites au compilateur qu'il existe exactement une copie de cette variable, quel que soit le nombre de fois où la classe a été instanciée.

Déclarer

static final String color = "Black"; 

s'assurera que chaque fois que cette classe est instanciée, la valeur du champ de couleur sera "Black" à moins qu'elle ne soit pas modifiée.

public class Speaker {

static String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //will provide output as "Black"
            Speaker.color = "white";
    System.out.println(Speaker.color);  //will provide output as "White"
}}

Remarque: Maintenant, une fois que vous changez la couleur du haut-parleur comme final, ce code ne s'exécutera pas, car le mot-clé final garantit que la valeur du champ ne change jamais.

public class Speaker {

static final String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //should provide output as "Black"
            Speaker.color = "white"; //Error because the value of color is fixed.  
    System.out.println(Speaker.color); //Code won't execute.
}}

Vous pouvez copier / coller ce code directement dans votre émulateur et essayer.

vishnulphb
la source
2

Différence facile,

Final : signifie que la valeur de la variable est finale et qu'elle ne changera nulle part. Si vous dites que x final = 5, cela signifie que x ne peut pas être modifié, sa valeur est définitive pour tout le monde.

Statique: signifie qu'il n'a qu'un seul objet. supposons que vous ayez x = 5, en mémoire il y a x = 5 et son présent à l'intérieur d'une classe. si vous créez un objet ou une instance de la classe, ce qui signifie là une boîte spécifique qui représente cette classe et ses variables et méthodes. et si vous créez un autre objet ou une autre instance de cette classe, cela signifie qu'il y a deux boîtes de cette même classe qui ont des x différents à l'intérieur dans la mémoire. et si vous appelez les deux x dans des positions différentes et modifiez leur valeur, leur valeur sera différente. la boîte 1 a x qui a x = 5 et la boîte 2 a x = 6. mais si vous rendez le x statique, cela signifie qu'il ne peut pas être créé à nouveau. vous pouvez créer un objet de classe mais cet objet n'aura pas de x différent en eux. si x est statique, la case 1 et la case 2 auront toutes deux le même x qui vaut 5. Oui, je peux changer la valeur de statique n'importe où car ce n'est pas définitif. donc si je dis que la boîte 1 a x et que je change sa valeur en x = 5 et après cela je crée une autre boîte qui est box2 et je change la valeur de box2 x en x = 6. alors comme X est statique, les deux boîtes ont le même x. et les deux boîtes donneront la valeur de la boîte à 6 car box2 écrase la valeur de 5 à 6.

Le final et le statique sont totalement différents. La finale qui est définitive ne peut pas être modifiée. statique qui restera comme un mais peut être changé.

"Ceci est un exemple. Rappelez-vous que les variables statiques sont toujours appelées par leur nom de classe. Parce qu'elles ne sont qu'une pour tous les objets de cette classe. Donc la classe A a x = 5, je peux l'appeler et la changer par Ax = 6; "

Malick Usman
la source
1

La statique est quelque chose que tout objet d'une classe peut appeler, qui appartient intrinsèquement à un type d'objet.

Une variable peut être définitive pour une classe entière, ce qui signifie simplement qu'elle ne peut plus être modifiée. Il ne peut être défini qu'une seule fois, et essayer de le définir à nouveau entraînera une erreur. C'est utile pour un certain nombre de raisons, peut-être que vous souhaitez déclarer une constante, qui ne peut pas être modifiée.

Quelques exemples de code:

class someClass
{
   public static int count=0;
   public final String mName;

   someClass(String name)
   {
     mname=name;
     count=count+1;
   }

  public static void main(String args[])
  {
    someClass obj1=new someClass("obj1");
    System.out.println("count="+count+" name="+obj1.mName);
    someClass obj2=new someClass("obj2");
    System.out.println("count="+count+" name="+obj2.mName);
  }
}

Wikipedia contient la liste complète des mots-clés java .

PearsonArtPhoto
la source
Que voulez-vous dire pour un objet particulier? Pouvez-vous s'il vous plaît illustrer.
TechnoCorner
0

Je n'essaierai pas de donner une réponse complète ici. Ma recommandation serait de se concentrer sur la compréhension de ce que chacun d'eux fait et ensuite il devrait être clair de voir que leurs effets sont complètement différents et pourquoi parfois ils sont utilisés ensemble.

staticest pour les membres d'une classe (attributs et méthodes) et il doit être compris par opposition aux membres d'instance (non statiques). Je vous recommande de lire "Comprendre les membres de l'instance et de la classe" dans les didacticiels Java. Je peux aussi être utilisé dansstatic blocs mais je ne m'inquiéterais pas pour un début.

finala des significations différentes selon qu'il s'applique à des variables, des méthodes, des classes ou d'autres cas. Ici, j'aime mieux les explications de Wikipedia .

madth3
la source
-1

Les valeurs des variables statiques peuvent être modifiées même si une copie de la variable traverse l'application, tandis que les valeurs des variables finales peuvent être initialisées une fois et ne peuvent pas être modifiées dans toute l'application.

Avilir Paul
la source