给定这个 Java 代码,它会输出0 和 4:
class A{
A() { print(); }
void print() { System.out.println("A"); }
}
class B extends A{
int i = Math.round(3.5f);
public static void main(String[] args){
A a = new B();
a.print();
}
void print() { System.out.println(i); }
}
使用相同的 C# 代码,输出4 和 4
使用系统;
class A{
internal A() { print(); }
virtual internal void print() { Console.WriteLine("A"); }
}
class B : A{
int i = (int) Math.Round(3.5f);
public static void Main(string[] args){
A a = new B();
a.print();
}
override internal void print() { Console.WriteLine(i); }
}
虽然我发现 Java 上的输出应该是 4 和 4,但答案实际上是 Java 上的 0 和 4。然后我用C#试了一下,答案是4和4
是什么赋予了?Java 的基本原理是,在构建 B 期间,A 仍在初始化(因此,如果 Java 说 A 仍在初始化,我假设 B 仍在初始化),因此默认值应为 0。因此在 Java 中输出为 0 和 4。
为什么 C# 构造函数的行为与 Java 不同,反之亦然?