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
方法,但这超出了此问题的范围