Vererbung und private Attribute



  • Hallo!
    Ich hatte ein Problem das Vererbung betrifft und habe es auch gelöst, allerdings verstehe ich nicht warum es funktioniert. Vielleicht kann mir ja hier jemand helfen. Folgende Klassen:

    abstract class Vehicle{
        private double Speed;
    ...
    }
    

    und eine Subklasse davon:

    class Auto extends Vehicle{
       Auto(double speed){
            this.Speed = speed;
        }
    

    Soweit funktioniert das Beispiel nicht. Eine Compilerfehlermeldung wird ausgegeben, dass Speed in Vehicle private ist und überhaupt, private Attribute werden ja nicht vererbt.
    Dann habe ich folgendes ausprobiert:

    abstract class Vehicle{
        private double Speed;
        public void setSpeed(double speed){
             Speed = speed;
        }
        public double getSpeed(){
              return Speed;
        }
    ...
    }
    

    und

    class Auto extends Vehicle{
        Auto(double speed){
            setSpeed(speed);
        }
    ...
    }
    

    Jetzt auf einmal gehts. Aber warum wird jetzt für jedes Autoobjekt eine Variable mit Speed gehalten, ich dachte doch, private Elemente werden nicht vererbt. Warum existiert Speed für die Subklasse Auto?

    Grüße
    Vincent



  • Vince schrieb:

    Aber warum wird jetzt für jedes Autoobjekt eine Variable mit Speed gehalten, ich dachte doch, private Elemente werden nicht vererbt. Warum existiert Speed für die Subklasse Auto?

    Doch sie werden vererbt, sie sind nur fuer Methoden der Klasse Auto nicht sichtbar. Fuer Methoden von Vehicle sind sie natuerlich sichtbar!



  • Warum machst Du die Variable nicht einfach protected?
    Dann kannst Du dir die ganze set Methode sparen und man kann aus anderen Klassen (außer den vererbten) trotzdem nicht drauf zugreifen.



  • Warum machst Du die Variable nicht einfach protected?

    Ich wollte vermeiden, dass man einfach auf die Attribute zugreifen kann und so vielleicht ungültige Werte erzeugen kann.


  • Mod

    Vince schrieb:

    abstract class Vehicle{
        private double Speed;
        public void setSpeed(double speed){
             Speed = speed;
        }
        public double getSpeed(){
              return Speed;
        }
    ...
    }
    

    Lustig. Letzt hat hier erst jemand gesagt, dass ein Fehler, wie "speed = speed", wo offensichtlich ein "this" vergessen wurde, nicht vorkommt, weil das einfach zu offensichtlich ist. 😃



  • Lustig. Letzt hat hier erst jemand gesagt, dass ein Fehler, wie "speed = speed", wo offensichtlich ein "this" vergessen wurde, nicht vorkommt, weil das einfach zu offensichtlich ist.

    Und damit hat er auch vollkommen recht. Tipp: Java achtet auf Klein- und Großschreibung. 🕶

    /edit: der alte Text klang irgendwie gemein.


  • Mod

    Ups, mein Fehler! 😃 Ich bin wohl zu sehr daran gewöhnt, dass man sich bei der Namensgebung an gewisse Standards hält. Ein Mixen von Groß- und Kleinschreibung ist mir zumindest bisher noch nicht untergekommen.


Anmelden zum Antworten