Вы в основном правы. Перегрузка имеет несколько методов в одном классе, где метод имеет одно и то же имя. Однако возвращаемое значение не рассматривается как часть подписи метода. Таким образом, вы не можете перегружать метод, изменяя только возвращаемое значение. Вы не можете иметь следующий код из вашего примера:
public void setValue() {
this.value = 0;
}
public int setValue() {
return this.value;
}
Это не удастся скомпилировать.
Как определил Роб, я полагаю, что вы имеете в виду overriding , и вы правильно поняли. Обратите внимание, что при переопределении вы не можете изменить тип возвращаемого значения. Начиная с 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 {}
Наконец, большая разница между перегрузкой и переопределением, которая часто упускается из виду, заключается в том, что перегрузка решается во время компиляции, а переопределение определяется во время выполнения. Это застает многих врасплох, когда они ожидают, что перегрузка будет решена во время выполнения.