1. 程式人生 > >外部類與內部類之間的訪問(程式碼是連結串列資料結構為例)

外部類與內部類之間的訪問(程式碼是連結串列資料結構為例)

外部類與內部類之間的訪問

	內部類相當於外部類的一個成員,和其它成員處於同一個級別,因此可以在內部類中直接訪問外部類的各個成員(包括私有屬性)。
	需要注意的是在外部類中要想訪問內部類的各個成員(這裡也包括內部類的私有屬性)就必須先例項化內部類,然後才能訪問。對於為什麼能訪問內部類的私有屬性,是因為即使內部類的成員是私有的,但是也是在外部類中,和外部類的其它成員是平等的,只不過被內部類囊括是在內部中,因此訪問都必須先例項化。
	例如:
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(); //此處是通過內部類的方法訪問外部類的屬性
	}