[Erledigt] this

public class Konto {

	public static void main(String[] args) {
		Kontodaten meinKonto = new Kontodaten();
		Kontodaten anderesKonto = new Kontodaten();

		meinKonto.einzahlen(25.00);
		anderesKonto.einzahlen(32.00);

		System.out.println("Auf ihrem Konto liegen "
				+ meinKonto.getKontostand() + " Euro");
		System.out.println("Auf anderem Konto liegen "
				+ anderesKonto.getKontostand() + " Euro");
	}

}

class Kontodaten {
	double kontostand;

	void einzahlen(double betrag) {
		this.kontostand += betrag;
	}

	double getKontostand() {
		return this.kontostand;
	}

}

Ich habe 2 Fragen zu diesem Beispiel. Warum muss ich die konstostand Variable vom Typ double mit keinem Wert belegen? Obwohl ich die nicht belegt habe, hat sie einen Wert 0.
Zweite Frage, die mich am meisten interessiert und die ich noch immer nicht verstehen kann.

Warum sollte man in diesem Beispiel this verwenden? Ohne this funktioniert das Programm genau so gut. Kann mir jemand an einem Beispiel zeigen, wo this wirklich notwendig ist, vieleicht werde ich dann es verstehen?

Danke

also erstmal zu dem 0 jedes Objekt hat einen default Wert
bei Objekten ist es null und bei primitiven Datentypen ist es 0 bis auf boolean da ist es false

In dem Beispiel würd ich auch kein this verwenden das muss man nicht einige machen das aber man muss das nicht machen (ich würds auch nicht machen)
brauchen tust du das wenn du in einer Methode eine lokale Variable mit dem gleichen Namen hast wie in einer deiner Klasse. Wenn du jetzt sagst variablenname = … dann greifst du auf die lokale Variable zu, wenn du aber die der Klasse haben willst dann musst du this davor schreiben dann weiß Java (auch in C++ und anderen Sprachen) das du die der Klasse willst

class Test{
  private String a="a";
  private void printA()
  {
     String a="b";
     System.out.println(a);
     System.out.println(this.a);
  }
}
public class This {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ThisTest test = new ThisTest();
		test.schreibe();
	}
}
class ThisTest{
	String name = "Alex M.";
	
	void schreibe(){
		String name = "John M.";
		System.out.println(name);
		//Lokale Variable, die nur innerhalb dieser Methode existiert
		System.out.println(this.name);
		//Globale Variable, die innnerhalb dieser Klasse existiert
	}

}

Ich habe hier ein Beispiel gebastelt und ich glaube ich habe endlich verstanden wie das funktioniert. Ich habe dort 2 Kommentare reingeschrieben, schau dir bitte mein Beispiel an und die Kommentare und sag mir ob ich es richtig verstanden habe hoff. :stumm:

genau das passt

ENDLICH lol :smiley: , DANKE!!!

ich habe es mir früher angewohnt this immer zu schreiben um mit einem blick sofort zu sehen ob es eine lokale oder instanzvariable ist.

Seitdem ich aber in eclipse mir alle variablen / methoden untersch. farblich markiere mach ich es nicht mehr

Ich habe neuste Eclipse runtergeladen und die markiert gleiche Variablen automatisch, ist sehr praktisch für einen Anfänger wie ich.

Hi,

ich habe versucht eigene Exception zu programmieren, nur funrkioniert das irgendwie nicht. Was mache ich falsch?

package self;

public class TesteSieben {

	public static void main(String[] args) throws SevenException{
		int meineZahl = 7;
		
		if(meineZahl == 7){
			throw new SevenException();
		}
		else
		{
			System.out.println("Diese Zahl mag ich!");
		}
	}

}
package self;

public class SevenException extends ArithmeticException{
		
	public SevenException() {
		getMessege();
	}
	
	String getMessege(){
		return "Ich mag keine sieben! ERROR!";
	}

}

wieso was soll da passieren ist doch richtig so du machst es nur falsch dass du sie schon wieder weiterleitest

Ich wollte, dass wenn ich die auslöse, dass in der Fehlermeldung der String aus der getMessege()-Methode steht. Funktioniert aber nicht.

Ich kriege dies als Fehlermeldung:

Exception in thread "main" self.SevenException
	at self.TesteSieben.main(TesteSieben.java:9)

Richtig muss das so aussehn

package self;
public class TesteSieben {

	public static void main(String[] args) {
         try
         {
		int meineZahl = 7;
		
		if(meineZahl == 7){
			throw new SevenException();
		}
		else
		{
			System.out.println("Diese Zahl mag ich!");
		}
           }
           catch(SevenException e)
           {
              System.out.println(e.getMessage());
           }
	}

}

Auf der DVD hat man so gemacht:

package self;

public class SevenException extends ArithmeticException{
		
	
	private double zahl;
	
	public SevenException(double zahl) {
		this.zahl = zahl;
	}
	
	public String getMessage(){
		return "Ich mag keine sieben! ERROR!";
	}

}
package self;

public class TesteSieben {

	public static void main(String[] args) throws SevenException{
		int meineZahl = 7;
		
		if(meineZahl == 7){
			throw new SevenException(meineZahl);
		}
		else
		{
			System.out.println("Diese Zahl mag ich!");
		}
	}

}

Fehlermeldung:

Exception in thread "main" self.SevenException: Ich mag keine sieben! ERROR!
	at self.TesteSieben.main(TesteSieben.java:9)

Warum funktioniert das und warum funktioniert meine Exception nicht? Hier hat man ohne try-catch gemacht. Ich habe bisschen anders gemacht, aber ich sehe keinen Fehler in meinem Versuch…hmmm…

also wenn das genauso gemacht wurde kann ichs dir nicht sagen
ansonsten würd ich darauf tippen das sie die toString() überschrieben haben
aber so mit dem aus der main weiterleiten ist eh scheiße :wink:

package self;

public class SevenException extends ArithmeticException{
		
	public String getMessage(){
		return "Ich mag keine sieben! ERROR!";
	}

}


package self;

public class TesteSieben {

	public static void main(String[] args) throws SevenException{
		int meineZahl = 7;
		
		if(meineZahl == 7){
			throw new SevenException();
		}
		else
		{
			System.out.println("Diese Zahl mag ich!");
		}
	}

}

Ich habe nochmal versucht und jetzt hat es geklappt. Warum die auf DVD einen Konstruktor gemacht haben, verstehe ich nicht. Ist doch an der Stelle überflüssung. Die Zahlen werden ja nicht in der Exception sondern in dem Programm überprüft. Die getMessage()-Methode muss public sein. Als es funktioniert hat und ich public entfernen wollte, hat er sofort gemekert. Warum er beim ersten mal das nicht gemacht hat, hmm? Naja egal. Jetzt geht es und sogar viel kurzer als auf der DVD.

ach jetzt seh ichs du hast nen Schreibfehler drin gehabt du hast Messege geschrieben nicht Message
deswegen hat er auch nicht gemeckert weil man kann den Modier nicht “enger” machen als in der Oberklasse
d.h. du kannst aus private -> default machen (kein Modifier) oder aus protected --> public
aber nicht umgekehrt public -> private

Ich verstehe nicht ganz. Ich habe in meinem 1 Beispiel zwar die Methode auf Englisch falsch geschrieben, aber diese Methode habe ich ja nie in der MainKlasse aufgerufen, sondern die ganze Klasse(SevenException) und da ist es egal wie die Methode heisst, oder nicht? Irgendwie verstehe ich das noch nicht:confused:

ja aber Java ruft diese auf, es wird immer erst getMessage und dann printStacktrace aufgerufen und du hast ja die getMessage nicht überschrieben

:confused: getMessage oder getMessege? Ich rede vom 1 Bsp. Da gibt es doch keine getMessage, oder?

Mein erster und letzer Bsp unterscheiden sich nur, dass bei einempublic steht und bei anderem nicht, aber warum hat er dann die methode ohne public nicht unterstrichen(eclipse)? Oder bin ich vieleicht blind und sehe irgendwas nicht lol:stumm:

Wieso soll er das unterstreichen?
Das ist für Java nur eine neue Methode die du geschrieben hast, und die getMessage Methode gibt es aber halt in einer der Superklassen.