Перегрузка Java против переопределения
-
10-07-2019 - |
Вопрос
Привет, я просто хочу убедиться, что я правильно понял эти концепции.Перегрузка в Java означает, что у вас может быть конструктор или метод с разным количеством аргументов или разными типами данных.то есть
public void setValue(){
this.value = 0;
}
public void setValue(int v){
this.value = v;
}
Как насчет этого метода?Будет ли это по-прежнему считаться перегрузкой, поскольку возвращает другой тип данных?
public int setValue(){
return this.value;
}
Второй вопрос:Что подходит в Java?Имеет ли это отношение к наследству?Пусть у меня будет следующее:
public class Vehicle{
double basePrice = 20000;
//constructor defined
public double getPrice(){
return basePrice;
}
}
public class Truck extends Vehicle{
double truckPrice = 14000;
//constructor defined
public double getPrice(){
return truckPrice;
}
}
Итак, теперь предположим, что у меня есть следующее
Truck truck = new Truck();
если я позвоню
truck.super.getPrice()
это вернет цену из класса транспортного средства, 20 000.
если я позвоню
truck.getPrice()
это вернет цену в классе грузовиков - 14 000.
Верны ли мои знания по обоим вопросам?
Решение
Вы в основном правы. Перегрузка имеет несколько методов в одном классе, где метод имеет одно и то же имя. Однако возвращаемое значение не рассматривается как часть подписи метода. Таким образом, вы не можете перегружать метод, изменяя только возвращаемое значение. Вы не можете иметь следующий код из вашего примера:
public void setValue() {
this.value = 0;
}
public int setValue() {
return this.value;
}
Это не удастся скомпилировать.
Как определил Роб, я считаю, что вы имеете в виду переопределение , и вы правильно поняли. Обратите внимание, что при переопределении вы не можете изменить тип возвращаемого значения. Начиная с Java 5, вы можете возвращать производный тип того, что возвращал метод базового класса. До Java 5 это должен быть идентичный тип. То есть, вы не можете сделать ниже до Java 5 и позже:
public class AnimalNoise {}
public class Miaw extends AnimalNoise {}
public class Animal {
public AnimalNoise makeNoise() {
return new AnimalNoise();
}
}
public class Cat extends Animal {
public Miaw makeNoise() {
return new Miaw ();
}
}
Однако даже в Java 5 и новее вы не можете сделать следующее:
public class Animal {
public String makeNoise() {
return "silence";
}
}
public class Cat extends Animal {
public Miaw makeNoise() {
return new Miaw ();
}
}
public class Miaw {}
Наконец, большая разница между перегрузкой и переопределением, которая часто игнорируется, заключается в том, что перегрузка решается во время компиляции, а переопределение решается во время выполнения. Это застает многих врасплох, когда они ожидают, что перегрузка будет решена во время выполнения.
Другие советы
Правильный;перегрузка — это предоставление нескольких сигнатур для одного и того же метода.
Переопределение, которое, я думаю, вы подразумеваете под «перезаписью», — это предоставление другой реализации метода, унаследованного от базового типа, и, по сути, это точка полиморфизма путем наследования, т.е.
public class Bicycle implements Vehicle {
public void drive() { ... }
}
public class Motorcycle extends Bicycle {
public void drive() {
// Do motorcycle-specific driving here, overriding Bicycle.drive()
// (we can still call the base method if it's useful to us here)
}
}
то, что вы описали, правильно.
Для большей ясности взгляните на концепцию полиморфизма. В Википедии есть хорошая статья
http://en.wikipedia.org/wiki/Polymorphism#Computing р>
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming р>