Java 问题:无法从静态上下文中引用(在构造算法二叉搜索树中)

Java problem: cannot be referenced from static context ( in constract algorithm binary search tree )

当我像我的输入法函数一样为我的二叉搜索树分配新值时,程序报告错误说无法从静态上下文中引用。 (这一行 a.root.left = new Node("dd",22) 表示节点不是静态的

这是我的程序:

package trylang;

import java.util.Arrays;

public class tryBSTnode<Key extends Comparable<Key>, Value> {
    private Node root;
    private class Node{
        private Key key;
        private Value value;
        private Node left, right;
        public Node(Key key, Value val){
            this.key = key;
            this.value = val;
        }
    }
    public tryBSTnode(){

    }

    public void put(Key key, Value val){
        root = put(root,key,val);
    }

    public Node put(Node nd, Key key, Value val){
        if (nd == null) return new Node(key, val);
        int cmp = key.compareTo(nd.key);
        if (cmp>0) nd.right = put(nd.right,key,val);
        else if (cmp<0) nd.left = put(nd.left, key, val);
        else nd.value = val;
        return nd;
    }
    public static void main(String[] args) {
        tryBSTnode<String, Integer> a = new tryBSTnode<String, Integer>();
        a.put("aa",20);
        a.put("bb",67);
        a.put("cc",67);
        a.root.left = new Node("dd",22); //this line got problem
    }
}

put方法的逻辑是当node为null时,我们可以给它分配一个新的节点

 public Node put(Node nd, Key key, Value val){
        if (nd == null) return new Node(key, val);
        int cmp = key.compareTo(nd.key);
        if (cmp>0) nd.right = put(nd.right,key,val);
        else if (cmp<0) nd.left = put(nd.left, key, val);
        else nd.value = val;
        return nd;
    }

树形结构为root(aa,20)->right(bb,67)->right(cc,67),运行put方法没有报错。 root 的左侧为空。但是,当我想将一个新节点分配给树的左侧时,itellij 说无法从静态上下文中引用此行 a.root.left = new Node("dd",22)。为什么这一行在put方法中可以运行,但在main方法中却出错?

如错误所述;您不能从静态上下文(主要方法)访问非静态成员(节点)。将节点 class 放在 tryBSTNode class 之外,它就可以工作了。

Node 是一个内部 class,除了 this 之外还有一个 tryBSTNode.this,它可以访问 [=14= 的成员 - 字段或方法] 对象。

由于 Node 的绑定不是预期的,因此将其设为静态:

private static class Node {

或者把class移到tryBSTNode外面;你可以在一个来源中有额外的非public classes。

或者制作一个单独的来源。


您应该将您的主程序命名为 class TryBSTNode。也有点像单元测试,Test Driven Development。你最终可能会调查一下。