Comment fonctionne le Système..print ()?
J'ai travaillé avec Java pour un temps assez long, et je me demandais comment la fonction System.out.print()
œuvres.
Voici mon doute:
Étant une fonction, il a une déclaration quelque part dans le io paquet. Mais comment les développeurs Java de le faire, étant donné que cette fonction peut prendre n'importe quel nombre d'arguments et de tous les types d'argument, peu importe comment ils sont organisés? e.g:
System.out.print("Hello World");
System.out.print("My name is" + foo);
System.out.print("Sum of " + a + "and " + b + "is " + c);
System.out.print("Total USD is " + usd);
Quel que soit le type de données des variables a, b, c, usd, foo
ou comment ils sont passés, System.out.print()
jamais renvoie une erreur.
Pour moi, je n'ai jamais travaillé sur un projet où l'obligation a été comme ça. À condition, si je reçois une exigence de ce genre, je ne sais vraiment pas comment le résoudre.
Quelqu'un peut m'expliquer comment c'est fait?
System.out.print
(PrintWriter
) n'est certainement pas en charge vos lignes 2 à 4, il n'a pas une telle méthode.Système..print() ne renvoie une erreur Vraiment? Eh bien, dans votre exemple, il n', il déclenche une erreur sur chaque ligne mais la première. Les virgules ne sont pas acceptés dans
System.out.print()
, comme les virgules sont utilisées pour séparer les différents paramètres et System.out.print()
accepte 1 paramètre.. Concaténation entre des chaînes de caractères se fait en utilisant la +
de l'opérateur.est
,
une faute de frappe? au lieu de +
?Documentation de Java serait certainement répondre à cette question pour vous et oncle google le sait probablement.
OriginalL'auteur ikis | 2013-06-15
Vous devez vous connecter pour publier un commentaire.
System.out
est juste un exemple dePrintStream
. Vous pouvez vérifier sa JavaDoc. Sa variabilité est basé sur la surcharge de méthode (plusieurs méthodes avec le même nom, mais avec des paramètres différents).Ce flux d'impression est l'envoi de sa sortie à ce qu'on appelle sortie standard.
Dans votre question, vous mentionnez une technique appelée variadic fonctions (ou varargs). Ce n'est malheureusement pas pris en charge par
PrintStream#print
, de sorte que vous devez être confondre avec quelque chose d'autre. Cependant, elle est très facile à mettre en œuvre ces en Java. Il suffit de cocher la documentation.Et si vous êtes curieux de voir comment Java sait comment concaténer des non-variables de chaîne
"foo" + 1 + true + myObj
, c'est principalement de la responsabilité d'un compilateur Java.Quand il n'y a pas de variables impliquées dans la concaténation, le compilateur simplement concatène la chaîne. Quand il y a une variable impliqués, la concaténation est traduit en
StringBuilder#ajouter
de la chaîne. Il n'y a pas de concaténation d'instruction dans le code octet; c'est à dire la+
opérateur (quand on parle de concaténation de chaîne) est résolu lors de la compilation.Tous les types en Java peut être converti en chaîne (
int
par l'intermédiaire des méthodes dansInteger
classe,boolean
par l'intermédiaire des méthodes dansBoolean
classe, des objets via leurs propres#toString
, ...). Vous pouvez le vérifier StringBuilder du code source si vous êtes intéressé.Mise à JOUR: j'étais curieux de moi-même et de vérifier (à l'aide de javap) ce que mon exemple
System.out.println("foo" + 1 + true + myObj)
compile en. Le résultat:Je ne vois pas pourquoi cette réponse a été upvoted, parce que c'est à tort.
system.out.print
ne pas prendre un nombre variable d'arguments, il suffit d'une seule chaîne.peut-être parce que je suis en train de dire qu'il ne pas support? Merci de lire avant de downvoting.
donc, il n'a rien à voir avec :
System
cadre,out
d'être une classe etprintln
étant un droit de la méthode? 🙂OriginalL'auteur Pavel Horal
Même si il regarder comme si
System.put.print...()
prendre un nombre variable d'arguments, il ne le fait pas. Si vous regardez de près, la chaîne est tout simplement concaténés et vous pouvez faire de même avec n'importe quelle chaîne. La seule chose qui se passe, c'est que les objets que vous transmettez sont implicitily converti en chaîne de caractères en java de l'appel de latoString()
méthode.Si vous essayez de faire cela, il va échouer:
Raison en est, car ici, la conversion implicite n'est pas fait.
Toutefois, si vous la changez pour
il fonctionne et c'est ce qui se passe lors de l'utilisation de
System.put.print...()
.Si vous souhaitez mettre en œuvre un nombre variable d'arguments en java pour mimimc quelque chose comme C
printf
vous pouvez le déclarer comme ceci:Ce qui se passe ici est qu'un tableau de Chaînes est passé, avec la longueur de la arguments fournis. Ici Java peut faire le type de vérification pour vous.
Si vous voulez vraiment un printf, alors vous devez faire comme ceci:
Alors vous devez lancer ou d'interpréter les arguments en conséquence.
OriginalL'auteur Devolus
C'est un point très sensible pour comprendre comment le Système de travail..d'impression.
Si le premier élément est une Chaîne puis opérateur plus(+) fonctionne comme une Chaîne de caractères concate de l'opérateur. Si le premier élément est de type entier opérateur plus(+) fonctionne comme opérateur mathématique.
OriginalL'auteur Samet öztoprak
Je pense que vous avez confondu avec le
printf(format String, Object... args)
méthode. Le premier argument est la chaîne de format, qui est obligatoire, le reste vous pouvez transmettre un nombre arbitraire deObject
s.Il n'existe pas de surcharge pour le
print()
etprintln()
méthodes.OriginalL'auteur Bhesh Gurung
Tous ses propos La Surcharge De Méthode.
Il existe différentes méthodes pour chaque type de données dans println() la méthode
Si vous passez objet :
Si vous passez de type Primitif:
si vous passez Chaîne :
OriginalL'auteur ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ
Vous pouvez convertir tout pour une Chaîne aussi longtemps que vous choisissez les éléments à imprimer. L'exigence était assez simple puisque
Objet.toString()
peut retourner une valeur par défaut muet chaîne:package.classname + @ + object number
.Si votre méthode d'impression doit retourner un XML ou JSON de la sérialisation, le résultat de base de toString() ne serait pas acceptable. Même si la méthode de réussir.
Voici un exemple simple pour montrer que Java peut être stupide
permettra d'imprimer quelque chose
package.Mocktest@3254487
! Même si vous ne disposez que de deux membres de type Chaîne, ce qui pourrait être mis en œuvre pour imprimer(ou à peu près comment il apparaît dans le debbuger)
OriginalL'auteur mahery rafara
De toute évidence, le compilateur a été faite d'une manière confuse, bien que le compilateur pensée de développeurs ils ont ajouté quelques intelligences. La véritable élégance devrait vraiment ajouter, c'est de regarder toute l'argumentation et interpréter les + de l'opérateur de manière cohérente. Par exemple,
System.out.println(1+2+"hello"+3+4);
devrait sortir3hello7
au lieu de3hello34
OriginalL'auteur Shoujie He
@ikis, d'abord comme @Devolus a dit ce ne sont pas des multiples aruements passé à
print()
. En effet, tous ces arguments passés obtenirconcaténés pour former une Chaîne unique. Donc
print()
ne pas teakes plusieurs arguments (un. k. un. var-args). Aujourd'hui, le concept qui reste à discuter est de savoir commentprint()
imprime tout type de l'arguement passé.
Pour expliquer ce -
toString()
est le secret:System
est une classe, avec un champ statiqueout
, de typePrintStream
. Donc, vous êtes à l'appel de laprintln(Object x)
la méthode de l'PrintStream
.Il est mis en œuvre comme ceci:
Que wee voir, c'est l'appel de la Chaîne.valueOf(Objet) de la méthode. Ceci est mis en œuvre comme suit:
Et vous voyez ici, qui
toString()
est appelé.Donc tout ce qui est retourné à partir de la
toString()
méthode de cette classe, le même qui sera imprimé.Et comme nous le savons la
toString()
est dansObject
classe et hérite donc d'un défaut iplementation de l'Objet.ex: tu te Souviens quand nous avons une classe dont les
toString()
nous remplacer et ensuite on passe qu'ref variableprint
, que voyez-vous l'impression? - C'est ce que nous renvoyer à partir de latoString()
.OriginalL'auteur mohd shoaib
Les scénarios que vous avez mentionnés ne sont pas de surcharge, vous êtes juste de concaténer les différentes variables avec une Chaîne.
dans tous ces cas, vous devez seulement appeler print(String s) parce que quand quelque chose est concaténé avec une chaîne, il est converti en une Chaîne de caractères en appelant les méthodes toString() de l'objet, et les primitives sont directement concaténées.
Toutefois, si vous voulez savoir des signatures différentes, alors oui print() est surchargée pour divers arguments.
OriginalL'auteur Saurabh Mishra