Java: нестатический c метод insertValue (int, java .lang.String) не может быть указан из контекста stati c - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь реализовать двоичное дерево, в частности, я пытаюсь написать метод для вставки узла в дерево.

Узел состоит из целочисленного ключа (для позиций узлы) и значение String (значение внутри узла).

Код ниже предназначен для класса узла:

public class Node {
    private int key;
    private String value;
    private Node left;
    private Node right;
    public Node(int key, String value){
        this.key = key;
        this.value = value;
        this.left = null;
        this.right = null;
    }
    public void setLeftChild(Node child) {
        left = child;
    }
    public void setRightChild(Node child) {
        right = child;
    }
    public int getValue() { return key; }
    public Node getLeftChild() { return left; }
    public Node getRightChild() { return right; }
    public int getKey(){ return key; }
}

И это класс дерева:

public class BinaryTree {
    private static Node root;
    public BinaryTree(){
        root = null;
    }
    public BinaryTree(int key, String string) {
        root = new Node(key,string);
    }
    public void insertValue(int key, String value) {
        insert(key, value, root);
    }
    public void insert(int key, String value, Node currentNode) {
        //base case
        if (currentNode == null) {
            currentNode = new Node(key, value);
        } else {
            if ( key <= currentNode.getKey())
                insert(key, value, currentNode.getLeftChild());
            else {
                if ( key > currentNode.getKey())
                    insert(key, value, currentNode.getRightChild());
            }
        }
    }
    public static void main(String[] args){
        BinaryTree alpha = new BinaryTree(5,"Bella");
        insertValue();
    }
}

Я получаю следующую ошибку от Java:

Ошибка: (32, 9) java: non-stati c method insertValue (int, java .lang.String) нельзя ссылаться из stati c context

Я не понимаю, почему. Может кто-нибудь объяснить мне, почему это не работает? Идея правильная? Вызов рекурсии правильный?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

не объявляйте Node root как static в этой строке private static Node root;, лучше сделать следующее:

private Node root; // remove the "static" keyword

И у вас еще одна ошибка в main method

// insertValue(); // it is wrong
alpha.insertValue(); // call it like this

И все будет в порядке ...

Теперь почему это происходит :

Чтобы понять, почему это происходит, вы должны понять как static работает в java. Все, что объявлено с использованием static, может быть method/variable, - это shared между all objects от class. А это означает, что будет только один экземпляр переменной для всех объектов, или вы можете сказать, что все объекты будут совместно использовать одну единственную переменную. Теперь, как сказано, не non-static variable/method не может быть used/called в method, которое объявлено как static т.е. static method. Просто вы не можете использовать non-static variable/method в методе static. Причина, static method принадлежит области класса, а указатель this не передается в static method, поэтому вы не можете использовать non-static переменные / методы.

Если вы поняли концепцию stati c, теперь позвольте мне объяснить проблемы вашего кода:

Первая проблема - почему static root неверно :

Причина, если вы объявляете root как static будет only one root для всех Binary Tree, которые вы создаете. Но, конечно, вы ожидаете, что у разных двоичных деревьев будут разные корни.

Вторая проблема - почему просто вызов insertValue(); неверен :

Вы в main() method, обратите внимание, что main() равно static. Но insertValue() - это not static. Но вы уже знаете, что вы не можете вызвать метод non-static из метода static.

Надеюсь, это проясняет ваше понимание. дайте мне знать, если у вас возникнут еще вопросы ...

0 голосов
/ 06 августа 2020

Попробуйте в основном методе

alpha.insertValue(1,"Something");
...