Kaip spausdinti savo „Java“ objektą be „SomeType @ 2f92e0f4“?

Turiu klasę, apibrėžtą taip:

 public class Person { private String name; // constructor and getter/setter omitted } 

Bandžiau spausdinti savo klasės kopiją:

 System.out.println(myPerson); 

bet aš gavau tokią išvestį: com.foo.Person@2f92e0f4 .

Panaši situacija įvyko, kai bandžiau spausdinti Person objektų masyvą:

 Person[] people = //... System.out.println(people); 

Gavau rezultatą: [Lcom.foo.Person;@28a418fc

Ką reiškia ši išvada? Kaip pakeisti šią išvestį taip, kad jame būtų mano veido pavadinimas? Ir kaip spausdinti savo objektų kolekcijas?

Pastaba : šiai temai priskiriama kanoninė Q A.

226
19 марта '15 в 11:59 2015-03-19 11:59 Duncan Jones paprašė kovo 19 d. 15 val. 11:59 2015-03-19 11:59
@ 9 atsakymai

Fonas

Visi „Java“ objektai turi „ toString() metodą, kuris vadinamas bandant spausdinti objektą.

 System.out.println(myObject); // invokes myObject.toString() 

Šis metodas yra apibrėžtas Object klasėje (visų Java objektų superklasėje). „ Object.toString() metodas grąžina gana Object.toString() eilutę, susidedančią iš klasės pavadinimo, @ simbolio ir objekto hashcode šešioliktainiame formate. Šio kodo kodas yra:

 // Code of Object.toString() public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 

Rezultatas, pvz., com.foo.MyType@2f92e0f4 , gali būti paaiškintas kaip:

  • com.foo.MyType yra klasės pavadinimas, ty „ MyType klasė „ com.foo pakete.
  • @ - sujungia eilutę kartu
  • 2f92e0f4 maišas.

Masyvo klasių pavadinimas atrodo šiek tiek kitoks, kuris yra gerai paaiškintas „Javadocs“ Class.getName() . Pavyzdžiui, [Ljava.> reiškia:

  • [ - vieno matmens masyvas (priešingai [[ arba [[[ ir tt])
  • L - masyve yra klasė arba sąsaja
  • java.> - masyvo objektų tipas

Išvesties nustatymas

Jei norite skambinti kažkam kitam, kai skambinate „ System.out.println(myObject) , turite panaikinti savo klasės „ System.out.println(myObject) toString() metodą. Štai paprastas pavyzdys:

 public class Person { private String name; // constructors and other methods omitted @Override public String toString() { return name; } } 

Dabar, jei spausdinsime Person , pamatysime jų pavadinimą, o ne com.foo.Person@12345678 .

Atminkite, kad toString() yra tik vienas būdas konvertuoti objektą į eilutę. Paprastai šis rezultatas turėtų aiškiai ir glaustai apibūdinti jūsų objektą. Geriausias „ toString() mūsų Person klasei gali būti:

 @Override public String toString() { return getClass().getSimpleName() + "[name=" + name + "]"; } 

Norėdami spausdinti, pavyzdžiui, Person[name=Henry] . Tai tikrai naudinga duomenų derinimo / testavimo duomenų dalis.

Jei norite sutelkti dėmesį tik į vieną objekto aspektą arba įtraukti daug džiazo formatavimo, galite geriau apibrėžti atskirą metodą, pavyzdžiui, String toElegantReport() {...} .


Automatinis išvesties generavimas

Daugelis IDE siūlo paramą automatiškai sukurti „ toString() metodą, pagrįstą klasės laukais. Pavyzdžiui, „ Eclipse“ ir „ IntelliJ“ dokumentai .

Kai kurios populiarios „Java“ bibliotekos taip pat siūlo šią funkciją. Štai keletas pavyzdžių:


Objektų grupių spausdinimas

Taigi, jūs sukūrėte gražų savo klasę toString() . Kas atsitiks, jei ši klasė telpa į masyvą ar kolekciją?

Lėkštės

Jei turite įvairių objektų, galite skambinti „ Arrays.toString() kad būtų sukurtas paprastas masyvo turinio atvaizdavimas. Pavyzdžiui, apsvarstykite šį Person objektų masyvą:

 Person[] people = { new Person("Fred"), new Person("Mike") }; System.out.println(Arrays.toString(people)); // Prints: [Fred, Mike] 

Pastaba: tai skambutis į statinį metodą, vadinamą toString() Arrays klasėje, kuri skiriasi nuo to, ką aptarėme anksčiau.

Jei turite daugialypį masyvą , galite naudoti Arrays.deepToString() kad pasiektumėte tą patį išvesties tipą.

Kolekcijos

Dauguma kolekcijų sudarys gana paprastą išvestį, pagrįstą .toString() kvietimu kiekvienam elementui.

 List<Person> people = new ArrayList<>(); people.add(new Person("Alice")); people.add(new Person("Bob")); System.out.println(people); // Prints [Alice, Bob] 

Taigi, tiesiog reikia įsitikinti, kad sąrašo elementai apibrėžia gerą „ toString() , kaip aptarta aukščiau.

316
19 марта '15 в 11:59 2015-03-19 11:59 atsakymą pateikė Duncan Jones 19 d. 15 d. 11:59 2015-03-19 11:59

Manau, kad „Apache“ suteikia geriausią panaudojimo klasę, kuri suteikia funkciją, kad gautumėte eilutę

border=0
 ReflectionToStringBuilder.toString(object) 
35
15 апр. Rohith K atsakymas, pateiktas balandžio 15 d 2015-04-15 16:31 '15, 16:31 2015-04-15 16:31

Kiekviena java klasė turi numatytąjį metodą, kuris vadinamas System.out.println() jei perduosite tam tikrą klasės objektą. Bandant atspausdinti klasės objektą, metodas System.out.println() bus vadinamas toString() klase, kuri grąžina šio objekto klasės @ vardo kodą.

 { SomeClass sc = new SomeClass(); // Class @ followed by hashcode of object in Hexadecimal System.out.println(sc); } 

Jei norite gauti kitą išvestį, galite panaikinti klasės „toString“ metodą. Žr. Šį pavyzdį

 class A { String s = "I am just a object"; @Override public String toString() { return s; } } class B { public static void main(String args[]) { A obj = new A(); System.out.println(obj); } } 
23
19 марта '15 в 13:04 2015-03-19 13:04 atsakymą pateikė Pankaj Manali kovo 19, 15 d. 13:04 2015-03-19 13:04

„Eclipse“, eikite į savo klasę, dešiniuoju pelės mygtuku spustelėkite -> source-> Generate toString() ;

Jis toString() metodo ir spausdins šios klasės objektą.

8
21 апр. Atsakymą pateikė Ketan Keshri 21 Bal. 2016-04-21 16:45 '16 at 16:45 pm 2016-04-21 16:45

Pagal numatytuosius nustatymus kiekvienas „Java“ objektas turi „ toString() metodą, kuris atspausdina „ObjectType“ @HashCode.

Jei jums reikia daugiau prasmingos informacijos, turite panaikinti savo klasės „ toString() metodą.

 public class Person { private String name; // constructor and getter/setter omitted // overridding toString() to print name public String toString(){ return name; } } 

Dabar, kai spausdinate asmens objektą naudodami System.out.prtinln(personObj); jis išspausdins asmens vardą, o ne klasės ir maišos kodo pavadinimą.

Antruoju atveju, kai bandote spausdinti masyvą, jis išspausdina [Lcom.foo.Person;@28a418fc masyvo tipą ir hashcode.


Jei norite spausdinti žmonių vardus, yra daug būdų.

Galite rašyti savo funkciją, kuri kartoja kiekvieną asmenį ir nuotraukas

 void printPersonArray(Person[] persons){ for(Person person: persons){ System.out.println(person); } } 

Galite spausdinti naudodami „Arrays.toString“ (). Man atrodo lengviausias.

  System.out.println(Arrays.toString(persons)); System.out.println(Arrays.deepToString(persons)); // for nested arrays 

Galite spausdinti java 8 būdu (naudodami srautus ir nuorodą į metodą).

  Arrays.stream(persons).forEach(System.out::println); 

Gali būti ir kitų būdų. Tikiuosi, kad tai padės. :)

4
02 дек. atsakymas pateiktas adn.911 02 Dec. 2017-12-02 19:23 '17 19:23 PM 2017-12-02 19:23

Jei tiesiogiai įvedate bet kurį Asmens objektą, jis bus kodo klasės pavadinimas ClassName@HashCode .

jūsų atveju yra atspausdintas com.foo.Person@2f92e0f4 . Kur Person yra klasė, kuriai priklauso objektas, ir 2f92e0f4 yra objektas turi kodą.

 public class Person { private String name; public Person(String name){ this.name = name; } // getter/setter omitted @override public String toString(){ return name; } } 

Dabar, jei bandote naudoti Person objektą, tada jis išspausdina pavadinimą

 Class Test { public static void main(String... args){ Person obj = new Person("YourName"); System.out.println(obj.toString()); } } 
3
06 мая '16 в 14:22 2016-05-06 14:22 atsakymą pateikė Vikrant Kashyap gegužės 16 d. 16 val. 14:22 2016-05-06 14:22

„Intellij“ galite automatiškai generuoti „toString“ metodą paspausdami „alt + inset“, o tada pasirinkdami „ToString“ (), bandymo klasei išjungti:

 public class test { int a; char b; String c; Test2 test2; @Override public String toString() { return "test{" + "a=" + a + ", b=" + b + ", c='" + c + '\'' + ", test2=" + test2 + '}'; } } 

Kaip matote, jis generuoja eilutę, susiejant keletą klasių atributų, primityviems, kad jie spausdins jo reikšmes, o referenciniams tipams jis naudos savo klasės tipą (šiuo atveju, string metodas Test2).

3
28 июля '16 в 9:00 2016-07-28 09:00 Atsakymas pateikiamas liepos 28 d. 16 val. 9:00 2016-07-28 09:00

Jei žiūrite į Objektų klasę (visų klasių „Java“ klasę), „toString“ () metodo įgyvendinimas yra

  public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 

kai spausdinate bet kokį objektą java, tuomet toString () skambins. Dabar tai priklauso nuo jūsų, jei nepaisysite toString (), tuomet jūsų metodas remsis objekto klasės metodu.

2
27 марта '17 в 9:21 2017-03-27 09:21 Atsakymą pateikė Yasir Shabbir Choudhary, kovo 27 d., 17 val. 9:21 2017-03-27 09:21
 Arrays.deepToString(arrayOfObject) 

Virš funkcijos, spausdinkite objekto masyvą su skirtingais primityviais.

 [[AAAAA, BBBBB], [6, 12], [2003-04-01 00:00:00.0, 2003-10-01 00:00:00.0], [2003-09-30 00:00:00.0, 2004-03-31 00:00:00.0], [Interim, Interim], [2003-09-30, 2004-03-31]]; 
-2
07 июля '17 в 17:06 2017-07-07 17:06 atsakymą pateikė „ Hemant Thorat“ liepos 17 d. 17 d. 17:06 2017-07-07 17:06