Objekte this und Konstruktor

julia123

Erfahrenes Mitglied
hi all,
ich hab probleme diesen Konstruktor und diese this zu verstehen.

Code:
private int inhalt;// objektvariable richtig?

	public Behaelter(int menge) { 
		this.inhalt = menge; 
	}
public Behaelter() {// Konstruktor inhalt auf 1000 setzen
		this.inhalt = 1000;
	}
public void befuellen(int menge) { 
		if (inhalt + menge > 1000) {	
		}
		this.inhalt = inhalt + menge;
	}
was hier steht versteh ich eigentlich alles. aber dieses this wieso weshalb kommt nicht in mein kopf. hier in dem beispiel ist diese menge ein rätsel für mich.


Code:
private int inhalt;// objektvariable richtig?

	public Behaelter(int menge) { 
		this.inhalt = 0; 
	}
public Behaelter() {// Konstruktor inhalt auf 1000 setzen
		this.inhalt = 1000;
	}
public void befuellen(int inhalt) { 
		if (inhalt > 1000) {	
		}
		this.inhalt = inhalt;
	}

Hier so würde ich denke und es machen wieso geht das so nicht oder geht das? ich brauch einfach mal hilfe um diese logik zu verstehen.
 

ComFreek

Mod | @comfreek
Moderator
Hallo,

ja deine Objektvariablen-Bezeichnung ist richtig.

'this' ist ein Zeiger auf das aktuelle Objekt/Instanz. In Java brauchst du nicht unbedingt 'this.xxx' nutzen, denn du kannst gleich auf 'xxx' einfach so zugreifen (im Gegensatz zu PHP z.B.).

Beim folgenden Codestück musst du allerdings in der letzten Zeile das 'this' voranstellen, denn ansonsten referenziert Java den Parameter anstatt der Objektvariable.
Java:
public void befuellen(int inhalt) { 
        if (inhalt > 1000) {    
        }
        this.inhalt = inhalt;
    }
Was soll denn diese Methode machen? Sie übernimmt einfach nur den übergebenen Parameter.

Folgendes addiert zum Inhalt des Objektes noch die angegebene Menge hinzu. (Dieses If-Konstrukt ist hier eigtl. überflüssig, da es leer ist)
Java:
public void befuellen(int menge) { 
        if (inhalt + menge > 1000) {    
        }
        this.inhalt = inhalt + menge;
    }


PS: Bitte auf Klein- und Großschreibung achten. Außerdem ist es viel leichter Code zu lesen, wenn er richtig eingerückt ist. Sprich entweder manuell einrücken oder schauen, ob deine IDE solch eine Funktion zur Verfügung stellt.
 

HonniCilest

Erfahrenes Mitglied
Das this ist ein Indiz dafür, dass es sich um das aktuelle Objekt handelt, also this.inhalt ist die Objektvariable. Du könntest das this auch weglassen. Notwendig wird es z.B. befuellen(int inhalt) in deinem 2. Beispiel.
Java:
this.inhalt = inhalt;
Das Argument in der Methode hat zufällig den gleichen Namen wie deine Objektvariable. Java verwendet hier vorrangig das Argument. Mit dem this wird gekennzeichnet, dass hier jedoch die Objektvariable gemeint ist.

Edit: War wohl ein wenig zu langsam ;-) aber ich hätte noch eine Vermutung zu deinem Codestück mit dem leeren If-Konstrukt im 1. Beispiel: Soll es ggf. überprüfen, ob die Maximale Füllmenge von 1000 überschritten wird? Dann fehlt hier aber noch bissl was ;-)
 
Zuletzt bearbeitet:

julia123

Erfahrenes Mitglied
angenommen ich hab sowas:
Code:
private int inhalt;

	public Behaelter(int menge) {
		this.inhalt = menge; 
	}

	public Behaelter() {
		this.inhalt = 1000;
	}

	public void befuellen(int menge) {
		this.inhalt = menge;// 
	}
Zeile 13 ist doch dass selbe wie oben im bespiel oder? ich hab das inhalt +menge weg gelassen.


ich glaub ich hab das mit menge verstanden das ist einfach sowas wie ein zwischen Speicher weill ich sonst nicht mit inhalt in Methoden arbeiten kann richig? oder wie kann ich mir das besser vorstellen.


angenommen ich erzeuge sollch ein objekt und ich frage denn inhalt ab... dann müsste dieser bei 1000 sein oder?
aber schreibt man this.inhalt = 1000, nicht sofort in den konstruktor dann erspart man sich doch die Arbeit? wenn das geht wie müsste das aussehen?




Code:
 public Behaelter(int menge) {
        this.inhalt = 1000;
        this.inhalt = menge; 
    }

sowas meine ich
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi julia123,

habe mal dein Codeschnipsel genommen, etwas erweitert und kommentiert. Hoffe das trägt besser zum Verständnis bei:

Java:
public class Behaelter {
	private static final int KAPAZITAET = 1000; // der behälter fasst insgesamt 1000 einheiten
	private int inhalt; // wie viel ist in dem behälter drin?
	
	public Behaelter(int menge) { 
		inhalt = menge; // setze den bereits gefüllten inhalt des behälters fest
	}

	public Behaelter() {
		inhalt = KAPAZITAET; // der standard-konstruktur erstellt den behälter voll befüllt
	}

	public void befuellen(int menge) { 
		if (inhalt + menge > KAPAZITAET) { // du willst dem behälter mehr füllen, als er fassen kann.
			// was soll geschehen?
		}

		inhalt = inhalt + menge; // addiere die neue menge zu dem bestehenden inhalt hinzu
	}
}

Ich habe hierbei folgendes geändert:
- Unnötige this. entfernt. Wie schon von meinen Vor-Postern geschrieben brauchst du das nur, um zwischen der Objektvariable und einem Parameter zu unterscheiden, falls diese den selben Namen haben.
- Die fixen 1000 als Konstante in der Klasse hinterlegt, trägt auch zum Verständnis bei, siehe auch Magic Numbers
- Den leeren If-Block mal mit einer Vermutung, was passieren soll gefüllt.

Grüße,
BK
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
ich glaub ich hab das mit menge verstanden das ist einfach sowas wie ein zwischen Speicher weill ich sonst nicht mit inhalt in Methoden arbeiten kann richig? oder wie kann ich mir das besser vorstellen.
Ich glaube, du hast deine Methode falsch impementiert. Zumindest trägt sie einen falschen Namen, denn "befüllen" meint etwas zu addieren, evtl. mit einer oberen Grenze (von 1000), deswegen auch das IF meiner Vermutung nach.

Java:
public Behaelter(int menge) {
        this.inhalt = 1000;
        this.inhalt = menge; 
    }
Du meinst den Unterschied zwischen den zwei Zeilen?
Es geht einfach darum, den Startwert von außen flexibel zu halten.

Ich zitiere mich selbst:
ComFreek hat gesagt.:
PS: Bitte auf Klein- und Großschreibung achten.
 

HonniCilest

Erfahrenes Mitglied
Kleine Anmerkung noch: Bei "was soll hier geschehen" Kommentar in #5 müsste eine Hinweis ausgegeben werden und ein return Statement stehen. Ohne return Statement muss sonst der 2. Teil der Funktion in einem else-Statement stehen. Also:

Java:
public void befuellen(int menge) { 
        if (inhalt + menge > KAPAZITAET) { // du willst dem behälter mehr füllen, als er fassen kann.
            inhalt = KAPAZITAET;
            System.out.println("Der Behälter läuft über. Übergelaufene Menge: " + (inhalt + menge - KAPAZITAET));
            return;
        }
 
        inhalt = inhalt + menge; // addiere die neue menge zu dem bestehenden inhalt hinzu
    }
ODER
Java:
public void befuellen(int menge) { 
        if (inhalt + menge > KAPAZITAET) { // du willst dem behälter mehr füllen, als er fassen kann.
            inhalt = KAPAZITAET;
            System.out.println("Der Behälter läuft über. Übergelaufene Menge: " + (inhalt + menge - KAPAZITAET));
        } else {
            inhalt = inhalt + menge; // addiere die neue menge zu dem bestehenden inhalt hinzu
        }
    }
 
Zuletzt bearbeitet: