Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在本例中没有像在Java中的动态多态性中那样调用子类方法?_Java_Inheritance - Fatal编程技术网

为什么在本例中没有像在Java中的动态多态性中那样调用子类方法?

为什么在本例中没有像在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

我已经做了一些研究,但我无法找到为什么在下面的示例中不发生运行时多态性。 根据我的理解,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) {
    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变量。。
希望这有助于

Well
long
int
是不同的参数。您可以在方法上使用
@Override
检查它是否确实覆盖了某些内容。您正在重载而不是覆盖Well
long
int
的可能重复项是不同的参数。您可以在方法上使用
@Override
方法来检查它是否确实重写了某些内容。您正在重载而不是重写的可能重复项