экземпляр класса внутри этого класса в Java

#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 и классе Java

2.Моя интуиция говорит, что есть самое большее не совсем один Animal .

3. Возможно, мы спорим об одном и том же, но… Если вы удалите два метода и вызов doStuff(), вы все равно получите StackOverflow, потому что он никогда не сможет успешно создать новое Animal, потому что он рекурсивно пытается создать экземпляр самого себя. В исходном примере кода doStuff() никогда не попадает в стек вызовов. Честно говоря, я, возможно, неправильно понял суть вопроса OPs, поскольку у меня нет опыта в C.

4. Ха — я понимаю, о чем ты сейчас говоришь. В моей голове я не смотрел на это, потому что это не имеет значения. Фактический вопрос не имеет ничего общего с запущенным классом. Вам нужно было бы понимать C (или C ), чтобы понять вопрос; его пример C не компилируется по определенной причине, которая не применима в Java, потому что у вас всегда есть ссылка на объект в куче, а не на локальный объект в стеке.

5. Ах да. Следует ли отредактировать вопрос, чтобы сделать его более понятным, о чем спрашивается, или это просто мое прочтение? 🙂