在Java中使用类名作为数据类型创建一个变量

3

我正在浏览互联网上的链表操作代码,发现以下代码片段我无法理解。

class Node 
{
    int data;
    Node node; //reference to the next node
    :
    :
}

我知道Node node;这行代码是指向下一个节点的引用,因为链表中的节点含有数据和下一个节点的地址。

但是我不理解其中的概念。

有人能解释一下,如果一个变量以类名作为其数据类型,在Java中是什么概念/理论吗?


2
你是否熟悉 String s = "a value"; - 这是一个名为sString实例。这里有一个名为nodeNode实例。你不理解的部分是什么? - Elliott Frisch
2
一个对象(Node类)可以拥有自己的对象数据类型。在链表概念中,这指向下一个节点。 - Gurkirat Singh Guliani
3个回答

2
有人可以解释一下如果一个变量的数据类型是类名,Java概念/理论是什么吗?
从Java语言的角度来看,只要变量名符合所需的语法,变量名可以是任何东西。
从Java样式的角度来看,变量名应该向读者传达含义。但是,如何传达含义以及需要(明确)传达多少含义取决于代码作者。
在这种情况下,作者决定将"node"简单地用作变量名。这没有传达任何额外的含义:它是一个“节点”。这个变量的实际意思通过注释传达:
//reference to the next node

但是通过阅读Node类的其余代码和/或使用该类的代码,你可能可以弄清楚这一点。

值得注意的是,我可能会将变量命名为next而不是node。但我在代码审查中可能不会指出作者的选择有误。


总的来说,关于变量名应传达多少意义以及如何传达意义存在不同的观点。但是没有普遍接受的规则。因此,你需要准备好阅读代码,而不是依赖变量名。

如果代码很复杂,或者你正在尝试学习一种新的(对你来说)数据结构,则可能会遇到问题。但是,在后一种情况下,解决方案可能是找到更好的代码进行学习。

例如,任何关于数据结构的好教科书都会提供链表的示例代码。该代码应编写得更好,并应有附带文本加以解释。如果你不想购买/借阅教科书,你可能可以在互联网上找到更好的示例代码进行学习。


2
如果我理解您的问题正确,您对将变量声明为与其所在类相同类型感到困惑,是吗?即类“Node”具有自身实例作为变量“Node node”。实际上,在这里没有“理论或概念”。一个类可以定义任何已知类型的变量。通过被定义,类“Node”就是一个已知类型。因此,它可以在自身内部声明该类型的变量。这主要用于具有某种嵌套结构的数据结构。您已经给出了一个示例,即引用下一个节点的“Node”。您还可以拥有双向链接列表:
class Node {
   Node previous;
   Node next;
}

你可以创建一个代表文件夹结构的Directory类:
class Directory {
   Directory[] subDirectories;
   File[] files;
}

或者一个 JSONObject 类,它保存了嵌套的键/值对的 JSONObject

class JSONObject {
    Map<String, JSONObject> children;
}

等等,等等。


-1

Linked List

//Node holds reference to Node
class Node{
    Node link;
    int info;
    public Node(){
    }
    public Node(int info){
        this.info=info;
    }
    public String toString(){
        return Integer.toString(info);
    }

}
class Linked{
    Node head;//head reference denoted the beginning of the linkedlist
    private int size=0;
    public void add(int info){
        if (size==0){
            head=new Node(info);
        }else{
            Node temp=head;
            while(temp.link!=null){
                temp=temp.link;
            }
            temp.link=new Node(info);
        }
        size++;
    }
    public String toString(){
        String str="";
        var temp=head;
        while(temp!=null){
            str+=temp.info+" ";
            temp=temp.link;
        }
        return str;
    }
    public static void main(String ... $){
        Linked link=new Linked();
        link.add(10);
        link.add(555);
        link.add(55);
        var out=System.out;
        out.println(link);
    }

}

这个问题是关于变量命名的。你的回答与问题无关。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接