外部類與內部類之間的訪問 內部類相當於外部類的一個成員,和其它成員處於同一個級別,因此可以在內部類中直接訪問外部類的各個成員(包括私有屬性)。 需要註意的是在外部類中要想訪問內部類的各個成員(這裡也包括內部類的私有屬性)就必須先實例化內部類,然後才能訪問。對於為什麼能訪問內部類的私有屬性,是因為即使 ...
外部類與內部類之間的訪問
內部類相當於外部類的一個成員,和其它成員處於同一個級別,因此可以在內部類中直接訪問外部類的各個成員(包括私有屬性)。
需要註意的是在外部類中要想訪問內部類的各個成員(這裡也包括內部類的私有屬性)就必須先實例化內部類,然後才能訪問。對於為什麼能訪問內部類的私有屬性,是因為即使內部類的成員是私有的,但是也是在外部類中,和外部類的其它成員是平等的,只不過被內部類囊括是在內部中,因此訪問都必須先實例化。
例如:
class NodeManager{ private Node root; //根節點 //public int a = 3; //此處可以直接在內部類中訪問,超出外部類要麼自己訪問,要麼通過內部類的方法來訪問 //管理添加節點 public void addNode(String name){ if(root!=null){ root.add(name); }else{ root = new Node(name); } } public void deleteNode(String name){ if(root.getName().equals(name)){ root = root.next; //此處即使內部類是私有的,在外部類中也可以通過實例化的對象來訪問 }else{ root.delete(name); } } //管理列印節點 public void printNode(){ if(root != null){ System.out.print(root.getName()); } root.print(); } /* 此方法適用於在外部類外部實例化外部類讓其訪問內部類的屬性 public int getInt(){ return b; } */ //內部類,每個節點對象 class Node{ private String name; //節點名稱 private Node next; //表示當前節點的下一個節點 //此處的成員屬性要麼自己訪問,要麼通過外部類中實例化內部類對象訪問,要麼在整個類外部通過方法調用來訪問 //構造方法 public Node(String name){ this.name = name; } //獲得節點名稱 public String getName(){ return name; } //添加節點 public void add(String name){ if(this.next != null){ this.next.add(name); }else{ next = new Node(name); } } //刪除節點 public void delete(String name){ if(this.next != null){ if(this.next.getName().equals(name)){ this.next = this.next.next; }else{ this.next.delete(name); } } } //列印所有節點 public void print(){ if(this.next != null){ System.out.print("->"+this.next.getName()); this.next.print(); }else{ System.out.println(); } } /*此方法可以讓在外部類外實例化的內部類對象訪問外部類成員屬性 public int getInt2(){ return a; } */ } }
但是要是在整個類的外部不管是實例化外部類還是實例化內部類也好,都無法訪問對方的屬性或方法,只能通過自己的方法去調用對方的成員。
實例:
public static void main(String[] args){ NodeManager nm = new NodeManager(); nm.addNode("1"); nm.addNode("2"); nm.addNode("3"); nm.addNode("4"); nm.printNode(); nm.deleteNode("2"); nm.printNode(); nm.deleteNode("1"); nm.printNode(); //nm.b; //此處會報錯,外部類的實例化對象不能直接是用內部類的屬性 //NodeManager.Node n = nm.new Node("5"); //此處是在外部類外部實例化內部類對象,沒有問題,但不推薦使用 //n.a; //此處會報錯,在外部類外部實例化的內部類對象不能直接是用內部類的屬性 //nm.getInt(); //此處是通過外部類的方法訪問內部類的屬性 //n.getInt2(); //此處是通過內部類的方法訪問外部類的屬性 }