Вопрос относительно результата «Нет позднего связывания для методов stati c» [Java] - PullRequest
2 голосов
/ 10 июля 2020

Учитывая код из родительского класса и дочернего класса:

class Parent{

   public static void classMethod(){
      System.out.println("ClassMethod in Parent"); 
   }

   public void hello(){
      System.out.println("Hello from parent, call classMethod");
      classMethod();
   }
}
class Child extends Parent{

   public static void classMethod(){
      System.out.println("ClassMethod in Child"); 
   } 

}

Если у меня это в основном методе:

public static void main(String[] arg) {
   Parent D = new Child(); 
   D.hello();
}

Почему такой результат? ->

Hello from parent, call classMethod 
ClassMethod in Parent

Итак, дочерний объект родительского класса вызывает метод экземпляра, который вызывает метод stati c. Я бы понял, почему он вызывает метод stati c из родительского класса, если hello () также был stati c, поскольку тип объекта будет определен во время компиляции, и это будет Parent. Однако, поскольку hello () здесь является методом экземпляра, он должен быть разрешен во время выполнения, а во время выполнения не является ли тип объекта фактическим типом, AKA Child type? Итак, в этом случае не будет ли он вызывать метод stati c из дочернего объекта, поскольку объект имеет дочерний тип во время выполнения?

1 Ответ

1 голос
/ 10 июля 2020

Примечание: этот ответ предполагает Child класс extends Parent. В противном случае код в основном методе просто выдает ошибку.

Это пример преобразования и полиморфизма. Поскольку он имеет тип Parent, его доступ ограничен классом Parent. Когда вы вызываете метод hello(), он вызывается в классе Parent. Затем этот метод вызывает classMethod(), но, поскольку hello() является методом в родительском классе, он также вызывает его в классе Parent, поэтому в результате вы получаете это. Тот факт, что это stati c, не имеет значения: методы stati c всегда могут быть вызваны методами экземпляра, но не всегда наоборот.

Я должен отметить одну вещь, потому что строки Parent D = new Child();, объект D на самом деле не имеет доступа ни к одному из методов stati c в Child, даже если он относится к этому типу. Если вы wi sh для D, чтобы иметь доступ к методам в Parent и Child, вы можете использовать Child D = new Child();

с Parent D = new Child();, если вы вызываете метод, он должен быть в родительском классе и будет запускать метод в родительском классе - за исключением случаев, когда в дочернем классе есть переопределяющий метод экземпляра с тем же именем, и в этом случае вместо этого будет запущен этот метод. Также следует отметить, что замещаемый метод не может быть c

...