Как узнать, полиморфизм ли это во время компиляции или во время исполнения? - PullRequest
0 голосов
/ 05 ноября 2018

Рассмотрим суперкласс:

class superclass
{
    public void fun() {.....}
}

и его подкласс:

class subclass extends superclass
{
    public void fun(){.......}
    public static void main()
    {
         superclass sup1=new superclass(); 
         sup1.fun()//statement 1
         superclass sup2=new subclass();
         sup2.fun() //statement 2
         subclass sub1=new subclass(); 
         sub1.fun()//statement 3
     }
}

Я следую следующим образом, чтобы определить, является ли это полиморфизмом времени компиляции или полиморфизмом времени выполнения для операторов 1,2 и 3:

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

  • происходит следующим образом: 1) оператор 1 вызовет полиморфизм во время выполнения.

    2) оператор 2 также вызовет полиморфизм во время выполнения.

    3) утверждение 3 вызовет полиморфизм времени компиляции.

Вопрос 1: Я хочу знать, является ли этот подход правильным или неправильным?

Вопрос 2: И что будет с процедурой, когда вместо ссылочной переменной используется оператор вызова функции, который возвращает адрес объекта? Я думаю, что возвращаемый тип функции, которая возвращает адрес, будет использоваться при определении типа полиморфизма. Я прав?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я думаю, что все операторы являются полиморфизмом во время выполнения в Java, и каждый нестатический метод связывается во время выполнения. объект берет ссылку во время выполнения, чтобы не существовало никакого объекта во время компиляции, поэтому всегда, когда вы вызываете любой метод с помощью объекта, который будет связываться во время выполнения. здесь в вашем коде функция вызывается объектом это все операторы являются полиморфизмом времени выполнения и еще одна вещь - переопределение функции всегда будет полиморфизмом во время выполнения, потому что ссылка будет давать объекту во время выполнения но перегрузка функций может происходить как во время выполнения, так и во время компиляции, когда вы перекрываете нестатическую функцию, которая будет связываться во время выполнения, или когда вы перекрываете статический член, только эта функция будет связываться во время компиляции

0 голосов
/ 05 ноября 2018

В Java у вас всегда есть полиморфизм времени исполнения для любого переопределяемого метода! Компилятор не может знать все возможные производные класса, поэтому он не может следовать вашему алгоритму выше.

AFAIK, логика выглядит так:

  1. Во время компиляции компилятор определяет правильную сигнатуру, используя тип переменной.
  2. Во время выполнения jvm определяет правильный метод, используя тип фактического объекта и сигнатуру, определенную во время компиляции.
...