Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top