Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class -> public method -> variable private?
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.
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:
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;
}
}
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 :-]
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
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.
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