为什么在本例中没有像在Java中的动态多态性中那样调用子类方法?
我已经做了一些研究,但我无法找到为什么在下面的示例中不发生运行时多态性。 根据我的理解,foo(inta)应该被称为in-child,但out-put是“parentwithlong”。有人能解释一下吗为什么在本例中没有像在Java中的动态多态性中那样调用子类方法?,java,inheritance,Java,Inheritance,我已经做了一些研究,但我无法找到为什么在下面的示例中不发生运行时多态性。 根据我的理解,foo(inta)应该被称为in-child,但out-put是“parentwithlong”。有人能解释一下吗 class Parent { public void foo() throws RuntimeException { System.out.println("Parent with no Parameter"); } public void foo(long a) { Syst
class Parent {
public void foo() throws RuntimeException {
System.out.println("Parent with no Parameter");
}
public void foo(long a) {
System.out.println("Parent with long");
}
}
class Child extends Parent {
public void foo() {
System.out.println("Child with no parameter");
}
public void foo(int a) throws RuntimeException {
System.out.println("Child with int");
}
}
class Demo {
public static void main(String... args) {
Parent p = new Child();
int a = 10;
p.foo(a);
}
}
输出:
具有长多态性的父级仅在方法具有完全相同的签名(相同数量和类型的参数)时适用。多态性仅在方法具有完全相同的签名(相同数量和类型的参数)时适用。您拥有的是具有两个方法的父级:
foo(long)
和foo()
。以及从其父级继承并添加两个新的不同方法的子级:foo(int)
和(其中一个重载现有方法)foo()
(其中一个重写继承的方法)
有不同的机制:编译时发生什么,运行时发生什么。在编译时,编译器只会相应地查看变量类型。在运行时,执行环境。我们将研究对象类型
现在,在编译调用p.foo(a)
时,编译器将查看p
的类型,即Parent
,并在Parent
类中查找相应的可调用方法。它查找foo(long)
,然后生成对方法foo(long)
的动态调用,并在运行时将int
转换为long
,转换为实际对象(类型为Child
)。但是这个对象只有一个这样的方法,即父对象中的方法,因此将调用这个方法
将Child
的foo(int)
更改为foo(long)
,您将得到您想要的。您拥有的是Parent
,有两种方法:foo(long)
和foo()
。以及从其父级继承并添加两个新的不同方法的子级:foo(int)
和(其中一个重载现有方法)foo()
(其中一个重写继承的方法)
有不同的机制:编译时发生什么,运行时发生什么。在编译时,编译器只会相应地查看变量类型。在运行时,执行环境。我们将研究对象类型
现在,在编译调用p.foo(a)
时,编译器将查看p
的类型,即Parent
,并在Parent
类中查找相应的可调用方法。它查找foo(long)
,然后生成对方法foo(long)
的动态调用,并在运行时将int
转换为long
,转换为实际对象(类型为Child
)。但是这个对象只有一个这样的方法,即父对象中的方法,因此将调用这个方法
将Child
的foo(int)
更改为foo(long)
,您将得到您想要的。正如您所说,多态性是正确的。您看到的是编译时多态性,即重载
来自子级的方法已在编译时确定,因为父级中没有定义等效的方法,也没有应用ovveriding(运行时多态性) 正如你所说,多态性是正确的。您看到的是编译时多态性,即重载
来自子级的方法已在编译时确定,因为父级中没有定义等效的方法,也没有应用ovveriding(运行时多态性) 在java中,多态性采用自下而上的机制。。你看。。创建子对象时,实际上是在创建专利对象。。而且,当你的孩子申请专利时,它永远不会出错。所以实际上,您正在创建一个专利对象。。根本不是子对象。。这就是为什么它要执行父母的方法。。如果您想了解多态性是如何工作的。。然后只需创建子对象=新建子对象()。
然后传递Long或int变量。。
希望这对java多态性在自下而上机制中的工作有所帮助。。你看。。创建子对象时,实际上是在创建专利对象。。而且,当你的孩子申请专利时,它永远不会出错。所以实际上,您正在创建一个专利对象。。根本不是子对象。。这就是为什么它要执行父母的方法。。如果您想了解多态性是如何工作的。。然后只需创建子对象=新建子对象()。
然后传递Long或int变量。。
希望这有助于Welllong
和int
是不同的参数。您可以在方法上使用@Override
检查它是否确实覆盖了某些内容。您正在重载而不是覆盖Welllong
和int
的可能重复项是不同的参数。您可以在方法上使用@Override
方法来检查它是否确实重写了某些内容。您正在重载而不是重写的可能重复项