Maison >Java >javaDidacticiel >Exemple de partage d'initialisation de constructeur en Java
Cet article analyse principalement l'initialisation du constructeur en Java à travers des exemples. Le code est très simple et la description est claire. Les amis qui en ont besoin peuvent en savoir plus.
1. Séquence d'initialisation
Lorsque Java crée un objet, le système alloue d'abord de la mémoire pour tous les attributs d'instance de l'objet (à condition que la classe ait été chargée), puis le programme commence à traiter ces instances. attributs. Pour effectuer l'initialisation, la séquence d'initialisation est la suivante : exécutez d'abord le bloc d'initialisation ou la valeur initiale spécifiée lors de la déclaration de l'attribut, puis exécutez la valeur initiale spécifiée dans le constructeur. Au sein d'une classe, l'ordre des définitions de variables détermine l'ordre d'initialisation. Même si les variables sont dispersées entre les définitions de méthodes, elles seront toujours initialisées avant qu'une méthode (y compris le constructeur) ne soit appelée.
class Window { Window(int maker) { System.out.println("Window(" + maker + ")"); } } class House { Window window1 = new Window(1); House() { System.out.println("House()"); w3 = new Window(33); } Window window2 = new Window(2); void f() { System.out.println("f()"); } Window w3 = new Window(3); } public class OrderOfInitialization { public static void main(String[] args) { House h = new House(); h.f(); } }
Résultats d'exécution :
Window(1) Window(2) Window(3) House() Window(33) f()
Comme le montre la sortie, la référence w3 sera initialisé deux fois : une fois avant d'appeler le constructeur et une fois pendant l'appel (le premier objet référencé sera supprimé et ramassé).
2. Initialisation des données statiques
Quel que soit le nombre d'objets créés, les données statiques n'occupent qu'une seule zone de stockage. Le mot-clé static ne peut pas être appliqué aux variables locales, il ne peut donc être appliqué qu'aux domaines.
class Bowl { Bowl(int maker) { System.out.println("Bowl(" + maker + ")"); } void f1(int maker) { System.out.println("f1(" + maker + ")"); } } class Table { static Bowl bowl1 = new Bowl(1); Table() { System.out.println("Table()"); bowl2.f1(1); } void f2(int maker) { System.out.println("f2(" + maker + ")"); } static Bowl bowl2 = new Bowl(2); } class Cupboard { Bowl bowl3 = new Bowl(3); static Bowl bowl4 = new Bowl(4); Cupboard() { System.out.println("CupBoard()"); bowl4.f1(2); } void f3(int maker) { System.out.println("f3(" + maker + ")"); } static Bowl bowl5 = new Bowl(5); } public class StaticInitialization { public static void main(String[] args) { System.out.println("created new Cupboard() in main"); new Cupboard(); System.out.println("created new Cupboard in main"); new Cupboard(); table.f2(1); cupboard.f3(1); } static Table table = new Table(); static Cupboard cupboard = new Cupboard(); }
Résultat d'exécution :
Bowl(1) Bowl(2) Table() f1(1) Bowl(4) Bowl(5) Bowl(3) CupBoard() f1(2) created new Cupboard() in main Bowl(3) CupBoard() f1(2) created new Cupboard in main Bowl(3) CupBoard() f1(2) f2(1) f3(1)
Dans une certaine mesure, l'initialisation est un code à période fixe pour être exécuté, il ne peut accepter aucun paramètre. Par conséquent, le processus d’initialisation effectué par le bloc d’initialisation sur tous les objets de la même classe est exactement le même. Pour cette raison, il n'est pas difficile de trouver l'utilisation de base du bloc d'initialisation. S'il existe un morceau de code de traitement d'initialisation qui est exactement le même pour tous les objets et qui n'a besoin d'accepter aucun paramètre, ce morceau de code de traitement d'initialisation. peut être extrait dans le bloc d’initialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!