Создание конструктора

181
06 декабря 2018, 18:20

В домашнем задании нужно создать новый конструктор. В проекте уже существует один, который генерирует кошек. Необходимо создать еще один, который будет генерировать уже котят.

Я без тени сомнения начал было писать новый, но вдруг обнаружил что при этом отваливается и тот что уже есть, при этом перестают работать оба. Ниже представлен оригинальный конструктор, что уже был в проекте:

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

Возможно я просто что-то не так делаю, но меня очень сильно смущает, что я по сути не выдумал ничего нового, а решил сделать по уже готовому шаблону, немного видоизменив параметры, а все разваливается.

Answer 1

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);
    }
}
Answer 2

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;
}
Answer 3

Я вообще сильно подозреваю, что преподователь автора вопроса имел ввиду не операцию наследования, а операцию перегрузки конструктора. То есть - первый конструктор генерит кошек, другой - который инициализиурется к примеру числом, и генерирует котят. Я предлагаю добавить второй конструктор класса 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;
 }        
}
READ ALSO
Отключение разделителя в SplitPane (JavaFX)

Отключение разделителя в SplitPane (JavaFX)

По ходу создания программы в JavaFX для красоты решил запретить изменять расположение разделителя (Divider)Вот моя попытка:

134
Как распарсить этот ответ сервера?

Как распарсить этот ответ сервера?

Пишу программу на JavaИспользую API сервиса и библиотеку Retrofit2 для отправки запросов на сервер и получения ответа, а также библиотеку Gson

188