Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Java Java Data Structures Efficiency! Menu UI

Brent Mayberry
Brent Mayberry
1,029 Points

How does promptNewSong() in KaraokeMachine.java know to use the override for toString()?

In this code block:

private Song promptNewSong() throws IOException {
    System.out.print("Enter the artist's name:  ");
    String artist = mReader.readLine();
    System.out.print("Enter the title:  ");
    String title = mReader.readLine();
    System.out.print("Enter the video URL:  ");
    String videoURL =  mReader.readLine();
    return new Song(artist, title, videoURL);


When this private method returns the Song object, how does the override to toString() get called so that the input is formatted the way we specified earlier if we don't explicitly call toString()? Does it have something to do with the nature of toString()?

Thanks in advance. I appreciate your help.

1 Answer

Enrique Munguía
Enrique Munguía
14,311 Points

I quite don't understand your question, so I will elaborate on the way toString() works. This method is inherited by every class from the Object class, when you override it you can specify any string to represent your instance in a printed form. One peculiarity of toString() is that it will be called implicitly when you print an instance of an object:

CustomObject obj = new CustomObject();
System.out.println(obj); // prints the String representation provided by toString()

Is equivalent to this

CustomObject obj = new CustomObject();
System.out.println(obj.toString()); // here we are calling toString() explicitly

For the purpose of this example I use CustomObject class, but in fact it could be an instance of any class, and this will work.

Brent Mayberry
Brent Mayberry
1,029 Points

This answers my question. I must have missed the memo that toString() is inherited by every class and that it is implicitly called whenever you print an instance of an object.

Thanks for taking the time to explain this. It seemed like "magic" that the output was formatted the way we had overridden the toString() method. Now I get how this happens.