Использование классов и объектов в Java

427
04 июля 2017, 21:10

Возможно мой вопрос может показаться глупым и очевидным, но всё-таки я вынужден его задать. У меня имеется рабочий код который мне требуется изучить. В одном файле

import java.util.*;
class trgobjects{
    static Scanner reader = new Scanner (System.in);
    public static void main (String[]args){
        System.out.println("Ввод числителя: ");
        int up = reader.nextInt();
        System.out.println("Ввод знаменатель: ");
        int down = reader.nextInt();
        drob frac = new drob(up, down);
        System.out.println(frac);
    }
}

В другом файле

class drob{
    public int chisl;
    public int znamen;
    public drob (int mo, int me){
        this.chisl = mo;
        this.znamen = me;
    }
    public String toString ()
    {
        return (this.chisl+"/"+this.znamen);
    }
}

Вопрос собственно вот в чём: смысл метода toString во втором классе? Куда он возвращает значение? Когда он действует: при инициализации объекта или при использовании в программе? И в каком порядке действуют методы в первом классе, если их никто не вызывал? И почему этот метод обязательно должен называться toString (ибо иначе он не печатает дробь корректно)? И как вызывать методы одного класса из другого?

Answer 1

Вам дали плохой код.

Из-за несоблюдения правил именования он плохо читаем. Классы называться должны с большой буквы.

Также пропущена аннотация @Override у метода toString(), что и не дало вам возможности понять, что этот метод переопределён.

А переопределяют этот метод как раз, например, для вывода к-л значений или представления экземпляра к-л класса в виде строки, что и сделано в этой программе.

Answer 2

У меня вверху висит баннер: "Не стыдись спросить - не знать еще постыднее!".

По сути вопросов.

смысл метода toString во втором классе?

Метод toString() есть у каждого класса, т.к. он есть у "суперкласса" Object. И его (метода) название говорит само за себя - строковое представление объекта. Object просто представляется строкой вида "@xxxxxxxx", где хххххххх - хэш код данного объекта (рандомное число для Object). Когда вы посредством матода System.out.println(String...) выводите на экран примитивный тип, например, int, он автоматически представляется в десятичном виде, как мы и привыкли видеть числа (1 -> "1"). А как же отобразить объект? Ведь система не знает как его интерпретировать в строку. Если не переопределить метод toString(), будет выводиться @xxxxxxxx (см. выше). Обычно объект имеет состояние (поля) и поведение (методы). Так вот, объект, как правило, можно представить в строковом виде, напечатав его поля. И вот КАК это сделать и какие поля будут представлять ваш объект, решает программист. В вашем примере объект "дробь" представлен числителем и знаменателем (в виде чиcел, автоматически преобразованных в строки), разделенными слэшем.

Куда он возвращает значение?

toString() вызывается неявно (без явного вызова), если функция (метод) в качестве параметра требует String. Явно тоже можно его вызвать, если вам нужно в строковую переменную получить строковое представление объекта: String str = frac.toString();

Когда он действует: при инициализации объекта или при использовании в программе?

Действует (вызывается) при его вызове (явном иди неявном) - см. выше.

И в каком порядке действуют методы в первом классе, если их никто не вызывал?

Если методы никто не вызывал, они просто есть в вашем классе и их можно вызвать. Выполняются они в порядке вызова. Может, не совсем точно понял вопрос, но в первом классе у вас один метод main(). Он, действительно, не был вызван явно (хотя он такой же метод как и остальные, его можно вызывать, в том числе из других классов и даже рекурсивно). Это точка входа в любую консольную программу (поэтому он и статический - не нужно создавать экземпляр его класса).

И почему этот метод обязательно должен называться toString

Как уже написали, это медод предка всех предков. Так придумали разработчики Java.

(ибо иначе он не печатает дробь корректно)

Иначе - это как? Вы можете написать в классе drob любой другой метод (например, void printDrob() {System.out.println(chisl + "/" + znamen);}) и вызывать его вместо System.out.println(frac); => frac.printDrob(); - эффект будет такой же.

И как вызывать методы одного класса из другого?

нестатические - через экземпляр класса (frac.printDrob();) статические - через имя класса (trgobjects.main("args"))

И, да, читайте классику. Хотя бы Java Code Convention!

READ ALSO
Как правильно обновить значение input?

Как правильно обновить значение input?

Необходимо используя js передать в поле значениеЗначение в поле передаю, но после того необходимо обновить это поле, чтобы его содержимое...

322
Нужен совет java/php [требует правки]

Нужен совет java/php [требует правки]

Здравствуйте, хотел бы получить советВ общем, знаю java/spring/html/css ну и js немного , могу написать небольшие веб-сервисы, но так таковой работы в городе...

252
Exception in thread “main” java.sql.SQLException: Исключение ввода/вывода: The Network Adapter could not establish the connection

Exception in thread “main” java.sql.SQLException: Исключение ввода/вывода: The Network Adapter could not establish the connection

Добрый день! При использовании драйвера возникает эксепшн Exception in thread "main" javasql

266