子类通过公共getter访问父类私有字段时,该字段存储位置探究
子类实例中父类私有字段的存储位置解析
其实这个问题特别容易被“私有字段不被继承”这句话绕晕,我来给你掰扯清楚:
当你实例化Dog这类子类的时候,JVM只会创建一个对象实例,根本不存在父类、子类两个对象的说法。那父类的私有字段name到底存在哪儿?答案就是:这个唯一的子类实例对象的内存空间里。
那为啥会有“不被继承”的说法?这里的“继承”指的是访问权限层面的限制——子类本身不能直接去读写父类的私有字段,必须通过父类提供的公共方法(比如getName())来操作。但从存储的角度看,父类的所有字段(不管私有还是非私有)都会被包含在子类实例的内存里,因为子类实例本质上是对父类实例的扩展,它得承载父类的所有状态信息,只是这些私有状态子类自己没权限直接碰而已。
打个生活化的比方:就像你的柜子里有个带锁的抽屉(父类私有字段),你自己(子类)没钥匙打不开,但抽屉实实在在是属于你的柜子(子类实例)的,你得用柜子主人(父类)给你的钥匙(getter方法)才能拿到里面的东西。
还有个关键点要提:当你调用子类构造方法时,会先触发父类的构造方法,这一步是在初始化子类实例里属于父类的那些字段,而不是创建一个单独的父类对象。从始至终只有一个对象,父类的所有字段都存在这个对象里,只是子类没有直接访问的权限罢了。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

