Как вывести на консоль значения(обьектов массива?) разного типа переменных из экземпляров класса

public class Ops {
    public String name;
    public int age; //создаю класс и его параметры

    public Ops(String name, int age ){
       this.name = name;
       this.age = age; //причисляю ему переменные
    }
    public String getName() {
        return name; //Получие имени
    }
    public void setName(String name) {
        this.name = name; //возврат в строку класса
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age; //те же яйца только в профиль
    }

}
import java.util.Scanner;
public class programm {
public static void main(String[] args){

    Ops[] array = new Ops[4];
    for(int i = 1; i<4; i++) {

        Scanner nameString = new Scanner(System.in);
        String name = (nameString.nextLine());
        Scanner ageInt = new Scanner(System.in);
        int age = ageInt.nextInt();

        array[i] = new Ops(name, age);
        //System.out.print("Os:"+name);
        //System.out.print(" age:"+age + System.lineSeparator());
    }
    System.out.print("Список всех Ос." + System.lineSeparator() );
     for(int i = 1; i<4; i++) {
        System.out.println(array[i]);
    }

    }
}

не представляю как вывести на панель вывода все значения обьектов массива. при коде выводятся адреса классов, а не их значения, что мне нужно. "Список всех Ос. Ops@46f7f36a Ops@421faab1 Ops@2b71fc7e"

Если не трудно - максимально подробно обьясните как правильно сделать, и что можно улучшить)


Ответы (1 шт):

Автор решения: dmitry1902

При попытке вызвать

System.out.println(array[i]);

происходит вызов метода, println (класс PrintStream):

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

В первой строке объект пребразуется в строковое представление:

String s = String.valueOf(x);

Если вы откроете реализацию этого метода в классе String, то увидите примерно следующее:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

у объекта вызывается метод toString()

У вашего объекта класса Ops нет такого метода. Но так как все классы наследуются от класса Object, то происходит вызов метода из этого класса. Открываем реализацию этого метода в классе Object:

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

В вашем случае выполняется именно эта реализация метода, поэтому вы и получаете ответ вида "Ops@46f7f36a" и т.п.

Если вы хотите получить другой результат, то вам нужно переопределить метод toString() для класса Ops. Добавьте реализацию метода, например:

@Override
public String toString() {
    return "Ops{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}
→ Ссылка