Конструктор Java не так интуитивно понятен. Или, возможно, это не Java, это C#, который не интуитивно понятен

Учитывая этот код 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 или наоборот?

6
задан Hao 16 May 2012 в 03:46
поделиться