JAVA:有关父子类的属性空间问题


class A{
        int count = 6;
}
class B extends A{
        int count = 7;
}
public class Test{
         public static void main(String[] args){
               B b = new B();//创建完b对象后,b在内存中指向的空间只有属性count = 7,还是说空间有count = 7以及count = 6.
          }
}

当创建完b对象后,b在内存中指向的空间只有属性count = 7,还是说空间有count = 7以及count = 6?

img


就是老韩右上角的那个图,为什么s指向的空间有10还有20?

Sub初始化的时候,会默认调用Base()的构造方法,即Sub会先初始化父类Base,然后初始化自身。

  • 在类文件结构中,Sub只有自身的属性,不过会有一个指向父类Base的索引,使得Sub可以通过该索引随时调用父类的方法和参数。
  • 在实例化对象时,初始化对象Sub,会划分两块内存区域,你可以把这两块内存简单理解为this和super,this区域的类指向Sub,super区域的类指向Base。

在你的例子中,s = new Sub(),s可以同时调用this和super区域;而Base b = s, b 则指向的是super,只能调用super。所以s的内存空间中存在两个count值,即this.count = 7, super.count = 6,而b只存在一个值,即super.count = 6



这些内容楼主想了解更详细的话,可以去看看《深入理解Java虚拟机》这本书

我认为应该是只有7,这个其实很像覆盖,覆盖了父类的成员变量,如果是方法会很有体现