Java 父类';在子类对象中调用s定义的方法?

Java 父类';在子类对象中调用s定义的方法?,java,Java,这是一个与实现相关的问题,或者我可能想得太多了。假设我有一个子类继承自父类。据我理解,它将从父类继承方法定义,而不是从构造函数继承。我们需要提供,否则编译器将通过超级方法调用提供构造函数。我们这样做的原因是,如果没有父类对象实例,我们从子类中的父类获取的方法定义将不存在 这是否意味着,当我调用子类中尚未重写的父类对象定义方法时,将在父对象实例的子类内部调用该方法?我想应该是这样的,因为子类确实调用了父类构造函数并创建了它的实例。我认为您被术语“构造函数”误导了。如果措辞是“初始值设定者”,IMH

这是一个与实现相关的问题,或者我可能想得太多了。假设我有一个子类继承自父类。据我理解,它将从父类继承方法定义,而不是从构造函数继承。我们需要提供,否则编译器将通过超级方法调用提供构造函数。我们这样做的原因是,如果没有父类对象实例,我们从子类中的父类获取的方法定义将不存在


这是否意味着,当我调用子类中尚未重写的父类对象定义方法时,将在父对象实例的子类内部调用该方法?我想应该是这样的,因为子类确实调用了父类构造函数并创建了它的实例。

我认为您被术语“构造函数”误导了。如果措辞是“初始值设定者”,IMHO会更清楚——但确定的术语是“构造函数”

如果子类
Sub
扩展了父类
parent
,则创建
Sub
实例不会创建第二个独立的
父实例

当您的
Sub
构造函数调用
super()
构造函数时,这只意味着
父类中描述的方面按照
父类
构造函数希望的方式初始化,例如用适当的值填充
父类
中定义的字段。此
super()
构造函数调用不会构造/创建新实例,而是初始化唯一实例的
父级定义部分,这就是为什么我认为“构造函数”这个名称有误导性

在调用
super()
之后,您的
Sub
构造函数可以自由地执行它的任务。所有这些都发生在一个实例上,该实例组合了两个类中的字段(和方法)

因此,当您在
实例上调用
定义的方法时,没有可能接收调用的不同的
实例,这一切都发生在单个
实例上。由于该方法是在父级
中定义的,因此它对父级
的子级
扩展一无所知,例如,无法访问子级定义的字段(除非使用反射等“肮脏技巧”)

如果愿意,可以将
实例视为
实例,在该实例的末尾添加了一些字段和方法
Parent
-定义的方法在实例(1)的
Parent
部分工作,
Sub
方法查看完整实例

我们这样做的原因是我们从 没有父类,子类中的父类将不存在 类对象实例

所以,这不是真的。“父类对象实例”不存在(至少在实例与子类实例不同的意义上不存在),它是子类实例的第一部分,然后是子类字段


(1) 这里有一些注意事项,例如,如果在
子类中重写了
父类
方法,但这超出了这个问题的范围。

我认为您被术语“构造函数”误导了。如果措辞是“初始值设定者”,IMHO会更清楚——但确定的术语是“构造函数”

如果子类
Sub
扩展了父类
parent
,则创建
Sub
实例不会创建第二个独立的
父实例

当您的
Sub
构造函数调用
super()
构造函数时,这只意味着
父类中描述的方面按照
父类
构造函数希望的方式初始化,例如用适当的值填充
父类
中定义的字段。此
super()
构造函数调用不会构造/创建新实例,而是初始化唯一实例的
父级定义部分,这就是为什么我认为“构造函数”这个名称有误导性

在调用
super()
之后,您的
Sub
构造函数可以自由地执行它的任务。所有这些都发生在一个实例上,该实例组合了两个类中的字段(和方法)

因此,当您在
实例上调用
定义的方法时,没有可能接收调用的不同的
实例,这一切都发生在单个
实例上。由于该方法是在父级
中定义的,因此它对父级
的子级
扩展一无所知,例如,无法访问子级定义的字段(除非使用反射等“肮脏技巧”)

如果愿意,可以将
实例视为
实例,在该实例的末尾添加了一些字段和方法
Parent
-定义的方法在实例(1)的
Parent
部分工作,
Sub
方法查看完整实例

我们这样做的原因是我们从 没有父类,子类中的父类将不存在 类对象实例

所以,这不是真的。“父类对象实例”不存在(至少在实例与子类实例不同的意义上不存在),它是子类实例的第一部分,然后是子类字段

(1) 有几个注意事项,例如,如果在
Sub
类中重写了
Parent
方法,但这超出了此问题的范围