Не находит метод класса
Подскажите пожалуйста, почему компилятор не находит метод messwithCat(), хотя предыдущий метод getName() выполняеться
public class Main
{
public static void main(String[] args)
{
Cat cat1 = new Cat ("Jimbo");
cat1.getName();
messWithcat(cat1); // why this is not working ?
cat1.getName();
}
}
class Cat
{
private String catName;
Cat (String name)
{
catName = name;
}
void getName()
{
System.out.println(catName);
}
void messWithcat(Cat a)
{
a = new Cat ("Kokos");
}
}
Ответы (2 шт):
Потому что messWithcat как и getName принадлежит какому-то классу. getName вы вызываете у объекта cat1, а второй...получается у текущего (Main)
не находит, т.к. надо вызывать метод у обьекта cat1.messWithcat(cat1);, также, как ты вызывал метод cat1.getName();
чтобы данный метод вызывался именно с таким написанием messWithcat(cat1);
то надо метод перенести в класс main и добавить static
class Main {
static void messWithcat(Cat a) {
a = new Cat("Kokos");
}
public static void main(String[] args) {
Cat cat1 = new Cat("Jimbo");
cat1.getName();
messWithcat(cat1);
cat1.getName();
}
}
если же оставить его в классе кот, то тоже добавляем static и вызываем через класс Cat.messWithcat(cat1);
далее отвечу на вопрос почему не меняется имя. Если добавить в messWithcat вызов getName
static void messWithcat(Cat a) {
a = new Cat("Kokos");
a.getName();
}
вывод будет
Jimbo
Kokos
Jimbo
у тебя класс кот Immutable (неизменяемый, нету сеттера и приватное поле - аналогия класс String) и передавая объект в метод, мы получаем копию ссылки указывающий на обьект в хипе, в методе ты можешь изменять копию обьекта по этой ссылке, но на сам обьект это никак не влияет.
а чтобы изменить обьект, надо изменить метод и в мейне присвоить ссылке возврат из метода
static Cat messWithcat(Cat a) {
a = new Cat("Kokos");
a.getName(); //Kokos
return a;
}
public static void main(String[] args) {
Cat cat1 = new Cat("Jimbo");
cat1.getName();
cat1 = Cat.messWithcat(cat1);
cat1.getName(); //Kokos
}