Suppose you have defined the following Person class:
public class Person {
    String name;
    int age;
    
    public Person (int age, String name) {
        this.age = age;
        this.name = name;
    }
}
If you instantiate a new Person object:
Person person = new Person(25, "John");
and later in your code you use the following statement in order to print the object:
System.out.println(person.toString());
you'll get an output similar to the following:
Person@7ab89d
This is the result of the implementation of the toString() method defined in the Object class, a superclass of Person. The documentation of Object.toString() states:
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
So, for meaningful output, you'll have to override the toString() method:
@Override
public String toString() {
    return "My name is " + this.name + " and my age is " + this.age;
}
Now the output will be:
My name is John and my age is 25
You can also write
System.out.println(person);
In fact, println() implicitly invokes the toString method on the object.