Überdeckung

Marinek

Bekanntes Mitglied
Überdeckung bedeutet, dass eine Variable eine andere unsichtbar macht.

Das passiert dann, wenn eine lokale variable innerhalb einer Methode eine Eigenschaft der Klasse verdeckt.

Das passiert bei deinem Konstruktor.

Du möchtest den Wert des übergebenen Arguments in der gleichnamigen Eigenschaft speichern.

Tatsächlich wird hier nur auf dem Argument des Konstruktors zugewiesen. Mit der Folge dass die Eigenschaften x und y 0 bleiben.

Korrekt wäre hier this.x =x; zu schreiben, um eine korrekte Zuweisung zu bekommen.

Mithin wäre x hier an der Stelle einmal verdeckt.
 

M.L.

Top Contributor
Das sog. "Shadowing" braucht man beim Nachstellen (und Ausprobieren) streng genommen nur an einer Stelle (da x definiert aber nicht genutzt wird) zu beachten:
Java:
...
public Addierer(int x, int y) 
    {
        //this.x = x;
        x = x;  //nur Warnmeldung
        this.y = y;  //sonst 6 und 8 als Output
        //y = y;
    }
...
public static void main(String[] args) {
      Addierer ad = new Addierer(2,14);
      System.out.println(ad.addiereMehrfach(6));
      System.out.println(ad.addiereMehrfach(8));
}
...
 

Annalena123

Aktives Mitglied
Überdeckung bedeutet, dass eine Variable eine andere unsichtbar macht.

Das passiert dann, wenn eine lokale variable innerhalb einer Methode eine Eigenschaft der Klasse verdeckt.

Das passiert bei deinem Konstruktor.

Du möchtest den Wert des übergebenen Arguments in der gleichnamigen Eigenschaft speichern.

Tatsächlich wird hier nur auf dem Argument des Konstruktors zugewiesen. Mit der Folge dass die Eigenschaften x und y 0 bleiben.

Korrekt wäre hier this.x =x; zu schreiben, um eine korrekte Zuweisung zu bekommen.

Mithin wäre x hier an der Stelle einmal verdeckt
meinst Du weil lokale variable und feldvariable den gleichen Namen haben , wird Überdeckung bestehen ?
 

Blender3D

Top Contributor
meinst Du weil lokale variable und feldvariable den gleichen Namen haben , wird Überdeckung bestehen ?
Java:
..
    private int x;
    private int x;
    public Addierer(int x, int y){
        x = x; // keine Zuweisung an die Klassenvariabel durch Überdeckung
        y = y; // keine Zuweisung an die Klassenvariabel durch Überdeckung
        this.x = x; // hier wird der Wert korrekt an die Klassenvariable zugewiesen
    }
 

KonradN

Super-Moderator
Mitarbeiter
@mihe7 da Bin ich schon ganz bei Dir, aber auch bei Dir kann ich direkt schreiben:

"shadowing"? Was soll das in Java sein?

Ich kenne nur das "hiding" aus der JLS z.B. hier: https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.4.8 :)

Sorry, konnte ich mir gerade nicht verkneifen. Das mit den Begriffen ist immer schwer. Wobei es mich bei "aber "Überdeckung" (engl. coverage) kenne ich eigentlich nur im Zusammenhang mit Überdeckungsmaßen aus Tests" auch etwas geschüttelt hat.

Es gibt ja viele, die meinen, dass Denglisch schlimm ist aber bei Fachbegriffen macht es doch Sinn, dass man da die Englischen Begriffe verwendet. Coverage bei Unit Tests. Oder Hiding eben bei den Variablen.

Denn es ist ja nicht nur das Problem der Übersetzung, die nicht immer eindeutig ist. Was nehme ich z.B. für "Hiding"? Dict schlägt direkt vor:
a) Als Nomen gibt es das nicht! Da gibt es nur " hiding-place" und so. Also ein Kunstbegriff wie Handy? komisch....
b) to hide wäre : verstecken, verbergen, verschweigen, verdecken, bei Seite schaffen, verheimlichen, ....

Und nehmen wir das verdecken - was wäre das im Englischen? to mask, to shroud sth, to hide sth, to occlude sth, ... Aber kein "to hide" ....

Also ist das mit der Übersetzung so ein Problem....

Und wo ist das Problem? Wie viele Fremdwörter haben wir? Und das auch, wo es doch deutsche Begriffe gibt! ("Wie schreibt man Portemonnaie?" "Ganz einfach: Geldbörse" - Wobei hier die Rechtschreibreform zugeschlagen hat, oder? Ist Portmonee nicht auch zulässig? Ja, man darf die Leute nicht überfordern mit komplexer Grammatik und schwer zu schreibenden Wörtern ... Das weiss ich nicht, wo das hinführen soll. @mihe7 - ja da meckert der Richtige ... von Dir kommt bestimmt ein: "Aber für Dich ist es immer noch nicht einfach genug" oder so :) )

Aber wenn man meint: Ok, das Problemist nicht ganz so wild. Die ganze Problematik geht doch noch weiter. Denn wir verwenden ständig irgendwelche Fachbegriffe und das in allen möglichen Umfeldern ... und für jedes Umfeld überlegen wir uns was Neues.

Informatiker haben sich schon viele Gedanken gemacht ... Bei Parametern gibt es dann Formalparameter und Aktualparameter. Also in der Methode wird formal definiert was für Parameter wir da brauchen und dann beim Aufruf wird da etas als Parameter übergeben. Das kann man ja unterscheiden ... kann man, aber muss man nicht ...

Und worüber schreibe ich überhaupt? Methode? Was soll eine Methode sein? Eine Methode wie ich euch nerven kann? Das heisst doch bitte Funktion! (Das kommt von der C / C++ Fraktion). Dann kommt die Pascal / Modula-2 Fraktion und erklärt, dass die Methode keine Rückgabe hat und die Funktion etwas zurück gibt....

Also uns stehen Tür und Tor offen, um aneinander vorbei zu reden. Wenn man das vermeiden will, dann kann man das umgehen: Man kann Definitionen verwenden. Ich kann vorher definieren, was ich mit welchem Wort meine. "Wenn ich Konstante sage, dann meine ich ....". Oder ich verweise auf eine Definition eines Anderen. Das ist einfach: Wir beschäftigen uns hier mit Java, also kann man Begriffe nutzen, die die JLS definiert hat für uns. Da findet sich, was eine "constant expression" ist. Oder was das "Hiding" bedeutet.

Das einfach einmal als kleine Ausführung, die mir gerade so durch den Kopf gegangen ist bei der Thematik. Auch wenn es etwas länger ist: Es ist keine wirkliche Ausarbeitung sondern nur ein niederschreiben von Gedanken.
 

mihe7

Top Contributor
https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.4.1 :p

Wobei es mich bei "aber "Überdeckung" (engl. coverage) kenne ich eigentlich nur im Zusammenhang mit Überdeckungsmaßen aus Tests" auch etwas geschüttelt hat.
Z. B. vollständige Anweisungs-/Pfadüberdeckung?

Also ist das mit der Übersetzung so ein Problem....
Klar und letztlich setzt sich halt irgendwas durch - selbst, wenn die Übersetzung Käse ist (das "Handy" zum Beispiel).
 

osion

Bekanntes Mitglied
Java:
..
    private int x;
    private int x;
    public Addierer(int x, int y){
        x = x; // keine Zuweisung an die Klassenvariabel durch Überdeckung
        y = y; // keine Zuweisung an die Klassenvariabel durch Überdeckung
        this.x = x; // hier wird der Wert korrekt an die Klassenvariable zugewiesen
    }
Soweit ich verstehe, ist damit gemeint, dass das this.x überdeckt wird von x, weil eine lokale Variable die Klassenvariable überdeckt, d. .h. bei x genommen wird, wenn kein this gesetzt wird.

Der Begriff habe ich so auch nicht gekannt.
 

Neue Themen


Oben