Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Po­ly­mor­phie

Über­schrei­ben

Was pas­siert, wenn es na­mens­glei­che Me­tho­den in der Basis- wie in der ab­ge­lei­te­ten Klas­se gibt? Zum bes­se­ren Ver­ständ­nis soll eine Ana­lo­gie hel­fen:

Ent­wick­ler haben bei der Klas­se Crt­Bild­schir­m100Hz ein neues und bes­se­res Ver­fah­ren ent­wi­ckelt, wie man die Hel­lig­keit des Bil­des ver­än­dern kann. Nun hat die Klas­se ja schon eine Me­tho­de setHel­lig­keit ge­erbt. Prin­zi­pi­ell gibt es nun zwei Mög­lich­kei­ten für die Ent­wick­ler:

  • Man be­nennt die neue Me­tho­de um, - bauen also zwei Knöp­fe an den Ap­pa­rat, mit denen man die Hel­lig­keit be­ein­flus­sen kann.

  • Man spen­diert eben­falls einen zwei­ten Knopf glei­chen Na­mens, ver­steckt aber den zwei­ten Knopf (die alte Me­tho­de) im Ge­häu­se. Der neue Knopf führt eine ver­än­der­te (über­schrie­be­ne) Me­tho­de der alten Me­tho­de aus.

Das erste Ver­fah­ren ist nicht be­son­ders sinn­voll. Bleibt das Über­schrei­ben:

Wenn eine Me­tho­de über­schrie­ben wurde, so sagt man auch, die Me­tho­de ist über­la­gert. Der Com­pi­ler ist in der Lage, zu er­ken­nen, wel­che der über­la­ger­ten Me­tho­den bei einem Auf­ruf zu ver­wen­den ist, denn selbst beim Über­schrei­ben bleibt die „alte“ Me­tho­de aus der Ba­sis­klas­se vor­han­den und wird somit au­to­ma­tisch dann ver­wen­det, wenn das auf­ru­fen­de Ob­jekt aus der Ba­sis­klas­se kommt.

Java ist eine po­ly­mor­phe Pro­gram­mier­spra­che. Das be­deu­tet, dass ver­schie­de­ne Ob­jek­te bei Auf­ruf der­sel­ben Me­tho­de even­tu­ell un­ter­schied­li­ches durch­füh­ren. Ein Bei­spiel aus un­se­rer Bild­schirm-Klas­se soll dies ver­deut­li­chen:

In der Bild­schirm-Klas­se:


  public void setHelligkeit(int helligkeit) {
   this.helligkeit = helligkeit;
  }

In der ab­ge­lei­te­ten Klas­se Crt-Bild­schirm:


  public void setHelligkeit(int helligkeit) {
   super.setHelligkeit(helligkeit) ;
   this.kontrast = this.kontrast - 1;
  }

In der ab­ge­lei­te­ten Klas­se Am­bi­light-Bild­schirm:


  public void setHelligkeit(int helligkeit) {
   super.setHelligkeit(helligkeit) ;
   this.umgebungslicht = this.helligkeit / 4 + this.kontrast /2;
  }

Durch die Ver­wen­dung von super(...) wird klar, dass die ab­ge­lei­te­ten Klas­sen zwar die na­mens­glei­che Me­tho­de aus der Ober­klas­se ver­wen­den, die Zu­satz­zei­len zei­gen aber auch, dass die Me­tho­den nun alle ver­schie­den sind. Die Me­tho­de wurde über­schrie­ben.

Hier nun ein Auf­ruf aus der Fern­seh-Klas­se:


  public void helligkeitErhoehen() {
   bildschirm.setHelligkeit(bildschirm.getHelligkeit()+1);
  }

Und genau hier sehen wir die Po­ly­mor­phie: Das Ob­jekt bild­schirm ge­hört zu einer be­stimm­ten Klas­se. Der Auf­ruf bild­schirm.setHel­lig­keit ruft die zum Ob­jekt pas­sen­de Me­tho­de auf.

Über­la­den

Über­la­den heißt eine Me­tho­de hin­ge­gen, wenn es eine na­mens­glei­che Me­tho­de in der Klas­se gibt, die aber an­de­re Pa­ra­me­ter ent­ge­gen­nimmt. So könn­te man zum Bei­spiel die Me­tho­de int ad­die­ren( int a, int b) durch 3D­Vek­tor ad­die­ren(3D­Vek­tor a, 3D­Vek­tor b) über­la­den wer­den. Da es sich bei die­sem Vor­gang ja eben­falls um eine Art der Po­ly­mor­phie han­delt, wird sie, im Ge­gen­satz zum obi­gen Sach­ver­halt, pa­ra­me­tri­sche Po­ly­mor­phie ge­nannt.

Sons­ti­ge Re­fe­renz-Typen

Ob­jek­te – ei­ge­ne oder vor­ge­fer­tig­te, wie String- oder Array-Ob­jek­te sind da­ten­tech­nisch so­ge­nann­te Re­fe­renz-Typen. Das be­deu­tet, dass ein neues Ob­jekt be­züg­lich sei­ner Adres­se (Re­fe­renz) im Heap ge­spei­chert wird. Das hat weit­rei­chen­de Kon­se­quen­zen im Um­gang mit Ob­jek­ten. Ge­naue­res dazu kann man im Do­ku­ment Le­bens­zy­klus von Ob­jek­ten nach­le­sen. Hier soll nur der Un­ter­schied der String- und Array-Ob­jek­te zu den oben be­han­del­ten all­ge­mei­nen Ob­jek­ten her­aus­ge­stellt wer­den.

  • Bei Strings und bei Ar­rays kennt der Com­pi­ler Kon­stan­ten, die den Auf­ruf new bei der Er­zeu­gung über­flüs­sig ma­chen:
    String satz = “Alles klar!“
    er­zeugt bei­spiels­wei­se den neuen String satz. Ent­spre­chend:
    int[] vek­tor = {9,8,7,6}
  • Ar­rays sind Ob­jek­te „ohne Klas­se“. Sie wer­den vom Com­pi­ler er­zeugt, haben aber keine ex­pli­zi­te Klas­sen­de­fi­ni­ti­on. Trotz­dem gibt es At­tri­bu­te, wie length etc.

 

 

Ein­füh­rung: Her­un­ter­la­den [odt][330 KB]

 

Wei­ter zu Le­bens­zy­klus von Ob­jek­ten