2015-10-17 2 views
2

Я учился у наших наставников и книг, что polymorphism означает наличие большого количества shapes, а в java - двумя способами.Неужели перегрузка не подпадает под полиморфизм?

  • overloading
  • overriding.

in oracle docs polymorphism в определении очень хорошо. но я не понимаю, почему они не определили перегрузку в рамках полиморфизма, который они обсудили, только переопределяя? Я предполагаю, что многие перегрузки форм должны также подпадать под полиморфизм.

Я уже рассмотрел все вопросы, но я не понимаю этих ответов, потому что каждый из них изложил свои взгляды без каких-либо ссылок, у всех разные взгляды, некоторые говорят, что другие говорят без всякого оправдания.

Java The Complete reference 8th ed

Я думаю, выделенный участок (ссылка из Java The Complete reference 8th ed) записывается пример overloading. Тогда как все говорят, что перегрузка не имеет ничего общего с ovrloading, но переопределяет?

that how polymorphism is not achieved by overloading? 
+1

Проверить http://stackoverflow.com/questions/12893907/is-polymorphism-overloading-and-overriding-are-same-concepts – sam

+0

Перегрузка не имеет ничего общего с полиморфизмом. – plalx

+0

comon @all, которые отметили его дубликат, я не удовлетворен ответами, поэтому я спросил его здесь. –

ответ

0

«Перегрузка» это термин, имеющие несколько вариантов способа в том же классе. Например:

public class Foo 
{ 
    public String doStuff() 
    { return this.doStuff("stuff") ; } 

    public String doStuff(String sStuff) 
    { return this.doStuff(sStuff, "things") ; } 

    public String doStuff(String sStuff, String sWith) 
    { return "Do " + sStuff + " with " + sWith + "." ; } 
} 

Foo класс предоставляет три варианта метода doStuff(): один без аргументов, один с одним аргументом, и один с двумя аргументами. Обычно для перегрузки это выглядит так, что большинство вариантов метода фактически просто вызывают метод с более высокой степенью сложности с некоторым значением по умолчанию.

Это позволяет иметь предсказуемое поведение с любым из нуля, одного или двух аргументов:

Foo foo = new Foo() ; 
System.out.println(foo.doStuff()) ;     // "Do stuff with things." 
System.out.println(foo.doStuff("stuff")) ;   // "Do stuff with things." 
System.out.println(foo.doStuff("more stuff")) ;  // "Do more stuff with things." 
System.out.println(foo.doStuff("stuff", "things")) ; // "Do stuff with things." 
System.out.println(foo.doStuff("things", "stuff")) ; // "Do things with stuff." 

В противоположность этому, «перекрывая» является принцип полиморфизма, в котором класс потомок изменяет поведение метод из суперкласса.

public class Bar extends Foo 
{ 
    @Override 
    public String doStuff(String sStuff) 
    { return this.doStuff(sStuff, "thingamabobs") ; } 
} 
+0

@OAD Кроме того, для сравнения, PHP, в отличие от Java, не допускает перегрузки, но он позволяет значения параметров по умолчанию, которые могут дать вам подобное поведение. – zerobandwidth

+0

Вы не должны писать свой код как '{/ * stuff * /}' в одной строке. Это труднее читать и не стоит нескольких строк, которые вы сохраняете с этим. – Tom

+0

@zerobandwidth см. Обновление вопроса –

0

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

Указанная вами ссылка представляет собой полиморфизм как аспект inheritance в Java. В то время как overloading подпадает под понятие полиморфизма, overriding гораздо более уместен в достижении полиморфизма посредством наследования в Java.

Смежные вопросы