В этой статье используются примеры для подробного анализа разницы между перегрузкой и переписыванием в Java. Заинтересованные друзья могут обратиться к ней.
1. Перегрузка:
(1) Перегрузка метода — это средство, позволяющее классу унифицированно обрабатывать различные типы данных. Одновременно существует несколько функций с одинаковым именем и разным количеством/типом параметров.
Перегрузка — это проявление полиморфизма в классе.
(2) Перегрузка методов Java означает, что в классе можно создать несколько методов. Они имеют одно и то же имя, но разные параметры и разные определения.
При вызове методов вы решаете, какой метод использовать, исходя из количества и типа передаваемых им параметров. Это полиморфизм.
(3) При перегрузке имена методов должны быть одинаковыми, но типы и номера параметров разные, а типы возвращаемых значений могут быть одинаковыми или разными. Тип возвращаемого значения не может использоваться в качестве критерия для различения перегруженных функций.
Вот пример перегрузки:
package c04.answer;//Это имя пакета//Это первый метод программирования этой программы. Сначала создайте экземпляр класса Dog в основном методе, а затем используйте ключевое слово this в конструкторе класса Dog для вызова. другой метод коры. Различные перегруженные методы bark различаются по типам параметров. //Примечание: компилятор запрещает вызывать конструктор где-либо еще, кроме конструктора. package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark() — это перегруженный метод {System.out.println(/"нет лая!/"); this.bark(/"female/", 3.4);}void bark(String m,double l)//Примечание: возвращаемые значения перегруженных методов одинаковы, {System.out.println(/"лающая собака!/");this.bark(5, /"Китай/");} void bark(int a,String n)//Перегруженные методы нельзя отличить по возвращаемому значению, их можно отличить только по "типу параметра" и "имени класса" {System.out.println(/"воющая собака/") } public static void main(String[] args){Dog Dog = new Dog();//dog.bark(); [Page]//dog.bark(/"male/", /"yellow/");//dog.bark(5, / "Китай/");
2. Переопределение
(1) Полиморфизм между родительским классом и подклассом, переопределяющий функции родительского класса. Если метод, определенный в подклассе, имеет то же имя и параметры, что и его родительский класс, мы говорим, что метод является переопределяющим. В подклассах могут наследовать методы родительского класса без необходимости переписывать те же методы.
Но иногда подкласс не желает наследовать методы родительского класса в неизменном виде, а желает внести определенные модификации, что требует переписывания методов.
Переопределение метода также называется перезаписью метода.
(2) Если метод в подклассе имеет то же имя метода, тип возвращаемого значения и список параметров, что и метод родительского класса, новый метод перезапишет исходный метод.
Если вам нужен исходный метод в родительском классе, вы можете использовать ключевое слово super, которое относится к родительскому классу текущего класса.
(3) Разрешения на изменение доступа функций подкласса не могут быть меньше, чем у родительского класса;
Вот пример перезаписи:
Концепция: Механизм вызова методов объекта.
Подробности о динамической привязке:
1. Компилятор проверяет тип и имя метода, объявленные объектом, чтобы получить все возможные методы. Попробуйте закомментировать тест класса Base в приведенном выше примере, и тогда компиляция не пройдет.
2. Решение о перегрузке. Компилятор проверяет тип параметра вызова метода и выбирает единственный из перечисленных выше методов-кандидатов (во время этого процесса будет происходить неявное преобразование типов).
Если компилятор обнаружит более одного или ни одного, он сообщит об ошибке. Попробуйте закомментировать тест (байт b) базового класса в приведенном выше примере, и результат будет 1 1.
3. Если тип метода — priavte static Final и Java использует статическую компиляцию, компилятор будет точно знать, какой метод вызывать.
4. Когда программа запускается и использует динамическую привязку для вызова метода, виртуальная машина должна вызвать версию метода, соответствующую фактическому типу объекта.
В этом примере фактический тип, на который указывает b, — это TestOverriding, поэтому b.test(0) вызывает тест подкласса.
Однако подкласс не переопределяет test(byte b), поэтому b.test((byte)0) вызывает test(byte b) родительского класса.
Если (байт b) родительского класса закомментирован, неявный тип преобразуется в int на втором этапе и наконец вызывается тест (int i) подкласса.
3. Краткое описание обучения:
Полиморфизм — это особенность объектно-ориентированного программирования, которая не имеет ничего общего с методами.
Проще говоря, один и тот же метод может выполнять разную обработку по разным входным данным, то есть перегрузку метода — с разными списками параметров (статический полиморфизм).
Когда подкласс наследует тот же метод от родительского класса и использует те же входные данные, но хочет реагировать иначе, чем родительский класс, вам необходимо переопределить метод родительского класса.
То есть переписать этот метод в подклассе — те же параметры, разные реализации (динамический полиморфизм)
Три основные характеристики ООП: наследование, полиморфизм и инкапсуляция.
общественный класс Base {void test (int i) {System.out.print (i);} void test (byte b) {System.out.print (b);}} public class TestOverriding расширяет Base {void test (int i) ){i++;System.out.println(i);}public static void main(String[]agrs){Base b=new TestOverriding();b.test(0)b.test((byte)0)}}
Результат вывода в это время — 1 0, что является результатом динамической привязки во время выполнения.
Основным преимуществом переопределения является возможность определять характеристики, специфичные для подкласса:
publicclassFather{publicvoidspeak(){System.out.println(Отец);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("сын");}}
Это также называется полиморфизмом. Переопределяющие методы могут существовать только в отношениях наследования. Переопределяющие методы могут переопределять только незакрытые методы родительского класса.
Если в приведенном выше примере методspoke() класса Father является закрытым, класс Son не может переопределить метод talk() класса Father. Класс сына.
Как только метод talk() класса Father станет окончательным, независимо от того, изменен ли метод общедоступным, защищенным или по умолчанию, класс Son вообще не сможет переопределить метод talk() класса Father.
При попытке скомпилировать код компилятор выдает ошибку. пример:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//Компилятор сообщит об ошибке;
Когда метод talk() класса Father изменяется по умолчанию, его можно переопределить только его подклассами в том же пакете. Если он не находится в том же пакете, его нельзя переопределить.
Когда прототип метода talk() класса Father, он не только переопределяется его подклассами в том же пакете, но также может быть переопределен подклассами разных пакетов.
Правила переопределения методов:
1. Список параметров должен быть точно таким же, как у переопределенного метода, иначе это нельзя назвать перезаписью, а перегрузкой.
2. Тип возвращаемого значения всегда должен быть таким же, как тип возвращаемого значения переопределенного метода, иначе его нельзя назвать перезаписью, а перегрузкой.
3. Предел модификатора доступа должен быть больше, чем модификатор доступа переопределенного метода (публичный>защищенный>по умолчанию>частный).
4. Переопределенный метод не должен генерировать новое проверенное исключение или проверенное исключение, которое шире, чем объявление переопределенного метода. Например:
Метод родительского класса объявляет проверенное исключение IOException. При переопределении этого метода вы не можете создавать исключения. Вы можете создавать только исключения подклассов IOException, а также непроверяемые исключения.
И перегруженные правила:
1. Должны иметь разные списки параметров;
2. Вы можете иметь тип возвращаемого значения без обвинений, если список параметров отличается;
3. Модификаторы доступа могут быть разные;
4. Могут быть выброшены различные исключения;
Разница между перезаписью и перегрузкой заключается в следующем:
Переопределение полиморфизма работает. Оно может значительно сократить объем ввода кода при вызове перегруженных методов. Одно и то же имя метода может иметь разные функции или возвращаемые значения, пока в него передаются разные параметры.
Правильно используя переписывание и перегрузку, вы можете создать класс с четкой и лаконичной структурой. Можно сказать, что переписывание и перегрузка играют исключительную роль в процессе написания кода.