Статическое связывание Java и динамическое связывание
Недавно я изучил знания Java и изучил статическое и динамическое связывание Java. Затем я суммировал и разобрал соответствующие знания на Baidu, чтобы помочь овладеть этой частью знаний.
Концепция связывания программы:
Привязка относится к ассоциации метода вызова с классом (тело метода), где находится метод. Для Java связывание делится на статическое связывание и динамическое связывание; Или это называется ранним связыванием и поздним связыванием.
Статическое связывание:
Метод связан до выполнения программы (то есть вы уже знаете, какой класс метод находится в процессе компиляции), и он реализован компилятором или другими программами соединения. Например: C.
Это можно понимать просто как обязательное во время периода компиляции программы для Java; Здесь особенно ясно, что единственными методами в Java являются окончательные, статические, частные и конструкторы, которые предварительно связывают
Динамическое связывание:
Позднее привязка: связывается в соответствии с типом конкретного объекта во время выполнения.
Если язык реализует позднее обязательство, он также должен предоставить некоторые механизмы, чтобы определить тип объекта во время работы и вызывать соответствующие методы отдельно. Другими словами, компилятор по -прежнему не знает типа объекта в настоящее время, но механизм вызова, вызывающий метод может исследовать его само по себе и найти правильный корпус метода. У разных языков есть разные способы внедрения позднего привязки. Но мы можем, по крайней мере, думать так: все они должны установить определенные специальные типы информации в объект.
Динамический процесс привязки:
Окончательный, статический, частный и конструкторы - это понимание раннего обязательства
Для частного метода, прежде всего, его нельзя унаследовать. Поскольку его нельзя унаследовать, нет никакого способа назвать его через объект своего подкласса, но может быть вызван только через объект самого этого класса. Следовательно, можно сказать, что частный метод связан с классом, который определяет этот метод.
Хотя окончательный метод может быть унаследован, он не может быть перезаписан (переопределен). Несмотря на то, что объект детского класса может быть вызван, определяется окончательный метод, определенный в родительском классе (из этого мы можем знать, что метод объявляется как конечный тип, один из них состоит в том, чтобы предотвратить перезапись метода, а другой - эффективно закрыть динамическое связывание в Java).
Конструкторы не могут быть унаследованы (также говорят, что подклассы безоговорочно наследуют конструктор без параметрического класса в качестве их конструктора, но я лично считаю, что это утверждение неуместно, потому что мы знаем, что подклассы называют конструктор без параметров родительского класса через Super (), чтобы завершить инициализацию. Унаследовать конструктор родительского класса). Поэтому вы также можете знать, к какому классу принадлежит этот конструктор при компиляции.
Я не могу хорошо объяснить конкретные принципы статического метода. Однако, основываясь на онлайн -информации и моем собственном эксперименте, мы можем сделать вывод, что статический метод может быть унаследован подклассами, но не может быть переписан (переопределенный) подклассами, но может быть скрыт подклассами. (Это означает, что если в подклассе есть статический метод, и если в его подклассе нет соответствующего метода, то метод в родительском классе будет использоваться, когда объект класса дочернего класса вызовет этот метод. И если один и тот же метод определяется в детском классе, метод, определяемый в классе дочернего класса. Родительский класс независимо от того, есть ли у детей этот статический метод.
Из вышесказанного мы можем сделать вывод, что если метод не может быть унаследован или не может быть перезаписан после наследования, этот метод принимает статическое связывание.
Компиляция и работа Java
Процесс компиляции Java - это процесс компиляции исходного файла Java в ByteCode (исполнительный код JVM, то есть файл. Класс). В этом процессе Java не занимается памятью. В этом процессе компилятор выполнит синтаксис -анализ. Если синтаксис неверен, сообщается об ошибке.
Процесс запуски Java относится к JVM (Virtual Machine Java) загрузку файлов Bytecode и интерпретации выполнения. В этом процессе это реальное создание макета памяти и выполнения программ Java.
Существует два способа выполнения Java Bytecode: (1) Метод мгновенного компиляции: интерпретатор сначала компилирует байты в код машины, а затем выполняет код машины; (2) Метод выполнения объяснения: интерпретатор завершает все операции программы Java Bytecode, интерпретируя и выполняя небольшой кусок кода каждый раз. (Здесь мы видим, что программа Java фактически подвергается двум преобразованию во время процесса выполнения, сначала преобразована в байт -код, а затем преобразован в машинный код. Это также причина, по которой Java может быть скомпилирована и запускается повсюду в одном
Как упоминалось ранее, для методов в Java, за исключением конечных, статических, частных и конструкторов, которые являются ранними привязками, все другие методы являются динамическими привязками.
Типичное динамическое связывание происходит при объявлении конверсии родительского класса и класса ребенка:
Например: родитель p = new Children ();
Конкретные детали процесса следующие:
1: Компилятор проверяет тип объявления и имя метода объекта.
Предположим, что мы называем метод XF (ARGS), и X был объявлен как объект класса C, затем компилятор перечислит все методы, названные F в методах класса C и F, унаследованных от суперкласса класса C.
2: Далее компилятор проверяет тип параметра, указанный в вызове метода.
Если один тип параметра среди всех методов с именем F соответствует типу параметра, предоставляемого Call наибольшим, то этот метод вызывается. Этот процесс называется «разрешение перегрузки».
3: Когда программа запускается и использует динамическую привязку для методов вызова, виртуальная машина должна вызвать версию метода, которая соответствует фактическому типу объекта, на который указан x.
Предположим, что фактический тип - d (подкласс C), если класс D определяет F (String), то метод вызывается, в противном случае метод F (строка) будет искать в Superclass D и так далее.
Когда виртуальная машина Java вызывает метод класса (статический метод), она выбирает вызываемый метод на основе типа ссылки на объект (обычно известный во время компиляции). Напротив, когда виртуальная машина вызывает метод экземпляра, она выберет вызываемый метод на основе фактического типа объекта (известный только во время выполнения). Это динамическое связывание, которое является типом полиморфизма. Динамическое привязка обеспечивает большую гибкость для решения реальных бизнес -проблем и является очень красивым механизмом.
В отличие от методов, при работе с переменными члена (переменные экземпляра и классовые переменные) в классах Java, это не связывание времени выполнения, а статическое связывание в общем смысле. Таким образом, в случае преобразования вверх, метод объекта может найти подкласс, в то время как атрибут объекта (переменная -член) по -прежнему остается атрибутом родительского класса (скрытие подкласса от переменной члена родительского класса).
открытый класс отец {защищенный string name = "attribute attribute"; } public Class Son расширяет отец {защищенная строка name = "son attribute"; public static void main (string [] args) {shather sample = new son (); System.out.println ("называется свойство:" + sample.name); }} Вывод: звонящий - атрибут отца.
Этот результат показывает, что объект детского класса (справочный дескриптор родительского класса) вызывается к переменной члена родительского класса. Следовательно, должно быть ясно, что категория, направленная на привязку времени выполнения (динамическое), является только методом объекта.
Теперь пытаетесь вызвать имя переменной члена подкласса, как это сделать? Самый простой способ - инкапсулировать переменную элемента в форму получения метода.
Код заключается в следующем:
открытый класс отец {защищенный string name = "attribute attribute"; public String getName () {return name; }} public Class Son расширяет отец {защищенная строка name = "son attribute"; public String getName () {return name; } public static void main (string [] args) {sather sample = new son (); System.out.println ("называется свойство:" + sample.getName ()); }} Результат: атрибут сына называется
Почему Java принимает статические методы связывания для атрибутов? Это связано с тем, что статическое связывание имеет много преимуществ, что позволяет нам обнаруживать ошибки в программе в течение периода компиляции, а не в течение периода выполнения. Это повысит эффективность работы программы! Динамическое связывание методов заключается в реализации полиморфизма, который является основной особенностью Java. Полиморфизм также является одной из ключевых объектов, ориентированных на объекты технологий, поэтому Java стоит внедрить полиморфизм за счет эффективности.
Примечание. Большая часть вышеперечисленного контента поступает из Интернета, и небольшая часть является личным мнением и ни в коем случае не авторитетными замечаниями. Если есть какой -либо неуместный язык или неправильное выражение, я надеюсь дать вам совет.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!