#java
#java
Вопрос:
Здесь я объявляю экземпляр класса animal в том же классе. В c это считается ошибкой:
struct demo{
int anyvar;
struct demo anyvar1;
};
потому что предполагается, что это бесконечный цикл объявления.
Тогда почему этот код разрешен в Java?
class Animal{
Animal object1 = new Animal();
public static void main(String[] args)
{
Animal obj = new Animal();
obj.dostuff();
}
public void dostuff()
{
System.out.println("Compiles");
object1.dostuff();
}
public void keepdoingstuff()
{
System.out.println("Doing Stuff...");
object1.keepdoingstuff();
}
}
Комментарии:
1. Потому что Java — это совершенно другой язык, чем C.
Ответ №1:
Потому что в Java вы объявляете переменную, которая содержит ссылочное значение; указатель.
Это все равно, что делать:
struct demo{
int anyvar;
struct demo *anyvar1;
};
Все объекты в Java создаются в куче, и они явно создаются с new
ключевым словом.
public class Node
{
Node next;
String value;
public Node() { ... }
...
}
next
и value
автоматически инициализируются null
при Node
создании экземпляра объекта и будут оставаться таковыми до тех пор, пока им не будет присвоено ссылочное значение.
Комментарии:
1.Не хочу быть придирчивым, но это не причина, по которой это приведет к ошибке StackOverflow. Существует только один
Animal
объект. Проблема в том, что бесконечно повторяется в методе и выбрасывает стек. При этом это также не то, что он спросил. Тот факт, что вышеупомянутое поведение происходит во время выполнения, не делает код «недопустимым»; он компилируется просто отлично. Его путаница была связана с различием между членами в структуре C и классе Java2.Моя интуиция говорит, что есть самое большее не совсем один
Animal
.3. Возможно, мы спорим об одном и том же, но… Если вы удалите два метода и вызов doStuff(), вы все равно получите StackOverflow, потому что он никогда не сможет успешно создать новое Animal, потому что он рекурсивно пытается создать экземпляр самого себя. В исходном примере кода doStuff() никогда не попадает в стек вызовов. Честно говоря, я, возможно, неправильно понял суть вопроса OPs, поскольку у меня нет опыта в C.
4. Ха — я понимаю, о чем ты сейчас говоришь. В моей голове я не смотрел на это, потому что это не имеет значения. Фактический вопрос не имеет ничего общего с запущенным классом. Вам нужно было бы понимать C (или C ), чтобы понять вопрос; его пример C не компилируется по определенной причине, которая не применима в Java, потому что у вас всегда есть ссылка на объект в куче, а не на локальный объект в стеке.
5. Ах да. Следует ли отредактировать вопрос, чтобы сделать его более понятным, о чем спрашивается, или это просто мое прочтение? 🙂