package com.javarush.task.task05.task0502;
/*
Реализовать метод fight
*/
public class Cat {
public int age;
public int weight;
public int strength;
public Cat() {
}
public boolean fight(Cat anotherCat) {
//напишите тут ваш код
}
public static void main(String[] args) {
Cat cat1 = new Cat(5,3,1);
Cat cat2= new Cat(4,5,5);
cat1.fight(cat2);
if(fight = true){
System.out.println("победил первый кот");
}
else{
System.out.println("победил второй кот");
}
}
}
1. В методе main класса Cat, мы можем создать двух котов с какими-то параметрами, компилятор на 22 строке пойдет смотреть в метод fight и увидит, что ему необходимо вернуть, так?
2. Для чего мы создаем переменную public Cat(){} в классе Cat ? Или это не переменная, что это вообще такое?(((Владислав
10 уровень
Решил, НО, остались вопросы(
Архивный
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Руслан Кочнев
30 января 2019, 13:31
1. Да, в методе main мы создаем 2 кота и инициализируем параметры. В 22 строке вызываем метод fight, который возвращает true если параметры первого кота выше, чем параметры второго, и false - если наоборот.
2. Это конструктор по умолчанию, его можно не писать, Java создаст его автоматом.
+1
Владислав
30 января 2019, 13:36
1. Спасибо
2. Получается когда мы пишем Cat ashot = new Cat(), то мы обращаемся именно к этому конструктору а не к самому классу на 7 строке?
0
hidden #598481
30 января 2019, 13:41
Да, верно.
Только вот у тебя конструктор без параметров, а вызываются конструкторы с тремя параметрами:
. Поэтому в таком виде программа не скомпилируется, не хватает другого конструктора .
По сути new Cat() это и есть обращение к конструктору. Ты именно для этого и пишешь в конце пустые скобки, чтобы тем самым показать, что ты создаешь новый объект, используя конструктор Cat без параметров.
Дословно это можно прочитать так:
Cat ashot = new Cat();
создать переменную ashot класса Cat;
создать новый объект, используя конструктор класса Cat без параметров;
поместить ссылку на созданный объект в переменную ashot.
Вот эти три действия выполняются в этой строчке. 0
Владислав
30 января 2019, 13:52
Как же без параметров, разве 5,3,1 не параметры класса?
0
hidden #598481
30 января 2019, 14:02решение
У класса не бывает параметров, у класса бывают поля (переменные, которые можно заполнить)
Это просто абстрактные примеры того, какие могут быть конструкторы, перечисленные выше конструкторы не относятся к задаче. Если ты напишешь их, то потом ты можешь использовать конструкцию
Ты в своем коде пытаешься создавать котов с тремя параметрами. Чтобы программа скомпилировалась, тебе нужно создать соответствующий конструктор, у которого в скобках будет три параметра соответствующего типа. +11
Владислав
30 января 2019, 14:19
Теперь я понял, спасибо тебе огромное
0
Маргарита Тур
1 февраля 2019, 16:39
А можно попросить вас объяснить как передаются значения в конструктор? Понятно, что при Cat cat2 = new Cat(1, 3) в конструктор public Cat(int age, int weight) { } при вызове попадут параметры 1 и 3, затем их примет this.age = age - эта переменная, а потом это значение будет присвоено в this.age? Но this - это ссылка на глобальную переменную, переменную класса, а такие переменные чаще всего private и изменить их после создания невозможно. Или я ошибаюсь? Так куда же попадает значение? Что происходит с глобальной переменной? И как потом это значение используется?
А можно еще вопрос?
public boolean fight(Cat anotherCat) {
if (this.age>anotherCat.age && this.weight>anotherCat.weight && this.strength>anotherCat.strength)
// опять же непонятно:
1. почему требуется вводить в этом методе локальную переменную anotherCat? что представляют из себя такие переменные в методах, чему служат?
2. почему мы используем this.age? как получилось, что в this.age попало значение cat1, а в anotherCat значение cat2? ну, и как следствие, почему мы не можем просто сравнить cat1.age и cat2.age?
Простите за много букв)))) Ну очень хочется понять)
0
hidden #598481
1 февраля 2019, 17:11
Привет.
this - это ссылка на объект класса, который мы создаем в тот момент, когда находимся в конструкторе. Переменная была бы переменной класса, если бы она была static, а обычные поля относятся к объектам класса. Кроме того, конструктор находится внутри класса, а значит у него есть доступ к private переменным, описанным в этом классе.
Про fight.
Опять таки, this ссылается на объект, у которого вызывается метод, в котором написано this.
То есть поскольку мы вызываем метод у объекта cat1, т.е. пишем cat1.fight(...), то объект this будет ссылаться на cat1. Создадим другого кота, напишем
Я специально оставил многоточие в вызове метода, чтобы сделать акцент, что метод fight это не метод двух котов. Это метод одного кота, которого можно сравнить по характеристикам с каким-то другим котом. Поэтому this.age, this.strength, this.weight - это поля cat1 ну или murzik во втором примере. Для того, чтобы сравнить их с характеристикой другого кота, этого кота надо передать в качестве аргумента в метод fight(). Именно поэтому в описании метода fight() сказано public boolean fight(Cat anotherCat)
Точно также, как ты до этого передавала в качестве аргумента числа поиске минимума из двух, ты туда теперь передаешь котика. И когда ты его передаешь, он выступает в качестве кота по имени anotherCat. Поэтому переменные anotherCat.age и остальные ссылаются на поля cat2, если написать cat1.fight(cat2).
Надеюсь, понятный поток сознания. Если что, спрашивай. +4
Маргарита Тур
1 февраля 2019, 17:24
Спасибо большое)))
0