Взят код из правильного решения. Зачем создавать вложенный класс? Почему в методе fight () программа понимает, что параметры объекта с "this" относятся к первому параметру метода fight() ?
public class Solution {
public static void main(String[] args) {
Solution.Cat cat1 = new Solution.Cat("Tom", 2, 2, 2);
Solution.Cat cat2 = new Solution.Cat("Sam", 2, 2, 2);
Solution.Cat cat3 = new Solution.Cat("Fiona", 3, 3, 3);
}
public static class Cat {
private String name;
private int age;
private int weight;
private int strength;
public Cat(String name, int age, int weight, int strength) {
this.name = name;
this.age = age;
this.weight = weight;
this.strength = strength;
}
public boolean fight(Cat anotherCat) {
int ageScore = Integer.compare(this.age, anotherCat.age);
int weightScore = Integer.compare(this.weight, anotherCat.weight);
int strengthScore = Integer.compare(this.strength, anotherCat.strength);
int score = ageScore + weightScore + strengthScore;
return score > 0;
}
}
}
Никита
11 уровень
Вложенный класс и ключевое слово "this"
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
10 октября 2022, 11:13решение
this обращается не к параметру метода, а к объекту, у которого вызван этот метод. В этом и заключается предназначение ключевого слова this.
Если у тебя в области видимости нет другой переменной, которая бы называлась так же, как и поле класса, то слово this можно опустить. Другими словами, т.к. в методе fight нет локальной переменной, которая называется weight, то необязательно писать this.weight: просто weight будет обозначать то же самое. Для сравнения, в конструкторе так сделать нельзя, потому что параметры конструктора называются так же, как и поля класса.
Вложенный класс, если я не ошибаюсь, в этой задаче создан изначально, его не требуется создавать самостоятельно. Большой разницы нет, можно создать его и в отдельном файле, просто так ты обозначаешь, что этот класс содержит всю свою логику внутри класса Solution. Подробнее ты будешь проходить позже, пока можешь просто запомнить, что один файл может содержать несколько классов, и что один класс может быть вложен в другой. Для обращения к этому классу, когда ты пишешь код внутри внешнего класса Solution, необязательно писать полное имя класса Solution.Cat - можно просто Cat
+4
Никита
11 октября 2022, 08:45
Правильно ли Я понимаю дальнейшую работу метода fight():
вызываем для объекта Tom метод fight(), при этом внутри метода переменные с "this" будут относиться к Тому, а без "this" к Фионе.
Почему тогда метод принимает в себя два объекта (Cat anotherCat), а при работе с этим методом мы передаём ему только один объект?
0
hidden #598481
11 октября 2022, 11:36решение
Чтобы не путаться, принято называть переменные и методы с маленькой буквы, а классы с большой.
Поэтому, правильнее всего будет сказать, что вызов метода будет выглядеть так:
Метод fight вызван у объекта, ссылка на который содержится в переменной tom, или, если опустить всю эту словесную эквилибристику, метод fight вызван у объекта tom. Поэтому переменная this внутри метода будет ссылаться на объект tom.
В сигнатуре метода прописаны параметры метода: Здесь написано, что метод fight содержит один параметр под названием anotherCat типа (класса) Cat. При вызове параметры инициализируются теми значениями, которые были переданы в скобках, т.е. anotherCat после вызова содержит ссылку на объект fiona.
Если бы параметров было несколько, они были бы перечислены через запятую, например так:
Для вызова такого метода понадобилось бы передавать два значения в скобках:
+4
Никита
12 октября 2022, 21:57
Спасибо большое! Очень подробный ответ.
0