為什么從子類呼叫時欄位節點回傳不同的大小
子類不應該訪問它們的超類欄位嗎?
這是可重現的示例:
管理器.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();
}
}
節點.java
public class Node extends Manager {
public void printNodesSize() {
System.out.println("(from Node) manager.nodes.size() = " super.nodes.size());
}
}
系統輸出:
(from Manager) manager.nodes.size() = 1
(from instanced Node) manager.nodes.size() = 0
Process finished with exit code 0
uj5u.com熱心網友回復:
您遇到的問題與繼承無關。來電:
manager.getNodes()
將回傳一個Map<Integer, Node>(檢查類中您自己的方法定義Manager),其中僅包含一個帶索引1的元素(因為您將鍵定義為nodes.size() 1)。
因此,當您呼叫 時manager.getNodes().get(0),您會得到一個null元素(地圖不包含任何帶有 key 的元素0)。
如果您替換.get(0)為.get(1),它將起作用。
旁注:您的設計不是很干凈。類Manager(父級)包含一個Nodes 的映射,它是它自己的子級。孩子 ( Node) 應該知道它的父母 ( Manager),但反之則不然。
編輯
的列印super.nodes.size()是 0 因為你沒有指向Manager你認為你指向的實體。
當你這樣做時new Node()(你添加到你的節點manager),你正在創建一個new Manager()默認情況下有一個空地圖的節點。
所以當你打電話時super.nodes.size(),你super的不是你想的那樣,而是你在做的時候創建manager的另一個實體,你從來沒有添加任何東西。Managernew Node()
再次,我建議您檢查我上面的旁注并重新考慮您的設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476748.html
上一篇:如何在使用ArrayList的“removeRange”方法時使用泛型來實作型別安全
下一篇:在圓圈中重新定位物件
