Я не мог понять следующую концепцию того, как это работает, когда мы создаем объект класса
class MyClass {
int data;
MyClass var;
}
Я совершенно не понимаю, как это будет работать и какова цель создания объекта с тем же именем класса. Я не могу понять, в чем суть этой декларации.
В реальной жизни: ты Человек. И у тебя есть отец. Ваш отец тоже личность. Замените MyClass на Person в вашем примере, а var на отца, и вы получите эту реальную ситуацию, смоделированную как класс.
да, но как это работает, поскольку я упомянул имя метода с тем же именем, что и имя класса, называемое конструктором, но что этот тип объявления называется ???
В опубликованном вами коде нет ни метода, ни конструктора. Так что я не совсем понимаю, о чем вы говорите. У вас есть класс с двумя полями (или переменными экземпляра). docs.oracle.com/javase/tutorial/java/javaOO/variables.html
Дилемма курицы и яйца, не так ли?
В вашем случае каждый экземпляр MyClass
может иметь ссылку на другой экземпляр MyClass
. Название не дает намеков на то, зачем вам это нужно. Но в целом такая структура позволяет связывать, украшать и вкладывать.
Например, вы можете реализовать цепочку этапов обработки. Каждый вызывает следующий в цепочке до конца (var == null
).
В качестве альтернативы, ваш класс может «обернуть» другой экземпляр класса и сделать что-то вроде вызовов методов журнала, прежде чем делегировать их обернутому экземпляру.
Подобную структуру можно использовать для моделирования деревьев, например, Node
, каждый из которых имеет список дочерних узлов (List<Node> children
). Листовые узлы не будут иметь потомков.
Если вы хотите смоделировать некоторые сценарии реального мира, вам, возможно, придется использовать это понятие.
Например, представьте себе ветку Дерева. На ветке дерева может быть n веток. Ветвь будет иметь ссылку на ветки рядом с ней.
class Branch {
Branch branch1;
Branch branch2;
Branch branch3;
}
Это полностью допустимое объявление класса Java. Пример того, что MyClass var;
означает в вашем коде, следующий:
Представьте, что этот класс называется Directory
(он представляет местоположение каталога на жестком диске в реальной жизни), и мы хотим смоделировать, что в каталоге может быть больше (под) каталогов (для простоты только один :)). Таким образом, мы могли бы смоделировать это, используя эту структуру:
class Directory {
int amountOfFolders;
Directory subdiretory; // <-- child object(directory)!
// Directory[] subdiretories; // out of curiosity, this would be much more real
}
Таким образом, когда мы создаем объект Directory
, устанавливаем его дочерний каталог (и) и делаем с ним кое-что.
Это называется Состав (подробнее см. Разница между наследованием и составом и Наследование и состав (часть «Основы композиции»))
См. Ниже код с комментариями для получения более подробной информации ...
class MyClass {
int data;
// attribute of type MyClass, this can represent a hierarchical structure
// in real life applications.
MyClass var;
// this is not a class method, but its constructor, used to create instances
// of this class, i.e.: MyClass c = new MyClass();
public MyClass() {
}
// this is another constructor, which receives a parameter for setting its
// attribute data, i.e.: MyClass c = new MyClass(3);
public MyClass(int data) {
this.data = data;
}
}
Демо: https://ideone.com/2qirCQ
Вот Репозиторий GitHub с этим кодом.
спасибо, я понимаю, но, пожалуйста, не могли бы вы показать мне его реализацию ... на простом примере ...
Вы знакомы со связанным списком? Концепция практически идентична.