Java 在调用超类型构造函数之前无法引用此

Java 在调用超类型构造函数之前无法引用此,java,compiler-errors,Java,Compiler Errors,我正试图用Java实现一个循环队列类。在这样做的过程中,我必须创建一个节点类来将元素和指向下一个节点的指针组合在一起。由于是圆形的,节点需要能够指向自己。然而,当我开始编译下面的代码时,编译器(javac)告诉我我的构造函数(即第5行和第8行)出现了错误,给出了问题的名称,我无法理解为什么它不起作用 任何关于我的用法不正确的帮助和解释都将不胜感激 public class Node<Key>{ private Key key; private Node<Key&

我正试图用Java实现一个循环队列类。在这样做的过程中,我必须创建一个节点类来将元素和指向下一个节点的指针组合在一起。由于是圆形的,节点需要能够指向自己。然而,当我开始编译下面的代码时,编译器(javac)告诉我我的构造函数(即第5行和第8行)出现了错误,给出了问题的名称,我无法理解为什么它不起作用

任何关于我的用法不正确的帮助和解释都将不胜感激

public class Node<Key>{
    private Key key;
    private Node<Key> next;
    public Node(){
        this(null, this);
    }
    public Node(Key k){
        this(k, this);
    }
    public Node(Key k, Node<Key> node){
        key = k;
        next = node;
    }
    public boolean isEmpty(){return key == null;}
    public Key getKey(){return key;}
    public void setKey(Key k){key = k;}
    public Node<Key> getNext(){return next;}
    public void setNext(Node<Key> n){next = n;}
}
公共类节点{
私钥;
私有节点下一步;
公共节点(){
这个(空,这个);
}
公共节点(密钥k){
这个(k,这个);
}
公共节点(密钥k,节点){
key=k;
下一个=节点;
}
公共布尔值isEmpty(){return key==null;}
公钥getKey(){return Key;}
public void setKey(Key k){Key=k;}
公共节点getNext(){return next;}
public void setNext(节点n){next=n;}
}
编译错误为

Cannot refer to 'this' nor 'super' while explicitly invoking a constructor
基本上,您不能从内部使用“
此”
此(…)

编译错误是

Cannot refer to 'this' nor 'super' while explicitly invoking a constructor

基本上,您不能从内部使用“
此”
此(…)

您不需要在所有情况下都传递它。因为您可以在其他构造函数中引用它,所以不需要在所有情况下都传递它。由于您可以在另一个构造函数中引用它,因此您不能在构造函数中引用它(或super),因此您应该像这样更改代码:

public class Node<Key>{
    private Key key;
    private Node<Key> next;
    public Node(){
    key = null;
        next = this;
    }
    public Node(final Key k){
    key = null;
        next = this;
    }
    public Node(final Key k, final Node<Key> node){
        key = k;
        next = node;
    }
    public boolean isEmpty(){return key == null;}
    public Key getKey(){return key;}
    public void setKey(final Key k){key = k;}
    public Node<Key> getNext(){return next;}
    public void setNext(final Node<Key> n){next = n;}
}
公共类节点{
私钥;
私有节点下一步;
公共节点(){
key=null;
下一个=这个;
}
公共节点(最终密钥k){
key=null;
下一个=这个;
}
公共节点(最终密钥k,最终节点){
key=k;
下一个=节点;
}
公共布尔值isEmpty(){return key==null;}
公钥getKey(){return Key;}
public void setKey(最终密钥k){Key=k;}
公共节点getNext(){return next;}
public void setNext(最终节点n){next=n;}
}
您不能在构造函数中引用this(或super),因此您应该像这样更改代码:

public class Node<Key>{
    private Key key;
    private Node<Key> next;
    public Node(){
    key = null;
        next = this;
    }
    public Node(final Key k){
    key = null;
        next = this;
    }
    public Node(final Key k, final Node<Key> node){
        key = k;
        next = node;
    }
    public boolean isEmpty(){return key == null;}
    public Key getKey(){return key;}
    public void setKey(final Key k){key = k;}
    public Node<Key> getNext(){return next;}
    public void setNext(final Node<Key> n){next = n;}
}
公共类节点{
私钥;
私有节点下一步;
公共节点(){
key=null;
下一个=这个;
}
公共节点(最终密钥k){
key=null;
下一个=这个;
}
公共节点(最终密钥k,最终节点){
key=k;
下一个=节点;
}
公共布尔值isEmpty(){return key==null;}
公钥getKey(){return Key;}
public void setKey(最终密钥k){Key=k;}
公共节点getNext(){return next;}
public void setNext(最终节点n){next=n;}
}

无法将“this”作为参数传递给调用构造函数。

无法将“this”作为参数传递给调用构造函数。

您看到了吗:?您看到了吗:?在阅读注释和答案后,这基本上与我确定的代码相同,但我没有使用关键字final(javac也没有抱怨)。它在这里有什么用途?我应该用它吗?(我认为您在第9行中的意思是“key=k”,但这是旁注)最后一个关键字不是必需的,它只是告诉虚拟机尽可能少地使用堆内存。至于第9行,你是对的。在阅读了评论和答案之后,这基本上是我决定使用的相同代码,但是我没有使用关键字final(javac也没有抱怨)。它在这里有什么用途?我应该用它吗?(我认为您在第9行中的意思是“key=k”,但这是旁注)最后一个关键字不是必需的,它只是告诉虚拟机尽可能少地使用堆内存。至于第九行,你是对的。