Как только вы создали объект типа Child
, это его тип во время выполнения.Это не изменится, независимо от приведения или того, что вы с ним делаете.Когда вы вызываете метод, будет выполняться реализация этого типа среды выполнения.Если этот тип не имеет собственной реализации, он делегирует родительскому классу.
Даже если вы вызываете method1
, который был определен в Parent
, как только этот метод вызывает method2
это будет разрешать реализацию типа объекта во время выполнения.Если это Child
, то это метод класса, который будет вызываться.
Помните, что это динамическое поведение отличается от выбора метода на основе типов параметров, который выполняется статически.Возьмем следующее с вашими определениями классов ...
public void methodTest(Parent p) {} //Let's call this "first method"
public void methodTest(Child c) {} //Let's call this "second method"
Parent p = new Parent();
Child c = new Child();
//Assume a is a variable of some type that implements the above methods
a.methodTest(p); //Will call first method
a.methodTest(c); //Will call second method
a.methodTest((Parent)c); //WILL CALL FIRST METHOD!
Таким образом, выбор метода на основе типов параметров выполняется статически.Он не будет выбирать другой метод в зависимости от типа среды выполнения.
Но выбор метода в зависимости от того, к какому объекту он вызывается, зависит от типа среды выполнения этого объекта.Это то, что позволяет нам переопределить поведение метода в подклассах.