为什么从子类调用时超类字段不同?

Why is the superclasses field different when called from subclass?

为什么从子类调用时字段节点返回不同的大小

sub类 不应该访问他们的超级 类 字段吗?

这是可重现的例子:

Manager.java

import java.util.HashMap;

public class Manager {
    protected HashMap<Integer,Node> nodes = new HashMap<>();

    public HashMap<Integer, Node> getNodes() { return nodes; }

    public void addNode(Node node){
        nodes.put(nodes.size(),node);
    }

    public static void main(String[] args) {
        Manager manager = new Manager();
        manager.addNode(new Node());
        System.out.println("(from Manager) manager.nodes.size() = " + manager.nodes.size());
        manager.getNodes().get(0).printNodesSize();
    }
}

Node.java

public class Node extends Manager {
    public void printNodesSize() {
        System.out.println("(from Node) manager.nodes.size() = " + super.nodes.size());
    }
}

System.out:

(from Manager) manager.nodes.size() = 1
(from instanced Node) manager.nodes.size() = 0

Process finished with exit code 0

您遇到的问题与继承无关。来电:

manager.getNodes()

将return一个Map<Integer, Node>(检查你自己在classManager中的方法定义),它只包含一个索引为1的元素(因为是你将密钥定义为 nodes.size()+1).

因此,当您调用 manager.getNodes().get(0) 时,您会得到一个 null 元素(地图不包含任何具有键 0 的元素)。

如果将 .get(0) 替换为 .get(1),它将起作用。

旁注:您的设计不是很干净。 class Manager (parent) 包含一个 Node 的映射,它是它自己的 child。 child (Node) 应该知道它的 parent (Manager),但反之则不然。

编辑

super.nodes.size() 的输出为 0,因为您没有指向您认为指向的 Manager 的实例。

当您执行 new Node()(添加到 manager 的节点)时,您正在创建一个 new Manager(),默认情况下它有一个空映射。

因此,当您调用 super.nodes.size() 时,您的 super 并不是您所想的 manager,而是您在执行 [=26] 时创建的 Manager 的另一个实例=],您从未向其中添加任何内容。

再次,我建议你检查我上面的 side-note 和 re-consider 你的设计。