#java
Модификатор final в Java не обеспечивает раннее связывание метода (на этапе компиляции), лишь не дает определить метод в наследнике с такой же сигнатурой и в том числе переопределить соответствующий метод предка, так ли это? Вопрос: Есть ли в Java ранее связывание, то есть когда уже на этапе компиляции вызову метода ставится в соответствие код который будет выполняться?
Ответы
Ответ 1
Цитата из источника: Полиморфизм в Java: Если перегруженные методы с одинаковыми именами находятся в одном классе, списки параметров должны отличаться. Но если метод подкласса совпадает с методом суперкласса (порождающего класса), то метод подкласса переопределяет метод суперкласса. Совпадать при этом должны и имена методов и типы входных и выходных параметров. В данном случае переопределение методов является основой концепции динамического связывания (или позднее связывание), реализующей полиморфизм. Суть динамической диспетчеризации методов состоит в том, что решение на вызов переопределенного метода принимается во время выполнения, а не во время компиляции. Однако final-методы не являются переопределяемыми, их вызов может быть организован во время компиляции и называется ранним связыванием.Ответ 2
final по самому простому привязывает переменную к значению, тем самым делая ее константой, т. е. final int a = 0; // a всегда будет 0Ответ 3
А как же overloading? public class LinkageTest { public static class Parent { public void test() { System.out.println("parent::test"); } } public static class Child extends Parent { public void test() { System.out.println("child::test"); } } public static class Tester { public void test(Parent obj) { System.out.println("Testing parent..."); obj.test(); } public void test(Child obj) { System.out.println("Testing child..."); obj.test(); } } public static void main(String[] args) { Parent obj = new Child(); Tester t = new Tester(); t.test(obj); } } Вывод: Testing parent... child::test
Комментариев нет:
Отправить комментарий