为什么从子类调用时超类字段不同?
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 你的设计。
为什么从子类调用时字段节点返回不同的大小
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 你的设计。