Возможно мой вопрос может показаться глупым и очевидным, но всё-таки я вынужден его задать. У меня имеется рабочий код который мне требуется изучить. В одном файле
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
(ибо иначе он не печатает дробь корректно)? И как вызывать методы одного класса из другого?
Вам дали плохой код.
Из-за несоблюдения правил именования он плохо читаем. Классы называться должны с большой буквы.
Также пропущена аннотация @Override
у метода toString()
, что и не дало вам возможности понять, что этот метод переопределён.
А переопределяют этот метод как раз, например, для вывода к-л значений или представления экземпляра к-л класса в виде строки, что и сделано в этой программе.
У меня вверху висит баннер: "Не стыдись спросить - не знать еще постыднее!".
По сути вопросов.
смысл метода 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!
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Необходимо используя js передать в поле значениеЗначение в поле передаю, но после того необходимо обновить это поле, чтобы его содержимое...
Здравствуйте, хотел бы получить советВ общем, знаю java/spring/html/css ну и js немного , могу написать небольшие веб-сервисы, но так таковой работы в городе...
Добрый день! При использовании драйвера возникает эксепшн Exception in thread "main" javasql