Maison  >  Article  >  Java  >  Explication détaillée des différences entre les modificateurs Java abstract, static et final

Explication détaillée des différences entre les modificateurs Java abstract, static et final

高洛峰
高洛峰original
2017-01-24 15:42:101510parcourir

static signifie statique, qui peut modifier les propriétés, les méthodes et les blocs de code.

1.static modifie l'attribut (variable de classe), puis cet attribut est accessible en utilisant le nom de la classe. Nom de l'attribut, ce qui signifie que cet attribut devient une variable de classe de cette classe et est partagé par les objets de cette classe classe. Cet attribut est public pour toutes les classes. (Les variables de classe partagées n'ont rien à voir avec les objets, seulement les classes).

Pendant le processus de chargement de la classe, la classe elle-même est également enregistrée dans le fichier (le fichier de bytecode enregistre les informations de classe). Java lira le fichier de classe (fichier de bytecode) via le flux d'E/S (java. machine virtuelle), ce processus devient un chargement de classe. JVM (machine virtuelle Java) trouvera les fichiers de bytecode via le chemin de classe (CLASSPATH).

Les variables de classe seront automatiquement initialisées lors du chargement. Les règles d'initialisation sont les mêmes que les variables d'instance.

Remarque : les variables d'instance dans une classe sont initialisées lorsque l'objet est créé. Les propriétés modifiées par statique, c'est-à-dire les variables de classe, sont créées et initialisées lorsque la classe est chargée. Le processus de chargement de la classe est unique. Autrement dit, les variables de classe ne seront créées qu'une seule fois.

2.La méthode modifiée statique (méthode statique) rendra cette méthode publique à toute la classe et sera accessible en utilisant le nom de la classe.le nom de la méthode.

Remarque : les méthodes statiques modifiées ne peuvent pas accéder directement aux membres non statiques (statiques) (y compris les méthodes et les propriétés) de cette classe. Les méthodes non statiques (statiques) de cette classe peuvent accéder aux membres statiques de cette classe (. y compris les méthodes et les propriétés), des méthodes statiques peuvent être appelées. Les méthodes statiques doivent être utilisées avec prudence. Ce mot-clé ne peut pas apparaître dans les méthodes statiques.

Remarque : la classe parent est une méthode statique et ne peut pas être remplacée en tant que méthode non statique dans la sous-classe sous réserve de respecter les règles de couverture, dans la classe parent, la méthode statique dans le parent. la classe peut être statique dans la sous-classe, mais pas de polymorphisme. (Lorsque vous utilisez un objet pour appeler une méthode statique, vous appelez en fait une méthode statique du type au moment de la compilation)

Remarque : dans les classes parent et enfant, les méthodes statiques ne peuvent être remplacées que par des méthodes statiques. classes parent et enfant, les méthodes non statiques ne peuvent être remplacées que par des méthodes non statiques.

La méthode main en Java doit être écrite comme statique car l'objet ne peut pas être créé lorsque la classe est chargée. Étant donné que les méthodes statiques peuvent être appelées sans objets, elles se trouvent dans la méthode principale de la classe. Lorsque la classe est chargée, le programme peut être exécuté via l'entrée de la méthode principale.

3.static modifie le bloc de code initial. À l'heure actuelle, ce bloc de code initial est appelé bloc de code initial statique. Ce bloc de code n'est exécuté qu'une seule fois lorsque la classe est chargée. Vous pouvez initialiser une classe avec un bloc d'initialisation statique.

Bloc de code d'initialisation dynamique, écrit dans le "{}" dans le corps de la classe, ce bloc de code est exécuté lorsque les propriétés d'initialisation de l'objet généré sont générées. Ce type de bloc de code est appelé bloc de code d’initialisation dynamique.

Quand la classe sera-t-elle chargée ? La classe sera chargée lors de la création d'un objet. La classe sera également chargée lors de l'appel de méthodes statiques dans la classe ou de l'accès aux propriétés statiques. Lors du chargement d'une sous-classe, la classe parent doit être chargée en premier. Le chargement de classe a un principe de chargement paresseux, et elle ne sera chargée que lorsqu'elle doit l'être.

le modificateur final peut modifier les variables, les méthodes, les classes

1.variables finales modifiées
Les variables modifiées par fianl deviendront des constantes (les constantes doivent être en majuscules). (vous pouvez attribuer une valeur directement lors de l'initialisation, ou vous pouvez attribuer une valeur dans le constructeur. Vous ne pouvez choisir qu'une de ces deux méthodes, et vous devez attribuer une valeur à la constante. Les constantes de fianl n'auront pas de valeur par défaut). valeur initiale. Le modificateur final est souvent utilisé avec le modificateur statique lors de l'attribution de valeurs directement lors de l'initialisation.

2. Méthode modifiée par final. La méthode modifiée par final ne sera pas remplacée par ses sous-classes, et la stabilité de la méthode ne peut pas être remplacée.
3. Classe modifiée finale. Les classes modifiées par final ne seront pas héritées. Les méthodes des cours finaux sont également définitives.

Remarque : final ne peut pas être utilisé pour modifier le constructeur. S'il y a des attributs constants dans la classe parent, le chargement de la classe parent ne sera pas effectué lors de l'utilisation d'attributs constants dans la sous-classe.

Mode invariant, les propriétés de l'objet ne changeront pas une fois créé. Utilisez final pour modifier les propriétés, utilisez également final pour modifier les classes (mode d'immuabilité forte) et utilisez final pour modifier les propriétés (mode d'immuabilité faible).

Incarnation typique du mode immuable : classe java.lang.String, le mode immuable peut réaliser le partage d'objets (une instance d'objet peut être affectée à plusieurs variables d'objet)

Pooled L'idée est de mettre le données qui doivent être partagées dans le pool (économiser de l'espace, partager des données)
Seule la classe String peut créer des objets avec des valeurs littérales dans "". Dans la classe String, lorsqu'elle est créée avec une valeur littérale, elle sera recherchée dans l'espace du pool de chaînes de l'espace des méthodes Java, s'il y en a un, l'adresse de la chaîne dans le pool de chaînes sera renvoyée, et cette adresse. sera versé à la variable objet. Sinon, un objet chaîne sera créé dans le pool de chaînes et son adresse sera renvoyée à la variable d'objet d'achat. Lorsqu'un autre objet est créé avec une valeur littérale, le processus ci-dessus sera répété.
Si new crée un objet de classe String dans l'espace du tas, le processus ci-dessus ne se produira pas.

La méthode intern() de la classe String comparera la chaîne de l'objet de classe String créé dans l'espace de tas avec le pool de chaînes. S'il y a la même chaîne, renverra la chaîne à l'adresse du pool de chaînes. .

Le mode invariant est assez gênant lors de la modification et de l'ajout d'opérations sur des objets, et il générera beaucoup d'objets indésirables intermédiaires. Les frais généraux liés à la création et à la destruction de ressources sont considérables.

La classe String est très inefficace lors de la connexion de chaînes car les propriétés des objets qu'elle génère ne peuvent pas être modifiées. Lors de la connexion de chaînes, seuls de nouveaux objets peuvent être créés.

Pour de nombreuses connexions de chaînes, la classe StringBuffer doit être utilisée. Lors de l'utilisation d'objets de cette classe pour effectuer des connexions de chaînes, aucun objet intermédiaire redondant ne sera généré, optimisant ainsi l'efficacité.

Le modificateur abstrait (abstrait) peut modifier les classes et les méthodes
1.Le modificateur abstrait fera de cette classe une classe abstraite. Cette classe ne pourra pas générer d'instances d'objet, mais elle pourra être utilisée comme variables d'objet. .Le type déclaré, c'est-à-dire le type au moment de la compilation, la classe abstraite est comme un produit semi-fini d'une classe, et les sous-classes doivent hériter et remplacer les méthodes abstraites qu'elle contient.

2. La méthode de modification abstraite fera de cette méthode une méthode abstraite, c'est-à-dire qu'elle n'a qu'une déclaration (définition) mais aucune implémentation. La partie implémentation est remplacée par ";". Nécessite que les sous-classes héritent de l'implémentation (remplacement).

Remarque : les classes avec des méthodes abstraites doivent être des classes abstraites. Cependant, les méthodes abstraites ne sont pas nécessairement toutes des méthodes abstraites, elles peuvent aussi être des méthodes concrètes.
Le modificateur abstrait doit être placé avant le nom de la classe lors de la modification d'une classe.

La méthode de modification abstraite nécessite que ses sous-classes remplacent (implémentent) cette méthode. Lors de l'appel, vous pouvez appeler la méthode couverte (implémentée) par la sous-classe de manière polymorphe, ce qui signifie que la méthode abstraite doit être implémentée dans sa sous-classe, à moins que la sous-classe elle-même ne soit également une classe abstraite.

Remarque : la classe parent est une classe abstraite avec des méthodes abstraites. Ensuite, la sous-classe hérite de la classe parent et implémente (remplace) toutes les méthodes abstraites de la classe parent. Ce n'est qu'alors que la sous-classe peut créer des instances d'objets. capacités, sinon la sous-classe doit également être une classe abstraite. Une classe abstraite peut avoir une méthode constructeur, qui est la méthode constructeur de la classe parent (classe abstraite) que la sous-classe doit appeler lors de la construction de l'objet de sous-classe.

Final et abstrait, privé et abstrait, statique et abstrait, ce sont des modificateurs qui ne peuvent pas être assemblés, car la méthode modifiée par abstract doit être implémentée (remplacée) dans sa sous-classe pour être polymorphe. Appel, le Les modificateurs ci-dessus ne peuvent pas être remplacés par les sous-classes lors de la modification de la méthode. Final ne peut pas être remplacé par les sous-classes, il ne peut donc pas être remplacé par Static, mais il sera appelé lors de l'appel. parce que les méthodes de la classe parent sont appelées et que les méthodes de la classe parent sont des méthodes abstraites et ne peuvent pas être appelées, leurs modificateurs ne peuvent pas être rassemblés.

La méthode abstraite représente un certain standard, définit le standard, définit la fonction et implémente la fonction dans la sous-classe (la sous-classe hérite de la classe parent et doit fournir l'implémentation de la méthode abstraite héritée de la classe parent ).
La méthode ne peut pas être réalisée pendant un certain temps, ou elle est destinée à être implémentée par des sous-classes et définit un certain standard. Cette méthode peut être définie comme abstraite. (résumé)

Modèle de méthode de modèle
Utilisez le résumé pour séparer la formulation des normes et la mise en œuvre des normes. La formulation des normes est le modèle et la mise en œuvre est mise en œuvre selon la norme du modèle, c'est-à-dire. , héritant du modèle et réalisant les fonctions correspondantes dans la méthode modèle. Les méthodes qui ne peuvent pas être modifiées dans le modèle peuvent être modifiées avec fianl. Cette méthode ne peut pas créer de méthodes abstraites. Pour garantir la sécurité et l'encapsulation, les parties non publiques du modèle doivent être modifiées avec protected.

Pour des explications plus détaillées sur les différences entre les modificateurs Java abstrait, statique et final, veuillez faire attention au site Web PHP chinois pour les articles connexes !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn