Почему в Java есть перегрузка и переопределение метода?
Возможный дубликат:
Полиморфизм против перегрузки и перегрузки
Я пытаюсь понять, почему перегрузка и переопределение метода в java?
Я прочитал несколько статей по этому поводу, но не смог понять, зачем он нужен практически?
Я также посетил приведенный ниже URL-адрес в stackoverflow, но я пока неясно в этой теме.
Перегрузка и переопределение Java
Любой практический пример будет оценен.
Спасибо заранее.
Ответы
Ответ 1
От doc
Перегрузка метода: Предположим, что у вас есть класс, который может использовать каллиграфию для рисования различных типов данных (строк, целых чисел и т.д.) и который содержит метод для рисования каждого типа данных. Для каждого метода громоздко использовать новое имя, например drawString, drawInteger, drawFloat и т.д. На языке программирования Java вы можете использовать одно и то же имя для всех методов рисования, но передавать каждому другому списку аргументов. Таким образом, класс рисования данных может объявить четыре метода с именем draw, каждый из которых имеет другой список параметров.
public class DataArtist {
...
public void draw(String s) {
...
}
public void draw(int i) {
...
}
public void draw(double f) {
...
}
public void draw(int i, double f) {
...
}
}
Перегруженные методы различаются по количеству и типу аргументов, переданных в метод. В образце кода draw(String s)
и draw(int i)
являются различными и уникальными методами, поскольку они требуют разных типов аргументов.
Вы не можете объявить несколько методов с тем же именем и одинаковыми номерами и типами аргументов, потому что компилятор не может отличить их друг от друга.
Компилятор не рассматривает тип возвращаемого значения при дифференцировании методов, поэтому вы не можете объявлять два метода с одной и той же сигнатурой, даже если они имеют другой тип возврата.
Переопределение метода в объектно-ориентированном программировании - это языковая функция, которая позволяет подклассу или дочернему классу предоставлять конкретную реализацию метода, который уже предоставлен одним из его суперклассов или родительских классов. Реализация в подклассе переопределяет (заменяет) реализацию в суперклассе, предоставляя метод, который имеет одинаковое имя, те же параметры или подпись, и тот же тип возврата, что и метод в родительском классе. Версия метода, который выполняется, будет определяться объектом, который используется для его вызова. Если для вызова метода используется объект родительского класса, будет выполнена версия родительского класса, но если для вызова метода используется объект подкласса, то будет выполнена версия в дочернем классе.
Ответ 2
Перекрытие
Java Docs говорит:
Метод экземпляра в подклассе с той же сигнатурой (имя, плюс количество и тип его параметров) и тип возврата в качестве метод экземпляра в суперклассе переопределяет метод суперкласса.
Возможность подкласса переопределять метод позволяет классу наследуется от суперкласса, поведение которого "достаточно близко", а затем при необходимости измените поведение.
Переопределение - это функция, доступная при использовании Inheritance.
Он используется, когда класс, который выходит из другого класса, хочет использовать большую часть функции родительского класса и хочет реализовать определенные функции в определенных случаях.
В таких случаях мы можем создавать методы с тем же именем и сигнатурой, что и в родительском классе. Таким образом, новый метод маскирует родительский метод и будет вызван по умолчанию.
class Thought {
public void message() {
System.out.println("I feel like I am diagonally parked in a parallel universe.");
}
}
public class Advice extends Thought {
@Override // @Override annotation in Java 5 is optional but helpful.
public void message() {
System.out.println("Warning: Dates in calendar are closer than they appear.");
}
}
Перегрузка
Перегрузка в Java - это возможность создавать несколько методов с одним и тем же именем, но с разными параметрами.
Основное преимущество этого - чистота кода.
Возьмем метод String.valueOf
. Перегруженные версии этого метода определяются как:
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(Object obj)
Это означает, что если у нас есть какой-либо тип переменной, мы можем получить строковое представление с помощью String.valueOf(variable)
.
Если перегрузка не была разрешена, у нас были бы методы, которые выглядят так:
static String valueOfBoolean(boolean b)
static String valueOfChar(char c)
static String valueOfCharArray(char[] data)
static String valueOfCharArrayWithOffset(char[] data, int offset, int count)
static String valueOfDouble(double d)
static String valueOfFloat(float f)
static String valueOfInt(int i)
static String valueOfLong(long l)
static String valueOfObject(Object obj)
... который очень уродливый и труднее читать, чем перегруженное решение.
Ответ 3
Ответ главным образом сосредоточен вокруг использования interface
и abstract class
es.
Скажем, у вас есть блок кода:
abstract class testAbstract {
int a; int b; int c;
public String testFunction() {
System.out.println("Override me!");
return "default";
}
public void setValuesByFormula(double a, double b) {
System.out.println("No formula set!");
}
}
Это не пример ставки, но предположим, что это предназначено, чтобы позволить пользователю устанавливать a
, b
и c
из формулы. Пользователь хотел бы создать новый экземпляр этого:
class testClass extends testAbstract {
}
Класс testClass
в настоящее время содержит... ничего. Но оно продолжается testAbstract
и, следовательно, имеет функцию setValuesByFormula
. Однако, когда пользователь пытается вызвать это, система выводит сообщение: No formula set!
То, что пользователь должен сделать в этот момент, - это @Override
исходная функция. Таким образом, новый класс будет выглядеть следующим образом:
class testClass extends testInterface {
public void setValuesByFormula(double a, double b) {
//A not really relevant formula goes here.
}
}
Это останавливает сообщение No formula set!
, поскольку пользователь создал свою собственную формулу. Это необходимо по двум основным причинам:
- Если функция наследуется от суперкласса, часто ребенок хочет переопределить эту функцию. Тем не менее, суперкласс может иметь код по умолчанию для своего класса. Таким образом, пользователь должен переопределить эту функцию, если они хотят использовать свой собственный код.
- Часто суперклассы хотят, чтобы с помощью кода по умолчанию была возвращена некоторая функция без ошибок. Существуют и другие случаи, когда код по умолчанию полезен. Таким образом, это дает альтернативу: если пользователю не нужен код по умолчанию, он может переопределить его.