public class -> public method -> variable private?

Netzgeist

Mitglied
Hallo,
ich versuche mich gerade im rudimentärem Verständnis objektorientierter Programmierung. Folgendes Problem verschliesst mir mein Weiterkommen:

Java:
// Myemm.java
public class Myemm {
    int a;
    int b;
    
    int addiere() {
        return a + b;
    }
}

Java:
// Hauptmenue.java
public class Hauptmenue {
    public static void main(String[] args) {
        Myemm foo = new Myemm();
        foo.a = 4;
        foo.b = 3;
        int erg = foo.addiere();
        System.out.println(erg);
    }
}

Beides ist kompilierbar und ausführbar. Checkstyle sagt mir jedoch, int a und int b müssen private sein. Warum erschliesst sich mir nicht. Wenn ich sie private setze kann ich sie nicht ausserhalb der Klasse deklarieren. Wenn ich das so mache versteh ich aber nicht wie ich ein Objekt der Klasse Myemm erzeugen kann, ohne das die Eigenschaften (wie hier int a) immer dieselben sind.

Danke für jeden Denkanstoß 🙂
 
Um die Variablen von außen ändern zu können führt man in der Regel setter-Methoden ein, z.b.:

Java:
public void setA(int a) {
   this.a = a;
}
So kannst du nämlich den zugriff auf a kontrollieren. Wenn du keinen Zugriff auf a von außen zulassen möchtest lässt du den setter einfach weg.
Willst du sicherstellen dass a immer größer 0 ist macht du im setter einfach noch ne Abfrage.

Um an die privaten Variable wieder ranzukommen brauchst du getter:

Java:
public int getA() {
   return a;
}
 
Du kannst eine Methode definieren, um die Zahlen zu setzen:
Java:
// Myemm.java
public class Myemm {
    private int a;
    private int b;
    
    int addiere() {
        return a + b;
    }

    public void setA(int a) {
        this.a = a;
    }

    public void setB(int b) {
        this.b = b;
    }

}

Oder du kannst die Variablen im Kontruktor setzen:
Java:
// Myemm.java
public class Myemm {
    private int a;
    private int b;

    public Myemm(int a, int b) {
        this.a = a;
        this.b = b;
    }
    
    int addiere() {
        return a + b;
    }

}

edit:
War jemand schneller 😀
 
Ich fasse zusammen was ich glaube verstanden zu haben:

Es ist mir nicht möglich, ein erzeugtes Objekt einfach durch Zugriff auf seine Eigenschaften(Variablen) zu ändern(niemals?).
Stattdessen muss ich dem Objekt für jede einzelne Eigenschaft eine Methode schreiben, die diese Eigenschaft dann ändert.

Richtig? Dann habs ichs theoretisch jetzt verstanden - praktisch sobald ich das Kapitel über Konstruktoren durch hab :-]
 
Es ist mir nicht möglich, ein erzeugtes Objekt einfach durch Zugriff auf seine Eigenschaften(Variablen) zu ändern(niemals?).
möglich schon - wenn man eben die entsprechenden Zugriffsmodifikatoren (?) nutzt... also wenn du alles public machst kannste auch alles so ändern....
nur man sollte es nicht machen

Stattdessen muss ich dem Objekt für jede einzelne Eigenschaft eine Methode schreiben, die diese Eigenschaft dann ändert.
für jede Eigenschaft, die du ändern lassen willst... nicht automatisch für jede ist dies sinnvoll bzw nötig
 
Es ist mir nicht möglich, ein erzeugtes Objekt einfach durch Zugriff auf seine Eigenschaften(Variablen) zu ändern(niemals?).
Doch das ist möglich, die Variablen müssen halt sichtbar sein. Schau dir mal public, protected, private, default an. Sollte in den Links oben auch stehen.
 
>Zugriff auf seine Eigenschaften(Variablen) zu ändern(niemals?).

Doch. Machst du ja mit foo.a = 4. Du musst jedoch Zugriff darauf haben. siehe
Controlling Access to Members of a Class (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

Wenn die Instanzvariablen öffentlich sind, kann das schnnell zum chaos führen. Darum benutzt man
meist getter und setter. Diese können evtl noch was retten. Evtl sind die Objekte auch etwas komplexer
und benutzen einen inneren Zustand, den andere nicht ändern sollten.

zb:
Java:
public class Add {

public int sum;

public Add(int a, int b) { this.sum = a+b;}

}

Da sum von a und b äbhängt, möchte man nicht, das diese Variable von aussen verändert wird. Darum wird der Access auf private getellt und kein setter gemacht.
 
Ok. Ich "kann" also was ich eh schon gemacht hab und checkstyle meckert weil es "schlecht" ist. Nun weiss ich _warum_ es schlecht ist. Wird dann aber viel monotones runterhacken wenn 10 Objekte 10 beim erstellen individuell zu setzende Eigenschaften haben *schaut deprimiert*. Naja, Lehrjahre sind keine Herrenjahre. Danke euch 🙂
 
Hey toller Tip. Ich benutze Netbeans und konnte das recht schnell im Kontextmenü finden. Naja, zu Übungszwecken werde ich vorerst trotzdem alles abtippen. Danke euch allen und einen schönen Mittwoch 🙂
 

Zurück
Oben