2009-05-08 3 views
15

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

это вернет цену от класса автомобиля, 20000

если я позвоню

truck.getPrice() 

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

ли мое знание правильно для обоих вопросов?

+0

Я бы не использовать SetValue(), поскольку она является неоднозначной, как к тому, что он устанавливает значение для. clearValue() будет более понятным и, следовательно, не будет необходимости перегрузки. –

+0

Вы имеете в виду переопределение, не переписывание. методы перезаписи объекта чаще всего обсуждаются в JavaScript. то есть. Object.toString = function() {return "эта функция была перезаписана";}; –

ответ

31

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

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

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

+1

+1 Глава Первая Ява Кэти Сьерра, Берт Бейтс – abi1964

4

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

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

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) 
    } 
} 
Смежные вопросы