Java упорядочение вызова метода, в рамках абстрактных типов данных? - PullRequest
1 голос
/ 20 августа 2011

Каков порядок вызова метода, когда у вас есть абстрактный класс с реализованным поведением метода, а также когда не реализовано поведение?

Допустим, мой абстрактный класс называется Abs и у него есть два подкласса: Sub1 и Sub2

.

В случае 1 Abs содержит код реализации метода Meth1

public abstract class Abs{

  public void Meth1(){
    //Some code
  }
}

В совершенно другом классе у меня есть метод:

MyMethod(Abs a){
  a.Meth1();
}

, где я передаю Sub1 или Sub2 вместо Abs

В случае 2 Abs не содержит код реализации (но Sub1 и Sub2 содержат)

public abstract class Abs{

  public abstract void Meth1();
}

и я звоню так же:

MyMethod(Abs a){
  a.Meth1();
}

после передачи в Sub1 или Sub2.

Каков порядок вызовов методов в каждом случае? Всегда ли это идет к суперклассу Abs, а затем к подклассу? Сначала идет к подклассу, потому что подкласс был передан в качестве параметра, затем JVM проверяет, есть ли код реализации, предоставленный в подклассе, и если нет, то метод суперкласса вызывается, если есть код реализации?

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Если подкласс переопределяет метод, то реализация родительского метода вообще не вызывается, если только у подкласса нет вызова super.overridenMethodName(). Это может быть в начале или в конце или где-либо еще в реализации переопределенного метода.

С другой стороны, если у абстрактного класса есть абстрактный метод, то подклассы вынуждены во время компиляции реализовывать его и обеспечивать некоторую логику.

0 голосов
/ 20 августа 2011

Для нестатического метода m выражение вызова метода o.m() выполняется путем определения класса времени выполнения объекта, на который ссылается o.Затем вызывается реализация метода этого класса (унаследованная или определенная в самом классе).

Каждый класс наследует каждый (видимый) метод от своего суперкласса, если только он не объявляет метод с той же сигнатурой, и в этом случае реализация объявленного метода переопределяет унаследованный.

Иными словами, вызывается реализация в самом конкретном суперклассе.Это все;в частности, унаследованные реализации этого метода не вызываются автоматически.Вызванный метод, в свою очередь, может, в свою очередь, вызвать любую реализацию унаследованного метода, используя super.m().

. Обратите внимание, что правила для вызова методов static различны.Кроме того, хотя класс времени выполнения получателя (o в нашем примере) определяет метод, который будет вызван, перегрузка разрешается с использованием типов параметров времени компиляции, а не их типов времени выполнения.

...