gegeben ist, diese gibt 0 und 4:Java-Konstruktor ist nicht so intuitiv. Oder vielleicht ist es nicht Java, es ist C#, dass dieser Java-Code nicht intuitiv
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); }
}
Und mit diesem identisch C# -Code, diese gibt 4 und 4
mit 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); }
}
Obwohl ich herausfinden, dass der Ausgang 4 und 4 auf Java sein sollte, aber die Antwort ist eigentlich 0 und 4 auf Java. Dann habe ich es in C# versucht, die Antwort ist 4 und 4
Was gibt? Java rationale ist, während der Konstruktion von B, A ist immer noch initialisieren (folglich ich Posit B ist immer noch initialisiert, wenn Java sagte A ist immer noch initialisieren), so sollte der Standardwert 0 sein. Daher ist die Ausgabe 0 und 4 in Java.
Warum unterscheidet sich das C# -Konstruktorverhalten von Java oder umgekehrt?
Ich lasse andere Leute das "Warum" beantworten, aber diese Art von Problemen ist der Grund, warum es allgemein als schlechte Übung angesehen wird, virtuelle Methoden von Konstruktoren aufzurufen. –
+1 für den Aufruf einer virtuellen Methoden aus Konstruktor eine schlechte Praxis. Die Ausgabe ist nicht vorhersagbar angesichts unterschiedlicher Sprachen haben unterschiedliche Design-Philosophie – Hao
@HovercraftFullOfEels Ich fühle das auch. Ich wollte jedoch eine Lösung finden. Wie man die Code-Absicht klarer macht oder das Code-Verhalten vorhersagbar macht, angesichts der Nuancen der Sprachen. Es mag keine klare Lösung für dieses Problem geben, aber vielleicht gibt es einige Best Practices, z.B. die virtuelle Methode sollte nicht im Konstruktor – Hao