Java关系b/w父函数和子函数调用机制
我试图理解父函数和子函数调用机制之间的关系,但没有得到这一点Java关系b/w父函数和子函数调用机制,java,polymorphism,Java,Polymorphism,我试图理解父函数和子函数调用机制之间的关系,但没有得到这一点 class Parent { Parent() { greeting();//as we are not calling this on any object, by default it has Parent's greeting method } void greeting() { System.out.println("Greeting Parent"); } }
class Parent {
Parent() {
greeting();//as we are not calling this on any object, by default it has Parent's greeting method
}
void greeting() {
System.out.println("Greeting Parent");
}
}
public class SuperConstructor extends Parent {
public SuperConstructor() {
//super(); //i know this
greeting();
}
void greeting() {
System.out.println("Greeting Child");
}
public static void main(String[] args) {
new SuperConstructor();
}
}
输出:问候孩子,为什么?这里的情况如何?
问候孩子
输出(我预期)
问候家长(原因:因为方法存在于家长类中)
问候孩子将
问候孩子
视为输出的原因是超级构造函数
中的问候()
方法覆盖了父类
的问候()
方法。当一个方法重写另一个方法时,它将完全替换is。请看下面解释覆盖与隐藏的帖子:之所以将问候孩子
视为输出,是因为超级构造函数中的问候()
方法覆盖了父类的问候()
方法。当一个方法重写另一个方法时,它将完全替换is。请看下面解释重写与隐藏的帖子:这是因为父级正在调用重写的方法。将其设为私有,您将得到您期望的结果,私有方法是不可重写的。这是因为父级正在调用被重写的方法。将其设为私有,您将得到您期望的结果,私有方法是不可重写的。继承规则:如果子类中存在重写方法,它将始终首先执行!和父对象的方法将被忽略
那么,这里发生了什么?
>这个新的超级构造函数()代码>将首先执行
>这将创建一个新的子类
>请记住,如果子构造函数没有调用超级构造函数,那么JVM将在子类构造函数中隐式添加一个。这将是执行的第一行
因此,您的子构造函数将调用Super()
。您的父构造函数将执行greeting()当子类重写该方法时,它将执行该方法而不是父类的方法。为什么?因为这是我们的继承规则
>之后,子构造函数的执行将正常进行。下一行是greeting()代码>,这将再次执行子对象的方法。为什么?因为我们的继承规则是这样说的。继承规则:如果子类中存在重写方法,它将始终首先执行!和父对象的方法将被忽略
那么,这里发生了什么?
>这个新的超级构造函数()代码>将首先执行
>这将创建一个新的子类
>请记住,如果子构造函数没有调用超级构造函数,那么JVM将在子类构造函数中隐式添加一个。这将是执行的第一行
因此,您的子构造函数将调用Super()
。您的父构造函数将执行greeting()当子类重写该方法时,它将执行该方法而不是父类的方法。为什么?因为这是我们的继承规则
>之后,子构造函数的执行将正常进行。下一行是greeting()代码>,这将再次执行子对象的方法。为什么?因为我们的继承规则是这样规定的。谢谢!但我不能得到继承的规则。我在寻找推理…事情是如何运作的internally@Naroji例如,如果父级有方法x()
,而子级有相同的方法。然后,在任何正常情况下,都将调用child方法。如果要调用同一父方法,则需要使用super.x()
。您必须阅读更多关于继承的所有规则。谢谢!但我不能得到继承的规则。我在寻找推理…事情是如何运作的internally@Naroji例如,如果父级有方法x()
,而子级有相同的方法。然后,在任何正常情况下,都将调用child方法。如果要调用同一父方法,则需要使用super.x()
。您必须阅读更多关于继承的所有规则。