Учитывая этот код 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
using System;
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); }
}
Хотя я понимаю, что вывод должен быть 4 и 4 на Java, но на самом деле ответ 0 и 4 на Java. Потом попробовал на C#, ответ 4 и 4
Что дает? Обоснование Java заключается в том, что во время создания B A все еще инициализируется (следовательно, я полагаю, что B все еще инициализируется, если Java сказал, что A все еще инициализируется), поэтому значение по умолчанию должно быть 0. Следовательно, вывод равен 0 и 4 в Java.
Почему поведение конструктора C# отличается от поведения конструктора Java или наоборот?