黑马程序员技术交流社区

标题: Java非静态内部类与外部类之间相互访问的一个问题 [打印本页]

作者: 张庚    时间: 2013-2-4 12:08
标题: Java非静态内部类与外部类之间相互访问的一个问题
本帖最后由 张向辉 于 2013-2-6 15:46 编辑

package com.itcast

public class Outer{
    private int outProp=9;
    class Inner{
        private int inProp=5;
        public void accessOuterProp(){
                System.out.println("外部类的outProp属性值:"+outProp);
        }
    }
        public void accessInnerProp(){
                System.out.println("内部类的inProp=5属性值:"+new Inner().inProp);
        }
        
        public static void main(String[] args){
                Outer out=new Outer();
                out.accessInnerProp();
        }

}

照理来说这里内部类里的实例属性inProp的访问控制权限是private应该只能在内部类Inner里可见,为什么在外部类的实例方法里可以直接通过new一个内部类对象访问到该属性,我觉得应该在内部类里写一个public的getter方法在外部类的实例方法里通过new Inner().getInProp()这样才访问的到呀 这里为什么可以直接通过new Inner().内部类属性直接访问到该private级别的值?


作者: 黄鸿达    时间: 2013-2-4 13:17
你在out.accessInnerProp();new 了个new Inner()  这个new Inner()是在Outer out=new Outer()  这个对象里面的 ,在图中new Inner()相当于是new Outer() 成员
private修饰的 ,是可以被本类访问。本类访问本类的私有成员,可以访问吗?可以


heima11.JPG (52.71 KB, 下载次数: 8)

heima11.JPG

作者: 张世钦    时间: 2013-2-4 13:23
楼主,咱们这么理解,私有属性属于对象,如果外界可以new出来私有属性所属的对象,那么对象可以访问自己的私有属性.

也就是说,在你的代码中  new Inner()是建立了一个内部类对象,   这个内部类对象当然可以访问自己的私有属性,
作者: 李洪因    时间: 2013-2-4 13:57
private是私有属性,如果对象可以调用对方的成员变量或方法只能说明这个成员变量或方法是静态的,是他们公用的。保护控制在类的级别上,而不是对象的级别上
通过new Inner().getInProp()   这样是外部类调用的,如: new Outer().getInProp();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2