java继承创建_java – 继承和对象创建

在物理上你创造了一个单一的对象,但在概念上你创造了2.就像是说,一个女婴出生:身体上她只是一个,但在概念上一个新的女性已经诞生了,也是一个新的人已经诞生了新的有生命的人已经出生,地球的新居民已经出生,等等.是的,确切的.这里也有一个继承关系(subTyping),我也是故意的.为了避免混淆,最好是说只有一个对象有几个方面;一个对象是不同(超)类的成员在同一时间.

现在对逻辑部分说得足够了,我们来看看物理的一部分.在存储器中创建具有以下结构的单个(物理)对象

+--------------------------+----------------------------+

| B | C' +

+--------------------------+----------------------------+

第一部分(B)包含从C(如果有)的超类B继承的所有字段.第二部分(C’和我正在使用“补充”)包含C的“专有”(即不是从B继承但在C本身中定义)的所有字段.重要的是要注意,创建的对象不能在C’上开始,而是在B上.它是继承的字段与新字段的组合,构成了完整的对象.

现在,如果B有自己的超类A,结构就是这样的:

+--------+-----------------+----------------------------+

| A | B' | C' +

+--------+-----------------+----------------------------+

这里要注意的是B = A B’.换句话说,C不需要知道A.所有它关心的是它的直接的超类B,它隐藏了它的内部结构.

回答具体问题:

Does the constructor in this case only initialize the variable i and doesn’t create a concrete object of class?

与上述A,B和C结构上链接的方式相同,它们在初始化期间也被链接.如果不是这样,就像我原来的例子中的女孩已经出生,没有其他任何事情,我们知道她也是根据定义.不可能.完全矛盾.所以执行两个类的构造过程,包括:初始化一个“零”值的字段(对于引用为null,对于布尔值为false),并执行一个构造函数(可以调用其他构造函数).

在这种特殊情况下,字段i被初始化,执行继承构造函数,TestInheritance的字段(如果有的话)将被初始化,然后TestInheritance的构造函数将被执行.我们如何才能准确地告诉每个类的构造函数?比较简单什么启动一切都是新的TestInheritance().这显然表明TestInheritance的构造函数没有任何参数(存在;否则会出现编译错误).但是,这个构造函数没有显式地调用超类的任何构造函数(通过关键字super(…)).如上所述,这不可能,编译器自动插入等效于super(),即调用超类的构造函数而不使用参数(Inheritance()).同样,这个构造函数存在,一切都很好.产出本来是:

I am in base class 0

I am in derived class

没有参数的构造函数称为“默认构造函数”,主要原因有三个:

– 他们通常很简单,因为他们没有参数.

– 当子类的构造函数没有显式地调用任何超类构造函数时,它们被自动调用.

– 它们是为这些类自动提供的,而没有由程序员明确编写的任何构造函数.在这种情况下,构造函数什么都不做,只进行初始化.

From what I have read so far there is only one object created – of the derived class which has i variable in it.

这不完全正确.实际上,只有一个对象被创建,但它对应于新的(TestInheritance)使用的类,在这种情况下,它恰好没有字段,但这是不相关的.实际上,打印出两条输出线.从概念上讲,我们已经提到了这一点.

But from the time the constructor of base class is called and the point in time where constructor of the derived class is called how/where is i stored in memory?

当执行新的TestInheritance()时,即使在执行构造函数之前,即使在执行初始化之前,发生的第一件事就是为整个对象分配内存.

– 通常这个内存是“脏”的,这就是为什么需要初始化它.

– TestInheritance的字段,其超类的字段等等.即使是存储器内的对象内的每个字段的位置也是事先知道的.

因此,即使在调用基类的构造函数之前,也已经为i和任何其他字段分配了内存,只是它们是“dirty”(未初始化的).

And what would be the case in which base class is an abstract one.

没有区别.唯一的一个是你不能自己创建一个抽象类的对象.您可以将其创建为(具体)子类的一部分.这与新人不能自己出生的事实相似.这是一个女婴或一个男婴.

I would really appreciate if I can know what happens in memory at different points of time.

我希望我能做到.

If I have said something which is fundamentally incorrect please let me know. I really want to know how this thing works.

没有什么“根本不正确”.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值