Java Setter und Getter

HerrDrachen

Lieutenant
Registriert
Feb. 2016
Beiträge
589
Code:
package paket1;

import java.util.Scanner;




	
public class Hallo1 {

	public static void main(String[] args) {		
	
		
	Mensch herrMueller = new Mensch(35, "Franz", "Müller", "blau");
	Mensch frauMueller = new Mensch(33, "Steffie", "Müller", "blau");
	herrMueller.infoAusgeben();
	frauMueller.infoAusgeben();
	
	
	Scanner input = new Scanner(System.in);
	String namenVeraenderung = input.nextLine();
	herrMueller.setVorname(namenVeraenderung);
	herrMueller.infoAusgeben();
	
	
	System.out.println(herrMueller.getVorname());
	
	
	}
	
	
		
		
		
	}

Code:
package paket1;

public class Mensch {

	
	
int alter;
String vorname, nachname, augenfarbe;



public Mensch(int dasAlter, String derVorname, String derNachname, String dieAugenfarbe){
	
	alter = dasAlter;
	vorname = derVorname;
	nachname = derNachname;
	augenfarbe = dieAugenfarbe;
	
	
}


public void infoAusgeben(){
	System.out.println(vorname+ " "+ nachname + " ist " + alter + " Jahre alt und seine Augen sind " + augenfarbe + ".");
	
	
}
	
	

public void setVorname(String denVornamen){
	vorname=denVornamen; 
	

}

public String getVorname(){
	return vorname;
}
	
	
	
	
	
	
}

Im ersten Codebeispiel, Zeile 22
herrMueller.setVorname(namenVeraenderung);

und im zweiten Codebeispiel, Zeile 31,32 und Zeile 37,38.

Verstehe ich nicht. Was genau wurde da gemacht?
Das Ergebnis ist am Ende dann:
Man gibt per Scanner einen neuen Vornamen ein und dann ändert sich der bisherige in den neu eingebenen
Vornamen, aber wie genau funktioniert diese "Setter und Getter" Methode?
 
Nach dem gleichen Prinzip wie Merhoden: https://www.computerbase.de/forum/threads/methoden.1634882/

Die Variablen werden nicht benutzt um sie direkt auszugeben, sondern um sie den Objektvariablen zuzuweisen. Du scheinst die Prinzipien immer noch nicht verstanden zu haben, diese Transferleistung ist nun wirklich keine große Sache...

Oder Du hast das Thema Klassen und Objekte nicht verstanden. Entweder sind Deine Videos sehr schlecht, oder die Methode ist zum lernen für Dich nicht geeignet... Aber es wurden Die ja auch schon genug Bücher etc. vorgeschlagen, die Du alle nicht willst.
 
Zuletzt bearbeitet:
Ich habe ja auch erst vor ca 14 Tagen mit dem Programmieren angefangen ;-)

Ich finde , dass ich in dieser Zeit durchaus etwas gelernt habe!
Klar sind das Grundlagen, aber das ist auch schon schwer genug am Anfang.
 
Ein großer Teil der Programmierung besteht aus Eigeninitiative und sich Sachen selbst erarbeiten und zu ergooglen, Du wirst nie alles Wissen. Aber das scheint bei Dir schon bei den elementarsten Sachen nicht zu funktionieren...

Zum Thema Setter und Getter wird dir Google 1000e Ergebnisse ausspucken.
 
Ich habe ja viel Eigeninitiative sonst würde ich hier keinen Thread aufmachen.
Wenn das mit Setter und Getter so einfach ist, kann mir das jemand halt schnell erklären?

Mit den allermeisten google Ergebnissen zu diesem Thema kann ich nichts anfangen...
google beantwortet nicht alle Fragen.
 
Getter und Setter sind nichts weiter als Methoden, die den Zugriff auf Felder kapseln, um einen direkten Zugriff auf das Feld zu vermeiden. Dadurch kann man z.B. nachträglich den tatsächlichen Speicherort des Feldes ändern (z.B. Datenbank) oder ein völlig anderes Feld nutzen ohne sämtlichen Client-Code (d.h. Code, der diese Feldwerte lesen/schreiben will) modifizieren zu müssen.

Gibt noch viele weitere Möglichkeiten, wozu das gut sein kann. Bringt eben Flexibilität. Verursacht allerdings auch viel sog. boilerplate code (viele Felder -> viele Getter-/Setter-Methoden). Da hilft dann z.B. Lombok.
 
Getter und Setter sind dann Hilfreich, wenn man vor der Ausgabe mit den Variablen noch arbeiten/rechnen will.

Wenn du zum Beispiel eine Zeitspanne festlegen willst, dann kannst du statt:

Code:
int seconds, minutes, hours, days

public void main()
{
  seconds = 600;
  minutes = 10;
  hours = 1/6;
  days = 1/144;
}

Code:
int seconds;

public void setSeconds(sec)
{
  seconds = sec;
}
public void setMinutes(min)
{
  seconds = min*60;
}
public void setHours(h)
{
  seconds = h*60*60;
}
public void setDays(d)
{
  seconds = d*24*60*60;
}

public void getMinutes()
{
  return seconds*60;
}

etc...

Damit vermeidest du, bei vielen Wertänderung immer wieder die gleichen 4 Zeilen zu schreiben (beispiel 1).

Mit komplexeren Beispielen spart man da noch viel mehr an Code und manchmal ist es gar notwendig, vorher mit dem Code noch etwas zu machen - beispielsweise wenn du im Hintergrund eine Datenbank als persistenten Speicher nutzen willst, dann kannst du nicht einfach eine Variable direkt nutzen, sondern brauchst einen Setter, der sowohl die Variable ändert, als auch die Datenbank aktualisiert.

Und es auch noch einige andere sinnvolle Anwendungen.
 
Ich hab es immer noch nicht verstanden.

Das Buch "Java ist auch eine Insel" beantwortet meine Frage zu Setter und Getter nicht!

Was ich brauche ist eine Antwort und kein Verweis auf irgendwelche Bücher oder google.
 
Du kannst Getter und Setter nicht verstehen, wenn du Methoden an sich nicht verstehst und das ist ja offenbar der Fall, denn dein anderer Thread läuft ja zu dem Thema auch noch. Die letzte Antwort da könnte man aber genau so hier posten:

https://www.computerbase.de/forum/threads/methoden.1634882/page-2#post-19479877

Damit ist alles gesagt. Wenn du schon an den elementarsten Dingen scheiterst und dich nicht selbst durchbeißt (oft genug erklärt wurde es dir ja), dann solltest du dir die Zeit wirklich sparen und dir ein Hobby suchen, das dir liegt.
 
Was genau verstehst du denn daran nicht?

Die get/set Methoden brauchst du, weil du Variablen normalerweise auf private setzt, d.h. dass du die von anderen Objekten aus weder einsehen noch direkt verändern darfst. Die get/set Methoden haben dann noch andere Vorteile gegenüber einer direkten Zuweisung. z.B. könnte man in eine setter Methode eine Zeile einfügen welche einen Log Eintrag erzeugt.
 
Java ist eine sogenannte 'objektorientierte' Programmiersprache. Im Groben bedeutet es, dass sich das erstellte Programm aus erzeugten Objekten zusammensetzt. In Deinem Beispiel wird ein neues Objekt vom Typ "Mensch" erstellt:

Code:
Mensch herrMueller = new Mensch(35, "Franz", "Müller", "blau");

Eines der zugrundeliegenden Konzepte von Java (bzw. von objektorientierten Programmiersprachen im Allgemeinen) ist es nun, dass die Attribute eine Objekts nach außen hin "gekapselt" sind, d.h. andere Objekte und/oder Programmteile können nicht einfach so Attribute verändern oder auslesen. Falls es doch mal nötig ist, ein Attribut nach außen hin zugänglich zu machen, implementiert man sogenannte "Getter" und "Setter" (auch Zugriffsfunktionen genannt).

In Deinem Beispiel verfügen aus der Klasse Mensch erzeugte Objekte über jeweils einen Getter und Setter für das Attribut des Vornamens. Mit getVorname() erhalte ich den Vornamen des jeweiligen Objektes zurück (in der Methode sieht man ja return vorname).

Abschließend wird diese Funktionalität ja auch tatsächlich genutzt:

Code:
herrMueller.setVorname(namenVeraenderung);

Hier wird der Methode "setVorname()" die Variable "namenVeraenderung" übergeben. Was dann innerhalb des Objektes mit der Variable passiert, ist nicht mehr Problem des aufrufenden Codes; das wird nur noch intern im "Mensch"-Objekt gehandhabt. In besten Fall sollte dann natürlich das Attribut des Vornamens geändert werden.



Noch ein Wort zur Eigeninitiative: Die "Initiative" sollte darin bestehen, dass Du Dich mit den Konzepten der objektorientierten Programmierung auseinandersetzt und nicht darin, einen Forenbeitrag zu erstellen. Wenn Du den Scheiß wirklich lernen willst, dann versuch erstmal bestimmte Konzepte zu verstehen, und fang kleinschrittig an. Wenn Du keine Ahnung hast, was Klassen, Methoden, Objekte und Attribute sind, dann würde ich mich erstmal darauf stürzen. Deswegen halte ich persönlich auch die meisten Videos da draußen für absoluten Schrott. In der Regel läuft es doch so ab, dass man erstmal gezeigt bekommt, wie man eine Variable deklariert, was man an Datentypen hat, Schleifen, bla bla bla... Dann hat man zwar schon was gelernt, aber man muss erstmal gefühlte 100 Videos gucken, bis man das erste mal mit Objekorientierung zu tun bekommt. Richtig wäre es, den Lernenden direkt ins kalte Wasser zu schmeißen und sofort mit OOP anzufangen und alles andere on the fly mitzunehmen.
 
Hast du dir schon angeguckt was public, protected und private im Zusammenhang mit Varibalen und Funktionen bedeutet? Das sollte man zu allererst verstehen.

Das Beispiel im ersten Post ist zudem unsinnig. Die Variablen sind alle public, da machen Setter und Getter grundsätzlich wenig Sinn, weil man diese dann gar nicht verwenden muss. Man hätte also statt
Code:
herrMueller.setVorname(namenVeraenderung);
genausogut
Code:
herrMueller.vorname = namenVeraenderung;
schreiben können.

In diesem konkreten Beispiel würde es aber Sinn machen, dass eine Veränderung des Vornamens nur durchgeführt wird, wenn der neue Name nicht leer ist und keine für einen Vornamen ungültige Zeichen (beispielsweise Zahlen) enthält. Würde in der Klasse Mensch
Code:
private String vorname
stehen könnte man nach Erzeugung des Mensch Objekts den Vornamen nur noch über Aufruf der Funktion
Code:
public void setVorname(String denVornamen)
des Objekts Mensch verändern, da die Variable selbst private und somit "von außen" nicht direkt verfügbar ist.
Somit könnte man eine Prüfung in die Setter Funktion einbauen.
Hier mal zur Veranschaulichung:
Code:
public void setVorname(String denVornamen){

   //der neue Vorname ist nicht NULL, nicht leer und enthält keine Ziffern
   if ( denVornamen != null && !denVornamen.isEmpty() && !denVornamen.matches(".*\\d.*") ){ 
         vorname=denVornamen; //vornamen setzen
   } else {
         //vorname bleibt unverändert	
   }

}
Ganz ehrlich, wenn das Beispiel aus deinem Video stammt, dann hör besser auf deine Zeit damit zu verschwenden.

HerrDrachen schrieb:
Ich habe ja auch erst vor ca 14 Tagen mit dem Programmieren angefangen ;-)
Tut mir leid aber das ist eine schlechte "Ausrede". Einfache Datentypen, Variablen und Funktionsaufrufe lernt man in der Uni in den ersten 2-3 Vorlesungsstunden.:p In dem von mir genannten Buch aus dem vorherigen Thread wird dies in den ersten vier Kapiteln abgedeckt. Und zwar ausführlich und nachvollziehbar. In den zwei Wochen müsstest du mit einem sinnvollen Lernmittel deutlich weiter sein, selbst wenn du nur alle paar Tage für eine Stunde rein schaust. Frage mich gerade wie das weiter gehen soll, wenn du erstmal bei abstracten Klassen, Interfaces, Exceptions, Threads usw. ankommst.
Soll auch kein Vorwurf sein oder irgendwie persönlich rüber kommen. Man muss halt erstmal herausfinden wie man selbst am effektivsten lernt. Aber die Tatsache, dass du wirklich wegen den grundlegendsten Sachen hier nachfragen musst, sollte dich doch zweifeln lassen.

Ansonsten kann ich Vulpecula nur zustimmen. Ist auch persönlich erstmal mein letzter Post in diesem Umfang zu deinen Grundlagen-Fragen.
 
Zuletzt bearbeitet:
Der Fehler kommt nicht wegen den anderen Klassen, sondern wegen einer fehlenden Methode. Du kannst Anweiseung nicht einfach in den Klassenrumpf schreiben.
Wenn du die Klasse ausführen willst, muss da die magische main-Methode rein und dann sagst du Eclipse, dass diese Klasse ausgeführt werden soll.
 
Danke, jetzt gehts!

hm. Ich habe immer gedacht, dass eine main-Methode ausreicht.
Also, dass es ausreicht, wenn nur eine einzige Klasse die main-Methode hat.
Dass die anderen Klassen die main-Methode nicht brauchen.

Es ist ja so, dass die Klasse Hallo1 die main-Methode hat, Klasse TraumAuto undTraumhaus
brauchen keine main-Methode...warum braucht dann die Klasse Hallo2 plötzlich eine main-Methode?
 
Zuletzt bearbeitet:
Ich weiß nicht ganz genau wie das in Java geregelt ist, aber auf jeden Fall brauchst Du nur eine Main Methode, die ist der Einstiegspunkt des Programms. Ich weiß aber nicht genau in welcher Klasse vom Projekt die sein muss, ist aber mit Sicherheit irgendwo dokumentiert. Das Problem war wie schon gesagt wurde, dass jegliche Anweisungen in einer Methide stehen müssen. Das muss nicht zwingen Main sein, Du hättest die Methode auch anders nennen können und nicht statisch machen müssen. Dann hättest Du in der Main Methode des Programs die Klassen instanziieren müssen und auf dem Objekt dann die Methode aufrufen müssen.
 
Drexel schrieb:
Ich weiß nicht ganz genau wie das in Java geregelt ist
Jede Klasse kann eine main-Methode haben, wenn diese denn direkt ausgeführt werden soll (ob das Sinn macht ist eine andere Sache).
Packt man das Projekt in eine ausführbare .jar muss dort die auszuführende Klasse explizit angegeben werden.
 
@Drexel Man kann beliebig viele main-Methoden in beliebig vielen Klassen haben. Sinnvoll ist das natürlich nicht. Aber eine Konvention wie man die Einstiegsklasse nennt und wo man diese platziert gibt es nicht. Ich nenne sie wie das Programm und lege sie ausnahmsweise ins Default-Verzeichnis, weil dieser Klassenname mitunter als Programmname angezeigt wird.

Klasse Hallo2 benötigt nicht zwingend eine main-Methode. Nur wenn man diese Klasse direkt ausführen möchte.
 
Weiß der TE überhaupt was ein Datentyp ist oder ein Bezeichner? Ich glaube er sollte erst mal bei null anfangen bevor er sich mit Methoden oder mit Listen beschäftigt, wie in Vorgängerthemen.
 
Zurück
Oben