站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题类继承的机制问题,高手请进!

类继承的机制问题,高手请进!

摘要: 类继承的机制问题,高手请进!


子类实例化时会先构造一个父类的对象,然后才构造子类对象,那么这个子类对象是否是在父类对象的基础上构造的,即内存映像上是叠加的?如果不是,那么这个父类对象构造后干什么用了?这个子类对象难道是完全重新构造吗?如果是,那么子类对象就应该具有父类的所有域和方法了,包括父类私有的成员(只是不能访问而已)?请说明机理。


是内存叠加

子类对象当然拥有父类的属性和方法




子类构造的时候只会去调用父类的构造函数,父类并没有产生一个新的对象啊。


应该是内存叠加的吧


那么父类的私有成员和方法呢?没有构造吗?难道这个构造函数有智能,知道是子类调用后就只构造非私有成员和方法,非子类调用就全部调用吗?


父类的私有成员 肯定构造了


不然子类对象怎么当成父类对象 使用呢


父类的私有成员肯定也会构造,不然如果有父类的公有方法使用父类的私有成员怎么办?


我在jvm中给你找到了下面的说明,希望对你理解这一问题有所帮助。
Whenever a new class instance is created, memory space is allocated for it with room for all the instance variables declared in the class type and all the instance variables declared in each superclass of the class type, including all the instance variables that may be hidden. If there is not sufficient space available to allocate memory for the object, then creation of the class instance completes abruptly with an OutOfMemoryError. Otherwise, all the instance variables in the new object, including those declared in superclasses, are initialized to their default values

Unlike C++, the Java programming language does not specify altered rules for method dispatch during the creation of a new class instance. If methods are invoked that are overridden in subclasses in the object being initialized, then these overriding methods are used, even before the new object is completely created.
对于你的问题,可以从中找到答案,在产生子类对象时候,先将父类的所有变量进行初使化,不管他后面将用到还是不用到,所有变量都会会分配内存,直到内存溢出。注意并没有产生一个什么父类对象,第二段举了一个列子,如果你用了覆盖,尽管父类的那个方法不再使用,便他依然被产生了。



这就比较好理解为什么子类可以自动转换为父类,而父类只能强制转换为子类的原因了!强制转换的过程,就是为父类初始化子类部分的结构,两者叠加才形成子类,这样理解不知对不对?


应该不是内存叠加


对,不能用内存叠加来解释,应该是重新构造了,同时构造了父类和子类的成员变量和方法,产生了新的子类对象。


当创建子类的对象的时候,该对象包含了一个父类的子对象。这个子对象与你用父类直接创建的对象是一模一样的。
二者的区别:后者(父类直接创建的对象)原于外部
而父类的子对象被包装在子类对象的内部


↑返回目录
前一篇: 谁把static这个东西说得再简单一点行不行啊?
后一篇: 请教,如何判断一个程序是否在运行,然后根据需要kill掉?