2013-09-22 2 views
1

Рассмотрим следующий пример, имеющий поле с тем же классом внутри класса

public class Human 
{ 
public Human h1; 
public String name; 
public int age; 

public Human() 
{ 
    name = "myName"; 
     age = 22; 
} 
} 

Какой смысл иметь h1 там? Как его можно использовать? и почему он будет использоваться? Разве мы не можем использовать экземпляр, который мы бы создали с новым?

+0

Вы ВГА Есть три разных имени того же класса. Пожалуйста, отредактируйте его. –

ответ

5

В чем смысл наличия h1?

Это будет полностью зависеть от класса.

Как его можно использовать?

Как и любой другой экземпляр.

и почему он будет использоваться? Разве мы не можем использовать экземпляр, который мы создадим с новым?

Рассмотрите связанный список, в котором каждый узел имеет ссылки на следующие (и, возможно, предыдущие) узлы. Эти ссылки были бы того же класса, что и сам узел. Пример: примерно

class LinkedListNode { 
    private LinkedListNode previous; 
    private LinkedListNode next; 
    private Object value; 

    LinkedListNode(LinkedListNode p, LinkedListNode n, Object v) { 
     this.previous = p; 
     this.next = n; 
     this.value = v; 
    } 

    LinkedListNode getPrevious() { 
     return this.previous; 
    } 

    // ...and so on... 
} 

Существует много других подобных вариантов использования. A Person класс может иметь членов для связанных лиц (супругов, детей). Вероятно, у древовидного класса были бы листья, которые, вероятно, имели бы ссылки на другие листья. И т.д.


В комментариях вы задали вопрос об одном классе. Да, это абсолютно случай, когда у вас будет член, который был типом класса. Вот стандартный синглтон (есть много вариаций на эту тему):

class Foo { 
    // The singleton instance 
    static Foo theInstance = null; 

    // Private constructor 
    private Foo() { 
    } 

    // Public accessor for the one instance 
    public static synchronized Foo getInstance() { 
     if (theInstance == null) { 
      theInstance = new Foo(); 
     } 
     return theInstance; 
    } 

    // ...stuff for Foo to do, usually instance methods... 
} 
+0

Он также используется при работе с синглонами, где производится проверка экземпляра. это другое использование? – tony9099

+0

@ tony9099: Да, абсолютно. Одноэлемент 'Foo', вероятно, будет иметь статический член типа' Foo', который будет экземпляром singleton. –

+0

если он не является указателем, если он относится к типу охватывающего класса? или это разрешено? – Zeeshan

2

Один из примеров. Если у вас есть структура, подобная дереву, то узел может содержать дочерний элемент своего типа. Именно по этой причине ваш класс Human имеет атрибут своего собственного типа.

2
  • Если один строит связные списки, деревья или другие формы объекта объединения вручную, такое поле можно назвать prev, next, parent , child, firstChild, lastChild, prevSibling, nextSibling, ....
  • Родительские/дочерние ассоциации с одинаковыми типами (рекурсия) или разные типы моделируются, например, с объектами JPA, которые (как правило) не просто указывают на один и тот же экземпляр (это).
  • Статические поля того же типа могут использоваться для экземпляров singleton или каких-либо предопределенных, возможно конечных значений.
1

Очень распространено иметь поля того же типа, что и класс, для реализации структур данных, таких как связанные списки, деревья и т. Д. В java.

Это в основном то же самое, что и указатели, используемые для этой цели в C.

Как и каждый объект, который создается в Java на самом деле является «ссылка» на фактическое местонахождение объекта в куче, следовательно, таким образом, вы можете просматривать их как указатели бы в C.

так что-то вроде:
struct List{ int val; List *next; }


бы в Java быть как:
class MyList{ int val; MyList nextNode; }

Смежные вопросы