Перегрузка Java против переопределения - PullRequest
16 голосов
/ 08 мая 2009

Привет, я просто хочу убедиться, что я правильно понял эти понятия. Перегрузка в Java означает, что у вас может быть конструктор или метод с разным количеством аргументов или разными типами данных. * 1001 то есть *

public void setValue(){
   this.value = 0;
}
public void setValue(int v){
   this.value = v;
}

Как насчет этого метода? Будет ли это рассматриваться как перегрузка, так как он возвращает другой тип данных?

public int setValue(){
   return this.value;
}

Второй вопрос: что является приоритетным? в Яве? Это относится к наследованию. Давайте у меня будет следующее:

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

Верны ли мои знания по обоим вопросам?

Ответы [ 3 ]

32 голосов
/ 08 мая 2009

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

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

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

6 голосов
/ 08 мая 2009

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

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

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)
    }
}
0 голосов
/ 08 мая 2009

что вы описали правильно.

Для большей ясности взгляните на концепцию полиморфизма. В Википедии есть хорошая статья

http://en.wikipedia.org/wiki/Polymorphism#Computing

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...