【问题标题】:having a field with the same class inside a class在类中具有具有相同类的字段
【发布时间】:2013-09-22 09:30:50
【问题描述】:

考虑以下示例

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

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

在那里有一个 h1 有什么意义?如何使用?为什么要使用它? 我们不能只使用我们将使用新创建的实例吗?

【问题讨论】:

  • 那里有同一个类的三个不同名称。请编辑它。

标签: java class field


【解决方案1】:

在那里有一个 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...
}

还有很多其他类似的用例。 Person 类可能有相关人员(配偶、子女)的成员。树类可能会有叶子,而叶子可能与其他叶子有链接。等等。


在 cmets 中,您询问了单例类。是的,这绝对是您拥有一个属于该类类型的成员的情况。这是一个标准的单例(这个主题有很多变体):

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...
}

【讨论】:

  • 它也被用于处理正在检查实例的单例。还有其他用途吗?
  • @tony9099:是的,绝对的。单例Foo 可能有一个Foo 类型的静态成员,这将是单例实例。
  • 如果它是封闭类的类型,它不应该是一个指针吗?还是允许?
  • @Zeeshan:没关注你。 Java 没有显式指针。您在上面看到的每个LinkedListNode 成员都是一个引用(实际上是一个指针)。
  • "单例 Foo 可能有一个 Foo 类型的静态成员" 为什么?
【解决方案2】:

其中一个例子,如果你有一个树状结构,那么一个节点可以包含它自己类型的子节点。这就是您的 Human 类具有自己类型的属性的原因。

【讨论】:

    【解决方案3】:
    • 如果手动构建链表、树或其他形式的对象关联,则可以将此类字段命名为prevnextparentchildfirstChildlastChild、@ 987654327@, nextSibling, ... .
    • 具有相同类型(递归)或不同类型的父/子关联使用 JPA 实体建模,例如,它(通常)不仅仅指向同一个实例 (this)。
    • 同一类型的静态字段可用于单例实例或某种预定义的,可能是最终值。

    【讨论】:

      【解决方案4】:

      为了在java中实现链表、树等数据结构,拥有与类相同类型的字段是很常见的。

      这与C语言中用于此目的的指针基本相同。

      由于在 java 中创建的每个对象实际上都是对堆中对象实际位置的“引用”,因此在某种程度上您可以将它们视为 C 中的指针。

      类似:
      struct List{ int val; List *next; }


      在 java 中应该是:
      class MyList{ int val; MyList nextNode; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多