Перегрузка Java и перезапись

Привет, я просто хочу убедиться, что у меня есть эти понятия. Перегрузка в 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()

это вернет цену из класса Vehicle, 20 000

если я вызываю

truck.getPrice()

это вернет цену в классе грузовиков, 14 000

Я знаю, что мои знания верны для обоих вопросов?

Ответы

Ответ 1

Вы в основном правы. Перегрузка имеет несколько методов в одном классе, где метод имеет то же имя. Однако возвращаемое значение не рассматривается как часть сигнатуры метода. Таким образом, вы не можете перегрузить метод, изменив только возвращаемое значение. Вы не можете иметь следующий код из своего примера:

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 {}

Наконец, большая разница между перегрузкой и переопределением, которая часто упускается из вида, заключается в том, что перегрузка определяется во время компиляции, и переопределение определяется во время выполнения. Это застает многих врасплох, когда они ожидают, что перегрузка будет определена во время выполнения.

Ответ 2

Правильно; перегрузка предоставляет несколько подписей для одного и того же метода.

Переопределение, которое, как я думаю, вы подразумеваете под "переписыванием", является актом предоставления другой реализации метода, унаследованного от базового типа, и в основном является точкой полиморфизма по наследованию, то есть

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 useful to us here)
    }
}