gpt4 book ai didi

java - 这两个代码之间的区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:50 30 4
gpt4 key购买 nike

我想知道为什么这段 JAVA 代码产生的输出与 C++ 中的相同代码产生的输出不同。

#include "stdafx.h"
#include <iostream>
using namespace std;

class A
{
public:
A(){
this->Foo();
}
virtual void Foo()
{
cout << "A::Foo()" << endl;
}
};
class B : public A
{
public:
B()
{
this->Foo();
}
virtual void Foo()
{
cout << "B::Foo()" << endl;
}
};
int main(int, char**)
{
B objB;
system("pause");
return 0;
}

这会产生输出:

A::Foo()
B::Foo()

JAVA代码为:

public class Testa {
public Testa()
{
this.Foo();
}
public static void main(String[] args)
{
Testb b = new Testb();
}
void Foo()
{
System.out.println("A");
}

}
class Testb extends Testa {
public Testb()
{
this.Foo();
}
@Override
void Foo()
{
System.out.println("B");
}
}

这段代码只产生

B
B

为什么在这种情况下输出不同?

最佳答案

不同之处在于构造期间对多态性的处理。在 Java 中,对象的动态类型是派生类的动态类型,允许您甚至在构造函数有机会设置成员变量之前调用成员函数。这很糟糕。

C++ 有不同的方法:当构造函数运行时,对象的类型被认为是构造函数所属的类之一。所有对成员函数的调用都根据该假设静态解析。因此,A 的构造函数调用 A::foo(),而 B 的构造函数调用 B::foo()

关于java - 这两个代码之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26412295/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com