Le concept d'objets et de références dans ava est très approfondi

  Pour faciliter la description, définissez d'abord une classe:

  Avec cette classe, vous pouvez l'utiliser pour créer des objets: Vehicle veh1 = new Vehicle (). L'action de cette instruction est généralement appelée création d'un objet. En fait, elle contient quatre actions:

  Le nouveau véhicule à droite utilise la classe Vehicle comme modèle pour créer un objet de classe Vehicle (également appelé objet Vehicle en abrégé) dans l'espace de tas.

  Le () à la fin signifie qu'après la création de l'objet, le constructeur de la classe Vehicle est appelé immédiatement pour initialiser l'objet nouvellement généré. Il y a certainement des constructeurs. Si vous ne l'avez pas écrit, Java remplira pour vous un constructeur par défaut

  Le véhicule veh1 à gauche crée une variable de référence de classe de véhicule. La référence de classe de véhicule est une référence d'objet qui peut être utilisée pour pointer vers l'objet Véhicule à l'avenir

  = L'opérateur fait le point de référence de l'objet à l'objet véhicule qui vient d'être créé

  Nous pouvons diviser cette déclaration en deux parties:

  1. véhicule veh1;

  2.veh1 = nouveau véhicule ();

  L'effet est le même. 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 de l'objet et l'autre est l'objet lui-même.

  Les entités créées dans l'espace de tas sont différentes des entités créées dans le segment de données et l'espace de pile. Bien qu'ils soient également de véritables entités, nous ne pouvons ni les voir ni les toucher. Non seulement cela,

  Examinons de plus près la deuxième phrase. Quel est le nom du nouvel objet créé? Certaines personnes disent que cela s'appelle "véhicule". Non, "Véhicule" est le nom de la classe (création d'un modèle pour les objets).

  Une classe de véhicule peut créer d'innombrables objets sur la base de cela, ces objets ne peuvent pas être appelés "véhicule".

  L'objet n'a même pas de nom, et vous ne pouvez pas y accéder directement. Nous ne pouvons accéder aux objets qu'indirectement via des références d'objet.

  Afin d'illustrer les objets, les références et les relations entre eux, une métaphore qui peut ne pas être appropriée peut être faite. L'objet est comme un gros ballon, si gros qu'on ne peut pas l'attraper. La variable de référence est une corde qui peut être utilisée pour attacher des ballons.

  Si seule la première instruction est exécutée et que la seconde n'a pas été exécutée, la variable de référence veh1 créée à ce moment n'a pointé vers aucun objet et sa valeur est nulle. La variable de référence peut pointer vers un objet ou être nulle.

  C'est une corde, une corde qui n'a pas été attachée avec des ballons. Après avoir exécuté la deuxième phrase, un nouveau ballon a été fabriqué et attaché à la corde veh1. Lorsque nous avons saisi cette corde, nous avons attrapé le ballon.

  Une phrase de plus: Vehicle veh2;

  Je viens de faire une autre corde sans attacher le ballon.

  Si vous ajoutez une autre phrase: veh2 = veh1;

  Attaché. Ici, un comportement de copie se produit. Cependant, il convient de noter que l'objet lui-même n'est pas copié, seule la référence de l'objet est copiée. Par conséquent, veh2 pointe également vers l'objet pointé par veh1. Les deux cordes sont attachées au même ballon.

  Si vous créez un autre objet avec la phrase suivante: veh2 = new Vehicle ();

  Ensuite, la variable de référence veh2 est modifiée pour pointer vers le deuxième objet.

  De la description et de la déduction ci-dessus, nous pouvons obtenir les conclusions suivantes:

  Une référence d'objet peut pointer vers 0 ou 1 objet (une corde peut être attachée à un ballon ou un ballon)

  Un objet peut avoir N références pointant vers lui (il peut y avoir N cordes attachées à un ballon)

  Si vous arrivez à l'énoncé suivant: veh1 = veh2;

  Selon l'inférence ci-dessus, veh1 pointe également vers le deuxième objet. Ce n'est pas un problème. La question est le premier objet? Sans corde pour l'attacher, il a volé. La plupart des livres disent qu'il a été collecté par le mécanisme de collecte des ordures de Java.

  Ce n'est pas exact. Pour être correct, il est devenu la cible de traitement du mécanisme de récupération de place. Quant au moment où il est réellement recyclé, cela dépend de l'humeur du mécanisme de collecte des ordures.

  De ce point de vue, la déclaration suivante devrait être illégale? Au moins inutile?

  nouveau véhicule ();

  Faux. C'est légal et utilisable. Par exemple, si nous créons un objet juste pour l'impression, nous n'avons pas besoin de le lier avec des variables de référence. La plus courante consiste à imprimer une chaîne: System.out.println ("Je suis Java!"); L'objet chaîne "Je suis Java!" Est supprimé après l'impression. Certaines personnes appellent ces objets des objets temporaires.

  La relation entre l'objet et la référence se poursuivra jusqu'à ce que l'objet soit recyclé.

  Deuxièmement, les objets et références Java

  Les objets et références Java sont des connaissances de base faciles à confondre mais à maîtriser. Ce chapitre développe les concepts d'objets et de références Java, et le transfert de paramètres qui leur sont étroitement liés.

  Regardez d'abord le programme suivant:

  StringBuffer s;

  s = nouveau StringBuffer ("Bonjour tout le monde!");

  La première instruction alloue uniquement de l'espace pour les références, tandis que la deuxième instruction génère une instance (ou un objet) pour la classe en appelant le constructeur StringBuffer (String str) de la classe (StringBuffer). Une fois ces deux opérations terminées, le contenu de l'objet est accessible via s-in Java, l'objet est manipulé par référence.

  On peut dire que la relation entre les objets Java et les références est liée les unes aux autres, mais indépendante les unes des autres. Indépendant l'un de l'autre se manifeste principalement par: la référence peut être modifiée, elle peut pointer vers d'autres objets, tels que les s ci-dessus, vous pouvez lui donner un autre objet, tel que:

  s = nouveau StringBuffer ("Java");

  De cette façon, s est déconnecté du premier objet vers lequel il pointe.

  En termes d'espace de stockage, les objets et les références sont également indépendants. Ils sont stockés à différents endroits. Les objets sont généralement stockés sur le tas et les références sont stockées sur la pile la plus rapide.

  Les références peuvent pointer vers différents objets, et les objets peuvent également être manipulés par plusieurs références, telles que:

  StringBuffer s1 = s;

  Cette instruction fait s1 et s pointer vers le même objet. Étant donné que deux références pointent vers le même objet, quelle que soit la référence utilisée pour manipuler l'objet, le contenu de l'objet change et il n'y a qu'une seule copie. Le contenu obtenu via s1 et s est naturellement le même (sauf pour String, car String est toujours le même String s1 = "AAAA"; String s = s1, operation s, s1 is always the same, so it opensspace for s to store s), as in the following program:

  Le programme ci-dessus montre que le contenu imprimé par s1 et s est le même. Ce résultat semble très déroutant, mais pensez-y, s1 et s ne sont que deux références, ce ne sont que des joysticks, ils pointent vers le même objet , Le même objet est manipulé et le contenu du même objet est obtenu à travers eux.

  C'est comme les freins et l'accélérateur d'une voiture. Ils contrôlent la vitesse de la voiture. Si la voiture démarre à 80, vous appuyez une fois sur l'accélérateur et la voiture accélère. Si la vitesse de la voiture atteint 120, vous appuyez sur le frein. Il commence à diminuer de 120. S'il tombe à 60 et que l'accélérateur est à nouveau actionné, la vitesse du véhicule passera de 60 au lieu de 120 après le premier pas de l'accélérateur. En d'autres termes, la vitesse de la voiture est affectée à la fois par l'accélérateur et le frein, leurs effets sont cumulatifs et non indépendants (sauf si le frein et l'accélérateur ne sont pas sur une voiture).

  Par conséquent, dans le programme ci-dessus, que s1 ou s soit utilisé pour manipuler l'objet, leur impact sur l'objet est également cumulatif (plusieurs références sont les mêmes).

  3. Ce n'est que lorsque vous comprenez la relation entre les objets et les références que vous pouvez comprendre le passage des paramètres

  Dans les questions d'entrevue générales, la question de la transmission des paramètres en Java est testée, et sa réponse standard est que Java n'a qu'une seule méthode de transmission des paramètres: c'est-à-dire, passer par valeur, c'est-à-dire que tout ce qui est passé en Java est passé par valeur. Si la méthode entrante est de type basique, vous obtenez une copie de ce type basique. Si c'est par référence, vous obtenez une copie de la référence.

  En général, on peut facilement comprendre le transfert de types basiques, et pour les objets, on a toujours l'impression de passer par référence, voir le programme suivant:

  Le résultat autorisé du programme ci-dessus montre que les paramètres de la méthode testBasicType sont des types de base, bien que la valeur du paramètre m change, cela n'affecte pas i.

  Le paramètre de la méthode add est un objet. Lorsque sMain est transmis au paramètre s, s obtient une copie de sMain, donc s et sMain pointent vers le même objet. Par conséquent, l'utilisation de l'opération s est en fait l'objet pointé par sMain, alors appelez Après la méthode add, le contenu de l'objet pointé par sMain a changé.

  Dans la méthode changeRef, le paramètre est également un objet. Lorsque sMain est transmis au paramètre s, s obtient une copie de sMain, mais contrairement à la méthode add, l'objet pointé par s est modifié dans le corps de la méthode (c'est-à-dire que s pointe vers un autre Objet, changez le ballon en tenant la corde du ballon), après avoir réaffecté s, s et sMain ne sont plus liés, it et sMain pointent vers des objets différents, donc quelle que soit l'opération effectuée sur s, cela n'affectera pas le pointage sMain Object, donc le contenu de l'objet pointé par sMain avant et après la méthode changeRef n'est pas modifié.

  Pour le résultat de l'appel de la méthode add, de nombreuses personnes peuvent ressentir la même chose: n'est-il pas clair qu'elle est passée par référence? Pour ce genre de problème, appliquez toujours les mots de Bruce Eckel: cela dépend de la façon dont vous voyez la citation, et finalement vous comprendrez que cet argument n'est pas si important. Ce qui compte vraiment, c'est que vous compreniez que le passage de références rend imprévisible la modification d'objet (appelant).

  Il n'y a qu'une seule réponse: les paramètres sont passés par valeur en Java. En fait, nous devons comprendre ce qui se passe lorsque le paramètre est un objet, par référence (tout comme la méthode add ci-dessus)?

  Résumé:

  L'expression suivante: A a1 = new A ();

  Il représente que A est une classe, a1 est une référence, a1 n'est pas un objet, le nouveau A () est un objet et la référence a1 pointe vers l'objet du nouveau A ().

  En JAVA, "=" ne peut pas être considéré comme une instruction d'affectation, il n'affecte pas un objet à un autre objet, son processus d'exécution consiste essentiellement à transmettre l'adresse de l'objet droit à la référence gauche, ce qui fait de la gauche La référence pointe vers l'objet à droite. Java ne semble pas avoir de pointeur à la surface, mais sa référence est essentiellement un pointeur. Ce qui est stocké dans la référence n'est pas l'objet, mais l'adresse de l'objet, de sorte que la référence pointe vers l'objet. En Java, l'instruction "=" ne doit pas être traduite en une instruction d'affectation, car il ne s'agit en effet pas d'un processus d'affectation, mais d'un processus de transmission d'adresses. La traduction en une instruction d'affectation entraînera de nombreux malentendus et une traduction inexacte. .

  Un autre exemple: A a2;

  Il représente que A est une classe, a2 est une référence, a2 n'est pas un objet, l'objet pointé par a2 est vide nul;

  Un autre exemple: a2 = a1;

  Il représente que a2 est une référence et a1 est également une référence. L'adresse de l'objet pointé par a1 est passée à a2 (adresse), de sorte que a2 et a1 pointent vers le même objet.

  En résumé, il peut être simplement écrit que lors de l'initialisation, le côté gauche de l'instruction "=" est une référence, et le nouveau à droite est un objet.

  Lorsque la gauche et la droite sont des instructions "=", les références gauche et droite pointent simultanément vers l'objet pointé par la référence droite.

  La soi-disant instance est en fait un synonyme d'objet.

Je suppose que tu aimes

Origine www.cnblogs.com/javaxiachen/p/12707284.html
conseillé
Classement