外部类与内部类之间的访问

内部类相当于外部类的一个成员,和其它成员处于同一个级别,因此可以在内部类中直接访问外部类的各个成员(包括私有属性)。
需要注意的是在外部类中要想访问内部类的各个成员(这里也包括内部类的私有属性)就必须先实例化内部类,然后才能访问。对于为什么能访问内部类的私有属性,是因为即使内部类的成员是私有的,但是也是在外部类中,和外部类的其它成员是平等的,只不过被内部类囊括是在内部中,因此访问都必须先实例化。
例如:

 

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(); //此处是通过内部类的方法访问外部类的属性
}