Java: processus de création d'objets et d'initialisation
1. Types de données en Java
Il existe 3 types de données dans Java: les types de données de base (en Java, Boolean, Byte, Short, INT, Long, Char, Float et Double sont des types de données de base), le type de référence et le type nul. Parmi eux, le type de référence comprend le type de classe (y compris le tableau) et le type d'interface.
L'énoncé suivant déclare certaines variables:
int k; a a; // a est le nom de variable d'objet du type de données A. B B1, B2,…, B10000; // Supposons que B est une classe ou une interface abstraite. String S;
Remarque: Dans la perspective des types de données et des variables, les variables de type de données de base K, les variables de type de classe A et S, la classe abstraite ou la variable de type d'interface B (10 000), sont toutes des variables (identifiants).
2. À propos de la poignée
Pour distinguer les identificateurs variables des types de référence et les identificateurs variables du type de données de base, nous utilisons spécifiquement la poignée pour nommer des identificateurs de variables des types de référence. Dans l'exemple ci-dessus, B1 à B10000, A et S sont tous manche. La poignée regarde intuitivement la poignée et la poignée. Nous utilisons la traduction chinoise couramment utilisée de "manche" dans le monde de l'ordinateur.
2.1 [Dans la programmation Windows] La signification d'une poignée est un entier unique utilisé par les merveilles pour identifier les objets créés ou utilisés par une application. Windows utilise diverses poignées pour identifier, telles que les instances d'application, les fenêtres, les contrôles, les bitmaps, les objets GDI, etc. La poignée Windows est un peu comme une poignée de fichier dans le langage C.
D'après la définition ci-dessus, nous pouvons voir que la poignée est un identifiant qui est utilisé pour identifier un objet ou un projet. C'est comme notre nom. Tout le monde en aura un. Différentes personnes ont des noms différents, mais il peut également y avoir quelqu'un du même nom que vous. À partir du type de données, il s'agit juste d'un entier non signé 16 bits. Une application obtient presque toujours une poignée en appelant une fonction Windows, qui peut ensuite être utilisée par d'autres fonctions Windows pour référencer l'objet correspondant.
Si vous voulez connaître les poignées plus approfondies, je peux vous dire que les poignées sont des pointeurs vers des pointeurs. Nous savons que le soi-disant pointeur est une adresse mémoire. Une fois l'application démarrée, les objets qui composent le programme résident en mémoire. Si nous le comprenons simplement, il semble que tant que nous connaissons la première adresse de cette mémoire, nous pouvons utiliser cette adresse pour accéder à l'objet à tout moment. Mais si vous le pensez vraiment, vous vous trompez. Nous savons que Windows est un système d'exploitation virtuel basé sur la mémoire. Dans cet environnement système, Windows Memory Manager déplace souvent des objets dans les deux sens pour répondre aux besoins en mémoire de diverses applications. Un objet est déplacé signifie que son adresse a changé. Si l'adresse change toujours comme ceci, où devrions-nous trouver l'objet?
Pour résoudre ce problème, le système d'exploitation Windows libère certaines adresses de stockage internes pour chaque application afin d'enregistrer spécifiquement les modifications d'adresse de chaque objet d'application en mémoire, et cette adresse (l'emplacement de l'unité de stockage) elle-même reste inchangée. Après avoir déplacé l'emplacement de l'objet en mémoire, le Windows Memory Manager indique la nouvelle adresse de l'objet pour l'enregistrer. De cette façon, nous devons seulement nous souvenir de cette adresse de poignée pour savoir indirectement où l'objet est en mémoire. Cette adresse est attribuée par le système lorsque l'objet est chargé (charge) et est libéré au système lorsque le système est déchargé.
Manipuler l'adresse (stable) → Enregistrer l'adresse de l'objet dans la mémoire ou la mémoire
2.2 La signification des poignées en Java a une compréhension approfondie de la signification des poignées [dans la programmation Windows]. Nous pouvons dire que la poignée est un terme dont nous avons beaucoup besoin lors de l'apprentissage de Java. Sa signification est de distinguer "l'objet lui-même" des variables d'objet (ou de strictement: identificateurs variables du type de données auquel appartient l'objet).
2.3 Retour à la déclaration variable en 1:
Maintenant, vous devriez avoir une vue claire des commentaires ci-dessous.
int k, j; // k stocke un numéro entier. A A; // L'adresse est stockée dans un. B B1, B2,…, B10000; // B1,…, B10000 stocke l'adresse à l'intérieur. String S; // S stocke l'adresse.
3. À propos de la référence
Qu'est-ce qu'une "citation"? «L'identifiant que vous manipulez est en fait une« référence »à un objet». (Penser à Java 2e)
La traduction est: l'identifiant que vous manipulez est en fait une "référence" à un objet. Ou pour être plus précis, traduit en: l'identifiant que vous utilisez est en fait une "référence" à un objet. De toute évidence, la référence dans le texte d'origine est quelque chose avec un sens de la direction.
Retournez à Java et référez-vous au numéro d'identification de l'objet, à l'ID de l'objet ou au numéro de téléphone mobile de l'objet. Bien sûr, davantage le dicton est que la référence est le numéro de pièce où l'objet vit en mémoire. Intuitivement parlant, la référence à un objet est la valeur de retour lors de la création d'un objet! Une référence est la valeur de retour d'une nouvelle expression.
nouveau a (); Voici un objet, mais nous n'utilisons pas de poignée pour maintenir (maintenir, maintenir, enregistrer) la référence. Dans une perspective microscopique, la nouvelle expression termine la tâche de l'initialisation de l'objet (trois étapes, analyse détaillée ci-dessous), et dans l'ensemble, il renvoie une référence.
Revenez à nouveau à la déclaration variable en 1 et jetez un œil aux commentaires ci-dessous.
A A; // Déclarer la poignée A, mais n'est pas initialisé, donc la valeur à l'intérieur est nul. B B1, B2,…, B10000; // Déclarer les poignées B1,…, B10000, mais ne sont pas initialisées, donc la valeur à l'intérieur est nul. String S; // Déclarer la poignée S, mais n'est pas initialisé, donc la valeur à l'intérieur est nul.
4. La relation entre la poignée et la référence
A a; // Déclarer la poignée a, la valeur est nulla = new a (); // initialisation de la poignée (manche = référence; c'est-à-dire attribuer la référence à la poignée)
Citation: la valeur de nouveau a (). Les références peuvent être simplement considérées comme l'adresse où l'objet occupe l'espace mémoire; Grâce à des références aux objets, ils peuvent être commodément distingués des autres objets, et les références sont l'identité unique de l'objet.
Une fois la poignée initialisée, vous pouvez utiliser la poignée pour contrôler à distance l'objet.
Bien sûr, c'est juste pour expliquer la création et l'initialisation des objets d'un aspect. Après avoir compris la relation entre les poignées et les références, l'ensemble du processus d'initialisation des objets est analysé ci-dessous. Faisons d'abord les préparations suivantes, parlons de pile et de pile.
5. Empiler et tas en java
En Java, la mémoire est divisée en deux types: "pile" et "tas" (pile et tas). Le type de données de base est stocké dans la "pile", et le type de référence d'objet est en fait stocké dans le "tas", et la valeur d'adresse de la mémoire de référence n'est conservée que dans la pile.
Soit dit en passant, parlons des méthodes "==" et "equals ()" pour aider à comprendre le concept de (pile et tas).
Lorsque vous comparez les variables avec "==" dans Java, le système utilise la valeur stockée dans la variable dans la pile comme base de comparaison. La valeur stockée dans le type de données de base dans la pile est sa valeur de confinement, et la valeur stockée dans le type de référence dans la pile est la valeur d'adresse de l'objet lui-même pointe. La classe d'objets dans le package java.lang a la méthode publique Boolean Equals (Object Obj). Il compare si deux objets sont égaux. La méthode equals () de l'objet ne renvoie que si les deux références étant comparées pointent au même objet (les poignées sont égales). (Quant à la méthode equals () de la classe de chaîne, il remplace la méthode equals () et n'est pas discuté dans cet article.)
6. Processus de création et d'initialisation des objets
Dans Java, l'objet est une instance de la classe. En général, lorsqu'une instanciation d'une classe, tous les membres d'une telle classe, y compris les variables et les méthodes, sont copiés dans une nouvelle instance de ce type de données. Analysez les deux codes suivants.
6.1 véhicule véhicule = nouveau véhicule ();
L'énoncé ci-dessus fait ce qui suit:
①Le "nouveau véhicule" à droite utilise la classe de véhicule comme modèle pour créer un objet de classe de véhicule (également appelé objet de véhicule) dans l'espace du tas.
②La fin de () signifie qu'après la création de l'objet, le constructeur de la classe de véhicule est immédiatement appelé pour initialiser l'objet nouvellement généré. Il doit y avoir un constructeur. S'il n'est pas créé, Java ajoutera un constructeur par défaut.
③Le "véhicule véhicule" à gauche crée une variable de référence de classe de véhicule.
④ L'opérateur "=" rend le point de référence de l'objet à l'objet du véhicule qui vient d'être créé. (Rappel des poignées et références)
Divisez la déclaration ci-dessus en deux étapes:
Véhicule véhicule véhicule; VEH1 = véhicule neuf ();
Il est plus clair d'écrire de cette façon. Il y a deux entités: l'une est la variable de référence d'objet, et l'autre est l'objet lui-même. Les entités créées dans l'espace tas sont différentes de celles créées dans l'espace de pile. Bien que ce soient des entités qui existent, il semble difficile de la «saisir» avec précision. Étudons attentivement la deuxième phrase et découvrons le nom de l'objet que vous venez de créer? Certaines personnes disent que cela s'appelle "véhicule". Non, "véhicule" est le nom de la classe (le modèle de création pour l'objet). Une classe de véhicule peut créer d'innombrables objets en fonction de cela, et ces objets ne peuvent pas être appelés "véhicule". L'objet n'a même pas de nom, il ne peut donc pas être accessible directement. Nous ne pouvons accéder qu'indirectement les objets via des références d'objets.
6.2 véhicule véhicule;
Veh2 = véhicule;
Étant donné que Veh1 et Veh2 ne sont que des références à des objets, ce que fait la deuxième ligne, c'est simplement attribuer la référence (adresse) de Veh1 à Veh2, de sorte que Veh1 et Veh2 pointent en même temps l'objet de véhicule unique.
6.3 véhicule = nouveau véhicule ();
La variable de référence Veh2 pointe à la place au deuxième objet.
Déduit de l'instruction ci-dessus, nous pouvons tirer la conclusion suivante: ① Une référence d'objet peut pointer vers 0 ou 1 objet; ② Un objet peut avoir n références à lui pointer.
Java: conversion de type de données
1. Types simples de Java et leurs classes d'encapsulator
1.1 Types simples Java et classes d'encapsulation Nous savons que le langage Java est un langage de programmation typique orienté objet, mais compte tenu des avantages de certains types de données de base en structure, petite mémoire et vitesse d'accès rapide, Java prend toujours en charge ces types de données simples non orientés vers l'objet. Bien sûr, lorsque Java fournit un grand nombre d'autres classes, il fournit également des classes encapsulées correspondant à des types de données simples. Par conséquent, Java a différents types de données tels que INT et INTEGER (Float et Float, Double et Double ...).
Il existe deux principales catégories de types de données dans le langage Java: l'une est un type simple, également connu sous le nom de type principal (primitif), et l'autre est un type de référence (référence). Une variable de type simple stocke une valeur spécifique, tandis qu'une variable de type de référence stocke une référence à un objet.
Java détermine la taille de chaque type simple. Ces tailles ne changent pas avec les modifications de la structure de la machine. Cette taille est invariante, ce qui est l'une des raisons pour lesquelles les programmes Java ont une forte portabilité.
Le tableau suivant répertorie les types simples, l'occupation des bits binaires et les classes d'encapsulator correspondantes définies en Java.
Types simples dans la table java
1.2 Pourquoi utiliser les classes d'encapsulation. Prenez INT et INTEGER comme exemple. Bien qu'ils représentent essentiellement un entier 32 bits, ce sont des types de données différents. En fait, les entiers directement utilisés dans Java sont int (en ce qui concerne INT et INTEGER). Ce n'est que lorsque les données doivent apparaître comme l'identité d'un objet, la valeur entière doit être encapsulée dans un objet avec l'intégralité d'encapsulator, l'int correspondant.
Par exemple: Pour ajouter un entier au vecteur dans le package java.util, la valeur entière doit être encapsulée dans une instance entière comme suit:
Vector v = new vector (); int k = 121; v.addelemt (nouvel entier (k));
De plus, Integer, en tant que classe d'encapsulator correspondant à INT, fournit de nombreuses méthodes, telles que des méthodes de construction entier, des méthodes de conversion entier en autres types numériques, etc., qui ne sont pas disponibles dans les données de type int.
2. Constantes en java
Nous devons prêter attention aux types de constantes suivantes.
2.1 Lorsque des constantes entières hexadécimales sont exprimées en hexadécimal, ils doivent commencer par 0x ou 0x, comme 0xff, 0x9a.
2.2 L'octale constante entière octale doit commencer avec 0, comme 0123, 034.
2.3 Le type long de type long doit se terminer avec L, comme 9L, 342L.
2.4 Constantes de flotteur Étant donné que le type par défaut de la constante décimale est de type double, F (f) doit être ajouté après le type de flotteur. Les variables avec décimales sont également de type double par défaut.
flotter f;
f = 1,3f; // f doit être déclaré.
2.5 Constantes de caractères Les constantes de caractères doivent être enfermées en deux citations simples (notez que les constantes de chaîne sont enfermées en deux citations doubles). Les personnages de Java représentent deux octets.
Certains caractères d'évasion couramment utilisés.
① / r signifie accepter l'entrée du clavier, ce qui équivaut à appuyer sur la touche Entrée;
② / n signifie une nouvelle ligne;
③ / t représente un caractère d'onglet, qui équivaut à la touche de table;
④ / b représente la touche arrière, ce qui équivaut à la touche d'espace arrière;
⑤ / 'signifie citations simples;
⑥ / '' signifie citations doubles;
⑦ // signifie une barre oblique /.
3. Conversion entre les types de données simples
Il existe deux façons de convertir entre les types simples de données: la conversion automatique et la conversion de la moulage, ce qui se produit généralement lorsque les paramètres de l'expression ou de la méthode sont passés.
3.1 Conversion automatique spécifiquement, lorsqu'une "petite" données est calculée avec une "grande" données, le système convertira automatiquement les "petites" données en "grandes" données, puis effectuera le calcul. Lorsque vous appelez la méthode, les paramètres réels sont "petits" et les données formelles des paramètres de la méthode appelée sont "grandes" (s'il existe une correspondance, bien sûr, la méthode de correspondance sera appelée directement), le système convertira automatiquement les données "petites" en "grandes" données, puis appellera la méthode. Naturellement, pour plusieurs méthodes surchargées du même nom, elle sera convertie en données "Close" "Big" et appelées.
Ces types de "Small" à "Big" sont (octets, courts, char) - int-loat-doubble. Ce que nous parlons ici ne fait pas référence au nombre d'octets occupés, mais à la taille de la plage représentant la valeur.
Veuillez consulter l'exemple suivant:
①Les déclarations suivantes peuvent être directement adoptées en Java:
octet b; int i = b; long l = b; float f = b; double d = b;
② Si le type de niveau de bas niveau est de type char, il sera converti en valeur de code ASCII correspondante lors de la conversion en un type de niveau élevé (type intégral), par exemple
char c = 'c'; int i = c; System.out.println ("sortie:" + i);
Sortir:
Sortie: 99;
③ Pour les trois types d'octets, courts et char, ils sont horizontaux, ils ne peuvent donc pas se convertir automatiquement. La conversion de type coulée suivant peut être utilisée.
court i = 99; char c = (char) i; System.out.println ("output:" + c);Sortir:
Sortie: C;
④SI il existe une méthode dans le polymorphisme d'objet:
f (byte x) {…}; f (court x) {…}; f (int x) {…}; f (long x) {…}; f (float x) {…}; f (double x) {…}; f (double x) {…}; Il y a aussi: char y = 'a'; Alors, quelle méthode l'instruction f (y) appellera-t-elle? La réponse est: f (int x) {...} Méthode, car son paramètre de référence formel est "grand" et est le "plus proche".
Et pour la méthode:
f (float x) {…}; f (double x) {…}; Il y a aussi: long y = 123L; Ensuite, la méthode appelée par l'instruction f (y) est f (float x) {…}.
3.2 Casting Lors de la conversion de "grandes" données en "petites" données, vous pouvez utiliser la coulée. C'est-à-dire que vous devez utiliser le format d'énoncé suivant:
int n = (int) 3.14159 / 2;
Comme vous pouvez l'imaginer, cette conversion peut certainement entraîner un débordement ou une diminution de la précision.
3.3 Améliorez automatiquement le type d'expression du type de données. En ce qui concerne l'amélioration automatique du type, faites attention aux règles suivantes.
① Toutes les valeurs des types d'octets, courts et char seront promues au type int;
②I il y a un opérande long, le résultat de calcul est long;
③SI il existe un opérande de type flotteur, le résultat de calcul est le type de flotteur;
④SI il existe un opérande double, le résultat du calcul est de type double;
exemple,
octet b; b = 3; b = (octet) (b * 3); // octet doit être déclaré.
3.4 Conversion de type de transition pour la classe d'emballage de manière générale, nous déclarons d'abord une variable, puis générons une classe d'emballage correspondante, et nous pouvons utiliser diverses méthodes de la classe d'emballage pour effectuer une conversion de type. Par exemple:
① Lorsque vous souhaitez convertir Float en double type:
float f1 = 100,00f; Float f1 = nouveau float (f1); Double D1 = f1.DoubleValue (); // F1.DoubleValue () est la méthode de retour du type de double valeur de la classe Float
②Quand vous souhaitez convertir le double type en type int:
double d1 = 100,00; double d1 = nouveau double (d1); int i1 = d1.intvalue ();
Convertir des variables de types simples en classe de wrapper correspondante, et le constructeur de la classe de wrapper peut être utilisé. C'est-à-dire: booléen (valeur booléenne), caractère (valeur char), entier (valeur int), long (valeur longue), float (valeur float), double (double valeur)
Dans chaque classe d'emballage, il existe toujours une méthode de valeur × valeur () pour obtenir ses données de type simple correspondantes. En utilisant cette méthode, la conversion entre différentes variables numériques peut également être réalisée. Par exemple, pour une classe de type réel à double précision, IntValue () peut obtenir sa variable entière correspondante, et DoubleValue () peut obtenir sa variable de type réel à double précision correspondante.
4. Conversion entre les chaînes et autres types
4.1 Conversion d'autres types en chaînes ① Appelez la méthode de conversion de chaîne de la classe: x.toString ();
② Conversion automatique: x + ";
③ Méthodes utilisant String: String.VolueOf (x);
4.2 Convertissez la chaîne en autres types en tant que valeurs ① Convertissez-la d'abord en instance de wrapper correspondante, puis appelez la méthode correspondante pour la convertir en autres types. Par exemple, le format de conversion de la valeur de type double du "32.1" dans le caractère est: nouveau flotteur ("32.1"). DoubleValue (). Vous pouvez également utiliser: double.Valueof ("32.1"). DoubleValue ()
② Méthode parmexxx statique
String s = "1"; byte b = byte.parsebyte (s); short t = short.paSeshort (s); int i = Integer.Parseint (s); long l = long.parselong (s); float f = float.parsefloat (s); double d = double.parsedouble (s);
③ La méthode GetnumericValue (char ch) du personnage peut être trouvée dans l'API.
5. Conversion des cours de date et autres types de données
Il n'y a pas de correspondance directe entre les entiers et les classes de date, mais vous pouvez utiliser le type INT pour représenter respectivement l'année, le mois, le jour, l'heure, la minute et les secondes, de sorte qu'une correspondance est établie entre les deux. Lorsque vous effectuez cette conversion, vous pouvez utiliser trois formes du constructeur de classes de date:
①Date (int an, int mois, date int): le type int représente l'année, le mois, et le jour ②Date (int an, int mois, int, int hrs, int min): le type int représente l'année, le mois, le jour, l'heure et la minute ③Date (int an, int mois, heure, heure, heure et seconde, et seconde entre l'année, le mois, le jour, la journée, les heures, la minute et la seconde et la deuxième correspondance entre une année, un mois, une journée, une heure, une minute, et une autre Les classes, c'est-à-dire, un temps est exprimé comme le nombre de millisecondes à partir de 0h00, GMT le 1er janvier 1970. Pour cette correspondance, la classe de date a également son constructeur correspondant: date (date longue).
Obtenez l'année, le mois, le jour, l'heure, la minute, la deuxième et la semaine dans la classe de date. Vous pouvez utiliser le getyear (), getMonth (), GetDate (), Gethours (), GetMinutes (), GetSeconds (), Getday (), et vous pouvez également le comprendre comme convertissant la classe de date en un int.
La méthode getTime () de la classe Date peut obtenir le numéro entier long correspondant au temps que nous avons mentionné précédemment. Comme la classe Wrapper, la classe Date a également une méthode toString () qui peut la convertir en classe String.
Parfois, nous voulons obtenir un format de date spécifique, par exemple 20020324, nous pouvons utiliser la méthode suivante, l'introduire d'abord au début du fichier,
import java.text.simpledateFormat; import java.util. *; java.util.date date = new java.util.date (); // Si vous souhaitez obtenir le format de Yyymmmdd SimpledateFormat sy1 = new SimpledateFormat ("yyyymmdd"); string dateFormat = sy1.format (date); // Si vous voulez obtenir l'année, le mois, le jour, SimpledateFormat sy = new SimpledateFormat ("yyyyy"); SimpledateFormat sm = new SimpledateFormat ("MM"); SimpledateFormat sd = new SimpledateFormat ("dd"); String syear = sy.format (date); string smon = sm.format (date); string sday = sd.format (date);