Как узнать, полиморфизм ли это во время компиляции или во время исполнения?
Рассмотрим суперкласс:
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 ответа
В Java у вас всегда есть полиморфизм во время выполнения для любого переопределяемого метода! Компилятор не может знать все возможные производные класса, поэтому он не может следовать вашему алгоритму выше.
AFAIK, логика выглядит так:
- Во время компиляции компилятор определяет правильную сигнатуру, используя тип переменной.
- Во время выполнения jvm определяет правильный метод, используя тип фактического объекта и сигнатуру, определенную во время компиляции.
Я думаю, что все операторы являются полиморфизмом во время выполнения в Java каждый нестатический метод связывания во время выполнения. объект берет ссылку во время выполнения, чтобы не существовало никакого объекта во время компиляции, поэтому всегда, когда вы вызываете любой метод с помощью объекта, который будет связываться во время выполнения. здесь в вашем коде функция вызывается объектом, все эти операторы являются полиморфизмом времени выполнения, и еще одна вещь заключается в том, что переопределение функции всегда будет полиморфизмом во время выполнения, потому что ссылка будет давать объекту во время выполнения, но перегрузка функции может быть как во время выполнения, так и во время компиляции, когда вы перекрываете нестатическую функцию, которая будет связываться во время выполнения, или когда вы перекрываете статический член, только эта функция будет связываться во время компиляции