【问题标题】:How child class object accesses parent class method or Data Member via extends keyword in JavaJava中子类对象如何通过extends关键字访问父类方法或数据成员
【发布时间】:2015-10-28 14:54:38
【问题描述】:

在Java继承中,我们可以通过子类对象访问父类属性,因为有一个关键字extends可以实现继承。但我的问题是我们只能通过该类对象引用访问任何类非静态数据成员或方法,因此在继承的情况下,我们创建子类对象并访问父属性,以便按照 java 规则我们可以访问任何 DM(数据成员) 仅通过该类对象,因此在这种情况下,根据我的说法有两种可能性:

  1. 当继承发生时,所有数据成员或成员函数首先被复制到子作用域,然后我们使用它们,因为现在它们是 Child 的属性,很容易访问,但在这种情况下,相同的 DM 和方法在两者中,子记忆以及父母记忆。这不是一个好方法,因为如果我在父级中有 100 个属性,那么首先将所有 100 个属性复制到子内存中然后再使用。

  2. 当我们隐式创建子对象时,父类对象由编译器创建,所有父类方法都通过该父类对象隐式调用,但据我说这还没有完成。在 Java 中继承的情况下没有父对象的创建。您还可以通过在子类和父类中打印 ref 来检查这一点,它们都具有相同的引用,因此不会创建父对象。

所以我的问题是,如何通过子对象访问父对象的属性在内部意味着它们是如何实现的,或者是否有任何第三种方法可以实现在 java 中使用的相同功能。

【问题讨论】:

标签: java inheritance


【解决方案1】:

就像“扩展”这个词所暗示的那样,子对象是父对象的扩展。换句话说,它拥有父级的所有数据成员,以及子级添加的其他数据成员。如果父对象的内存布局是

PPPPPP

那么子对象看起来像这样:

PPPPPPCCCCC

当您考虑您的选项 (2) 时,您会说:“没有创建父对象的对象”。这是对的,也是错的。没有单独的父类实例,与您正在制作的子类实例不同。但是,父实例确实作为子实例的一部分存在,并且确实在子构造函数之前调用了父CONSTRUCTOR来初始化该部分。

【讨论】:

  • 感谢您的回复,您的意思是,正如我在我的问题中提到的第一个选项是正确的。
  • 不完全如你所说。没有什么可复制的,因为没有两个不同的位置。
  • @Parveenyadav 第一个选项不对:这里没有复制。它更像是第二个选项,除了没有单独的父引用
  • @JeffBowman:- 如果您更清楚地定义它们的访问方式,如果没有单独的父引用并且没有复制子项而不是它们的实际工作方式,将不胜感激。
  • 父实例是 chuild 实例的一部分。字面上地。就内存地址而言,假设子实例从地址 A 开始。子实例的大小为 N。假设父实例的大小为 M(其中 M
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多