Расширить Selenium WebDriver WebElement?

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

И переопределение метода известно как динамический полиморфизм или простой полиморфизм или диспетчер времени выполнения или динамическое связывание, потому что переопределенный вызов метода разрешен во время выполнения.

Чтобы понять, почему это так, давайте возьмем пример Mammal и Human class

class Mammal {
    public void speak() { System.out.println("ohlllalalalalalaoaoaoa"); }
}

class Human extends Mammal {

    @Override
    public void speak() { System.out.println("Hello"); }

    public void speak(String language) {
        if (language.equals("Hindi")) System.out.println("Namaste");
        else System.out.println("Hello");
    }

}

. Я включил вывод, а также байт-код в нижних строках кода

Mammal anyMammal = new Mammal();
anyMammal.speak();  // Output - ohlllalalalalalaoaoaoa
// 10: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V

Mammal humanMammal = new Human();
humanMammal.speak(); // Output - Hello
// 23: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V

Human human = new Human();
human.speak(); // Output - Hello
// 36: invokevirtual #7 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:()V

human.speak("Hindi"); // Output - Namaste
// 42: invokevirtual #9 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:(Ljava/lang/String;)V

. И посмотрев на выше кода мы видим, что байт-коды человеческих млекопитающих.speak (), human.speak () и human.speak («Hindi») совершенно разные, потому что компилятор способен различать их на основе списка аргументов и ссылки на класс. И поэтому перегрузка метода известна как статический полиморфизм.

Но байт-код для anyMammal.speak () и humanMammal.speak () тот же, поскольку в соответствии с компилятором оба метода вызываются по ссылке Mammal, но вывод для оба вызова метода различны, потому что во время выполнения JVM знает, какой объект держит ссылку, и JVM вызывает метод объекта, и поэтому метод Overriding известен как динамический полиморфизм.

Итак, из выше кода и байт-кода, ясно, что во время компиляции фазовый метод вызова рассматривается из ссылочного типа. Но во время выполнения метод будет вызываться из объекта, который хранится ссылка.

Если вы хотите узнать больше об этом, вы можете узнать больше о . Как перегрузка и переопределение метода обработки JVM внутри .

13
задан Alex.K. 17 November 2015 в 01:54
поделиться