В домашнем задании нужно создать новый конструктор. В проекте уже существует один, который генерирует кошек. Необходимо создать еще один, который будет генерировать уже котят.
Я без тени сомнения начал было писать новый, но вдруг обнаружил что при этом отваливается и тот что уже есть, при этом перестают работать оба. Ниже представлен оригинальный конструктор, что уже был в проекте:
public Cat()
{
weight = 1500.0 + 3000.0 * Math.random();
originWeight = weight;
minWeight = 1000.0;
maxWeight = 9000.0;
}
Я решил добавить еще один:
public Cat()
{
weight = 1500.0 + 3000.0 * Math.random();
originWeight = weight;
minWeight = 1000.0;
maxWeight = 9000.0;
}
public Kitten()
{
weight = 100 + 200 * Math.random();
originWeight = weight;
minWeight = 100.0;
maxWeight = 200.0;
}
При добавлении Kitten
, среда разработки сразу сообщает что
Constructor Cat
is never used,
а в Kitten
invalid method declaration, return type required
Возможно я просто что-то не так делаю, но меня очень сильно смущает, что я по сути не выдумал ничего нового, а решил сделать по уже готовому шаблону, немного видоизменив параметры, а все разваливается.
1ое. Конструктор не должен содержать никакой сложной логики (по типу генерации велечин). Передавате это параметрами в конструктор Cat.
2ое. Стоит унаследовать Kitten от Cat и в конструкторе Kitten 1-ой строчкой прописать super(...), куда передать нужные параметры
public class Cat {
double weight;
double minWeight;
double maxWeight;
public Cat(double weight, double minWweight, double maxWeight) {
this.weight = weight;
this.minWeight = minWweight;
this.maxWeight = maxWeight;
}
}
public class Kitten extends Cat {
public Kitten(double weight, double minWeight, double maxWeight) {
super(weight, minWeight, maxWeight);
}
}
Kitten "invalid method declaration, return type required"
вы создали метод класса Cat
, а не конструктор. Конструктор имеет название класса и не возвращает результат. В то время как метод возвращает и если метод не содержит утверждения return
, то его надо пометить как void
.
Чтобы использовать метод для создания объекта Cat
можно использовать возвращаемое значение
public Cat Kitten()
{
Cat c = new Cat();
c.weight = 100 + 200 * Math.random();
c.originWeight = c.weight;
c.minWeight = 100.0;
c.maxWeight = 200.0;
return c;
}
Только тут возникает проблема, так как в конструкторе Cat()
уже инициализированы поля. Чтобы не делать повторную инициализацию, можно создать новый конструктор, который будет принимать параметр.
public Cat() {
this(false);
}
public Cat(boolean isKitten) {
if (isKitten) {
weight = 100 + 200 * Math.random();
originWeight = weight;
minWeight = 100.0;
maxWeight = 200.0;
} else {
weight = 1500.0 + 3000.0 * Math.random();
originWeight = weight;
minWeight = 1000.0;
maxWeight = 9000.0;
}
}
public Cat Kitten() {
Cat c = new Cat(true);
return c;
}
Я вообще сильно подозреваю, что преподователь автора вопроса имел ввиду не операцию наследования, а операцию перегрузки конструктора. То есть - первый конструктор генерит кошек, другой - который инициализиурется к примеру числом, и генерирует котят. Я предлагаю добавить второй конструктор класса Cat, который будет вызываться числом:
public class Cat {
double weight;
double minWeight;
double maxWeight;
//Конструктор кошек
public Cat() //Сработает при инициализации Cat cat = new Cat();
{
weight = 1500.0 + 3000.0 * Math.random();
originWeight = weight;
minWeight = 1000.0;
maxWeight = 9000.0;
}
//Конструктор котят, все параметры уменьшены в 1...5 раз, по сравнению с
//размерами кошек
public Cat(int x) //Сработает при инициализации Cat cat = new Cat(4);
{
x = x%3+3;
weight = (1500.0 + 3000.0 * Math.random())/x;
originWeight = weight/x;
minWeight = 1000.0/x;
maxWeight = 9000.0/x;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
По ходу создания программы в JavaFX для красоты решил запретить изменять расположение разделителя (Divider)Вот моя попытка:
Пишу программу на JavaИспользую API сервиса и библиотеку Retrofit2 для отправки запросов на сервер и получения ответа, а также библиотеку Gson
Доброго времени суток