Перегрузка Java VS переопределения -- java поле с участием overloading поле с участием overwrite пол Связанный проблема

Java overloading vs overriding


17
vote

проблема

русский

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

 <код> 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()   

Это вернет цену на класс автомобиля, 20 000

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

 <код> truck.getPrice()   

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

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

Английский оригинал

Hi I just want to make sure I have these concepts right. Overloading in java means that you can have a constructor or a method with different number of arguments or different data types. i.e

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

How about this method? Would it still be considered overloading since it's returning a different data type?

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

Second question is: what is overriding in java? Does it relate to inheritance. Let's I have the following:

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

So now let's say I have the following

Truck truck = new Truck(); 

if I call

truck.super.getPrice() 

this would return the price from the Vehicle class, 20,000

if I call

truck.getPrice() 

this would return the price in the truck class, 14,000

Is my knowledge correct for both questions?

</div
        
   
   

Список ответов

33
 
vote
vote
Лучший ответ
 

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

 <код> 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 {}   

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

 

You are basically correct. Overloading is having multiple methods in a single class where the method has the same name. However, the return value is not seen as part of the signature of the method. Thus, you cannot overload a method by changing only the return value. You cannot have the following code, from your example:

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

This will fail to compile.

As Rob identified, I believe you mean overriding, and you have that correct. Note with overriding, you cannot change the return type. As of Java 5, you can return a derived type of what the base class method returned. Before Java 5, it must be the identical type. That is, you cannot do the below until Java 5 and later:

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 ();     } } 

However, even in Java 5 and later, you cannot do the following:

public class Animal {     public String makeNoise() {         return "silence";     } }  public class Cat extends Animal {     public Miaw makeNoise() {         return new Miaw ();     } } public class Miaw {} 

Finally, a big difference between overloading and overriding that is often overlooked is that overloading is decided at compile time and overriding is decided at runtime. This catches many people by surprise when they expect overloading to be decided at runtime.

</div
 
 
7
 
vote

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

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

 <код> 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)     } }   
 

Correct; overloading is providing multiple signatures for the same method.

Overriding, which is what I think you mean by "overwriting" is the act of providing a different implementation of a method inherited from a base type, and is basically the point of polymorphism by inheritance, i.e.

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)     } } 
</div
 
 
0
 
vote

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

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

http://en.wikipedia.org/wiki/polymorphism#computing

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

 

what you have described is correct.

For more clarification take a look at polymorphism concept. The Wikipedia has a good article

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

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

</div
 
 

Связанный проблема

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows?  ( How to invoke my restful api method integrated with redis on windows ) 
Я пытаюсь запустить образец весеннего загрузочного приложения с Redis. Я использую завод соединения JEDIS и установив его на заводе подключения шаблона Redis....

0  Прямоугольник и круг Collision Java, используя .Наиград  ( Rectangle and circle collision java using intersection ) 
Я делаю игру на прорыв для школьного проекта. Единственная проблема, которую я бегу в, это мяч, подпрыгивая, когда мяч и кирпичи сталкиваются. Я использовал B...

2  Изменить формат дата в DTO JSON на возвращении через @Responsebode  ( Change date format in dto json on returning through responsebody ) 
Я просто хочу изменить формат даты в моем DTO, возвращенный @Responseboodbody Мой вопрос не Этот вопрос как мой выход Список JSON и я печатаю его по почте...

16  Обычная задача Android (эквивалент Cronjob)  ( Android regular task cronjob equivalent ) 
Последний раз, когда этот вопрос был задан (другим пользователем), ответ ответа был: Если это работает в беговой активности, вы можете использовать таймер ...

1  Установка поля _ID с использованием SQLite & ContentProvider в Android  ( Setting the id field using sqlite contentprovider in android ) 
Я пытаюсь настроить ContentProvider в приложении Android, чтобы держать информацию о домах. Я хотел бы иметь возможность установить поле _id, чтобы быть таким...

5  Конвенции о ведении регистрации [Закрыто]  ( Logging conventions ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

-1  Как добавить JTable для JPanel  ( How to add a jtable to a jpanel ) 
Мой вопрос может показаться немного глупо, но каждый раз, когда я использую качели, у меня проблемы с таблицами. Таким образом, я работаю над школьным проекто...

3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5?  ( How do i change the response for a http options request in a spring mvc 2 5 appl ) 
Это звучит как тривиальный вопрос, но каким-то образом я не могу понять это. У меня есть приложение Spring MVC. Я не поддерживаю никаких HTTP-методов, кроме...

16  Enum внутри jsp [дубликат]  ( Enum inside a jsp ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java  ( Need to simplify logical expression byte short integer java ) 
Мне нужно упростить выражение Первое выражение <код> (byte)( (short)((short)( (byte)((theInt >> 8) & 0xFF) & 0xFF) + 128) & 0xFF); второе выражение ...

1  Apache Vamel: Как проверить, например, набор набора <customObject>  ( Apache camel how to test for instance of setcustomobject ) 
Кто-нибудь знает, как тестировать для различных типов коллекции в маршруте? <код> // This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> //...

40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки?  ( Can you tell on runtime if youre running java from within a jar ) 
У меня есть приложение, которое некоторые из моих пользователей работают от Eclipse, и другие запускают его, используя файл JAR. Я хочу, чтобы некоторые дей...

1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST  ( Rest convert xml content passed with post to a java object attribute inside th ) 
<Р> Я работаю с REST сервисов и я хочу передать XML-текст запроса POST. Мой сервер реализован в JAVA. Давайте предположим, что я посылаю этот XML: <код> <ran...

0  Случайные 7-значные номера на andich android  ( Random 7 digit numbers on click android ) 
Я хотел бы, чтобы вы помогли мне в этом коде. Я могу генерировать случайные числа, но не в точном количестве. Вопрос: Как я могу генерировать 7 случайных ци...

0  карта JSON на провал строки в Java  ( Json map to string failure in java ) 
В Java я пытаюсь преобразовать карту в JSon строку. используя код ниже <код> private void sendResponse(Map<String, String> responseMap) throws IOException {...

Связанный проблема

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows? 
0  Прямоугольник и круг Collision Java, используя .Наиград 
2  Изменить формат дата в DTO JSON на возвращении через @Responsebode 
16  Обычная задача Android (эквивалент Cronjob) 
1  Установка поля _ID с использованием SQLite & ContentProvider в Android 
5  Конвенции о ведении регистрации [Закрыто] 
-1  Как добавить JTable для JPanel 
3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5? 
16  Enum внутри jsp [дубликат] 
-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java 
1  Apache Vamel: Как проверить, например, набор набора <customObject> 
40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки? 
1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST 
0  Случайные 7-значные номера на andich android 
0  карта JSON на провал строки в Java