Quel est le moment approprié pour utiliser le "nouveau" mot-clé?
Quand est-il nécessaire d'utiliser la new
mot-clé dans Java. Je sais que vous êtes supposé utiliser lorsque vous créez une instance d'un objet comme ceci:
TextView textView = new TextView(this);
Parfois dans le code, j'ai remarqué que new
n'est pas utilisé et je m'embrouille..
Dans cette ligne de code:
AssetManager assetManager = getAssets();
Pourquoi ce n'est pas une instance de la d'assetmanager créé comme ceci:
AssetManager assetManager = new AssetManager();
alors il est égal à getAssests()?
Quand dois - new
être utilisé?
Merci!
OriginalL'auteur foobar5512 | 2012-01-06
Vous devez vous connecter pour publier un commentaire.
Vous utilisez le mot clé new lorsqu'un objet est explicitement créé pour la première fois. Puis extraction d'un objet à l'aide d'une méthode de lecture de la nouvelle n'est pas nécessaire parce que l'objet existe déjà dans la mémoire, n'a donc pas besoin d'être recréé.
si vous voulez une description plus détaillée de la nouvelle visite l'oracle docs
Un objet aurez besoin du "nouveau" mot-clé si elle est nulle (ce qui est de fantaisie pour ne pas initialisé).
EDIT:
Ce sera toujours l'impression de "besoins nouveaux" dans les circonstances actuelles.
Donc, pour résoudre ce problème, vous feriez quelque chose comme:
Et, dans ces conditions, nous allons toujours voir "n'a PAS besoin de nouveaux"
Lorsque vous essayez de référence, il sera null. Vous pouvez le vérifier en quelque chose comme (reportez-vous à ma mise à jour)
Vous obtenez cette information à partir de la documentation ou de l'expérience. Par exemple, les Gestionnaires sont souvent utilisés comme des singletons (ou s.th. similaire), donc il n'y a qu'une seule instance. Ce type de classes, vous n'avez pas créé, mais il y a une fonction pour récupérer l'objet.
Je vois... Merci beaucoup!!
Yup, n'oubliez pas d'utiliser la documentation pour en savoir plus! 😉
OriginalL'auteur ahodder
En java, vous devez toujours utiliser
new
pour instancier des objets (enfin presque toujours). AvecgetAssests()
vous récupérez un déjà créé une. Je suppose que votre question vient de c++ oùnew
alloue de la mémoire dynamique, mais depuis java a seulement des objets dynamiques, de nouvelles est toujours nécessaire.OriginalL'auteur zeller
En Java,
new MyClass()
crée une nouvelle instance deMyClass
et renvoie une référence à elle.Pendant ce temps, la déclaration:
définit une variable
foo
qui peut stocker une référence à une instance deMyClass
, ou la valeur spécialenull
qui indique l'absence d'une telle référence. Si vous n'avez pas assing toute référence àfoo
, sa valeur par défaut seranull
.Vous pouvez certainement combiner ces choses, par exemple comme ceci:
ou, de manière équivalente, comme ceci:
Mais vous n'avez pas ont pour créer une nouvelle instance à chaque fois que vous assigner quelque chose à une variable de référence. Vous pourriez tout aussi bien le faire par exemple ceci:
ou encore:
Noter qu'en Java, contrairement à d'autres langages comme C++, vous pouvez ne jamais céder (une copie de) à un objet dans une variable. Plutôt, les objets Java sont toujours accessibles via des références. Quand quelqu'un parle de la section "affectation d'un objet à une variable" ou "passage d'un objet en tant que paramètre" ou "retour d'un objet à partir d'une méthode" en Java, ce qu'ils ont toujours fait la moyenne est de l'attribution ou de passage ou de retour d'un référence à un objet.
Méthodes que votre code d'appels peuvent (et le font souvent) renvoient également des références à des objets. Par exemple, si votre classe a une méthode comme ceci:
vous pourriez l'appeler et enregistrer la référence qu'il retourne dans une variable comme ceci:
ou comme ceci:
Nous pouvons dire à partir de la déclaration de la méthode que
getSomeObject()
retournera toujours une référence à unMyClass
instance (ounull
), mais pas là où cette instance vient de. Cela dépend entièrement de ce que le code à l'intérieur de lagetSomeObject()
méthode. Le code peut toujours créer un nouveauMyClass
exemple avecnew MyClass()
à chaque fois qu'il l'appelle, et lui renvoyer une référence, ou il pourrait toujours retourner une référence à la même objet. Ou, bien entendu, il peut parfois renvoyer une référence à un objet nouveau, et parfois déjà créé un.Noter que, si vous assigner une nouvelle valeur à une variable, quelle que soit la variable contenue avant d'oublier. Si l'oubli de la valeur se trouve être la dernière référence à un objet, alors que l'objet lui-même sera détruite par le garbage collector de Java.
Ainsi, par exemple, tandis qu'il est certainement possible faire quelque chose comme ceci:
qui, normalement, n'a pas de sens, car vous seriez la création d'une nouvelle
MyClass
exemple juste pour jetez immédiatement votre seule référence et de le remplacer par quelque chose d'autre. En effet, le code ci-dessus est exactement équivalent à:Le seul temps qui pourrait même à distance du sens serait si vous voulais pour créer un nouveau
MyClass
instance et immédiatement laisser les ordures collectées, par exemple, parce que leMyClass
constructeur avait des effets secondaires que vous avez voulu déclencher. Mais depuis qu'elle est généralement considérée comme un mauvais style pour les constructeurs qui n'est pas négligeable d'effets secondaires (ou, plus généralement, faire tout ce que la mise en place du nouvel objet), vous ne devriez normalement pas avoir n'importe quelle excuse pour écrire un tel code.OriginalL'auteur Ilmari Karonen
new
est toujours utilisé pour créer un nouvel objet.ce
est juste assignation d'une valeur renvoyée par la méthode
getAssets()
de référenceassetManager
.[modifier]
j'ai menti sur
new
il est possible de faire quelque chose comme ceci:et aussi, vous pouvez utiliser la réflexion:
OriginalL'auteur czajah
Le nouveau est utilisé lorsque vous appelez le constructeur pour une fonction. getAssets() retourne un d'assetmanager, il n'a pas besoin d'en créer un nouveau.
OriginalL'auteur PearsonArtPhoto
En utilisant
new
allouer de la mémoire pour l'objet.À l'aide d'un
getXXX()
est utilisée pour obtenir un objet existant qui est déjà attribué.OriginalL'auteur Philipp Wendt
Depuis que vous avez marqué ce avec [android], je devine que votre code est à l'intérieur d'un
Activity
ouService
. Dans ce cas,getAssets()
est une méthode de la classe de l'extension. Donc vous n'avez pas fait de le créer, vous demandez le code existant pour vous donner une référence à ce qui existe déjà.OriginalL'auteur Argyle
avis de la lettre capitale dans TextView, et le manque de dans getAssets. getAssets n'est pas une classe comme TextView, c'est une méthode retournant un objet. Et comme beaucoup d'autres l'ont mentionné, votre actif existe déjà.
OriginalL'auteur keyser