结论
不会被子类继承
私有变量
子类对象的堆内存中,确实包含了父类的的私有变量,只是子类代码无法直接访问,这不叫继承。
私有方法
父类的私有方法绝对没有被继承。私有方法是静态绑定的,子类根本不知道父类私有方法的存在。
方法在哪里?
所有的方法(无论公有、私有、静态、非静态),其字节码指令都统一存放在方法区中,属于 Class 对象的数据。
怎么调用?
对象内存中只有一个隐藏的引用指向方法区(可以理解为类元数据的指针)。当调用方法时,JVM是拿着“类元数据指针 + 方法签名”去方法区里找方法的,而不是在对象内部存了一大堆方法地址。
总结
- 关于方法(存在于方法区):
- 子类只继承父类的 非私有、非静态 的实例方法。
- 父类的 私有方法 不被继承(静态绑定,子类不可见)。
- 父类的 静态方法 不被继承(属于父类本身,子类只是拥有访问权限)。
- 被重写的方法,其多态状态下的入口会被子类方法替换。
- 关于变量(存在于堆内存的对象实例中):
- 子类的对象实例在堆内存中,物理上包含了父类所有的实例变量(包括 private 私有变量,它们确实占用了子类对象的内存空间)。
- 但是,从语法和继承的概念上讲,子类只能继承(即直接访问)父类的 非私有 实例变量。对于父类的 private 变量,子类只是“物理上包含了它们的空间”,但语法上“不可见、不可直接访问”(必须通过父类提供的公共getter/setter间接访问)。
- 父类的 静态变量 不在对象内存中,不被继承。