Objektorientierung Konstruktor

babuschka

Top Contributor
Java:
public class Zimmer { 
private int qm; 
private int Miete; 
private String Adresse; 
   
// hier fehlt der Konstruktor (vgl. Aufgabe 12.a.)
   
public int getMiete() 
 { 
    return Miete; 
 } 
   
public void setMiete() 
 { 
    this.Miete = Miete; 
 } 
   
public int getQM() 
 { 
    return qm; 
 } 
   
// hier fehlt die Methode zur Rückgabe der Adresse (vgl. Aufgabe 12.b.)
   
} 
Die Klasse Wohnungsmarkt ist wie folgt vorgegeben: 
public class Wohnungsmarkt { 
private Zimmer w_Array [] = new Zimmer [5]; 
   
public Wohnungsmarkt(){ 
w_Array [0] = new Zimmer(23, 210, "Holländischer Platz 9"); 
    w_Array [1] = new Zimmer(24, 220, "Kurt-Wolters-Str. 3"); 
    w_Array [2] = new Zimmer(18, 170, "Wilhelmshöher Alle 71"); 
    w_Array [3] = new Zimmer(15, 200, "Menzelstr. 13"); 
    w_Array [4] = new Zimmer(10, 100, "Murhardstr. 2"); 
 } 
   
public Zimmer [] zimmerSuchen(){ 
return w_Array; 
 } 
}

Hey Leute wenn ich hier die Klasse "Zimmer" um einen Konstruktor erweitern soll, der als Parameter die Werte für alle Klassenvariablen enthält und diese dann initialisiert, dann wäre doch mein Konstruktor:

1.Möglichkeit
public Zimmer(int qm, int Miete, int Adresse)
{
this.qm=qm;
this Miete=Miete;
this Adresse=Adresse;
}


Allerdings soll auch die Möglichkeit gehen:
2.Möglichkeit:

public Zimmer (int q, int M, int A)
{

qm=q;
Miete=M;
Adresse=A;
}


Ich versteh nicht so ganz den Unterschied zwischen den beiden Varianten. Wenn ich "this"(1.Möglichkeit) benutze so kann ich alles von der Klasse abschreiben, benutzen ich jedoch kein "this"(2.Möglichkeit) so muss ich die Parameter im Konstruktor(in der Klammer vom Konstruktor) abkürzen bzw. anders nennen , als sie in der Klasse heißen.

Kann ich das immer freiwillig entscheiden, ob ich ein "this" benutze oder nicht?Falls nicht , woran erkennt man sowas, ob jetzt ein "this" mitzubenutzen ist oder nicht?

Hofffe ihr könnt mir helfen!
 

AlexSpritze

Bekanntes Mitglied
Mit
Code:
this.
beziehst du dich immer explizit auf die Member der aktuellen Klasse (d.h. auch, in statischen Methoden kannst du this nicht benutzen).
Wenn du in einer Methode Parameter hast, die genauso heißen wie Membervariablen, dann greifst du mit diesem Namen auf die Parameter zu und nicht auf die Member-Variablen. Das geht dann wiederum explizit mit
Code:
this.
.

Beispiel, man sieht sehr oft sowas wie:

Java:
public class Class1 {
 private final String name;

 public Class1(String name) {
 this.name = name; // Parameter name der Member-Variable name zuordnen
    // hier muss man explizit this benutzen
 }

 public String getName(){
    return name;
    // es ging aber ebenso gut return this.name; da hier keine entsprechende Verdeckung besteht.
 }
}
 
Zuletzt bearbeitet:

babuschka

Top Contributor
Also wir müssen nur leichte Konstruktoren erstellen...
Aber ich weiss immer noch nicht wann , das "this " zu benutzen ist und wann nicht.
Weil ein this macht die Sache einfacher , man muss halt dann die Parameter im Konstruktor nicht abkürzen und so.
Kann man das immer selbst entscheiden oder woran sieht man das?
 

AlexSpritze

Bekanntes Mitglied
Prinzipiell könntest du überall, wo du dich auf die Instanz-Variablen / Member-Variable der aktuellen Objektinstanz beziehst ein
Code:
this.
vorschreiben. Dort wo du dich auf die Parameter einer Methode oder eines Konstruktors beziehst, darfst du
Code:
this.
nicht schreiben, das würde auch keinen Sinn machen.
 

babuschka

Top Contributor
1)
gut also wenn ich mich auf die aktuelle klasse beziehe darf ich ein this benutzen?
2)
und ist das richtig, wenn ich jetzt kein this benutze dann muss ich die parameter abkürzen bzw. anders nennen,als sie in der klasse heissen?
 

AlexSpritze

Bekanntes Mitglied
1) ja
2) ja, ... wenn du sowas im Konstruktor hast:
Code:
variable = variable;
, dann ist das relativ sinnfrei. Das
Code:
this.
vor dem ersten variable gibt der Zeile Sinn :)
 

babuschka

Top Contributor
ja aber wenn ich das ohne this. mache und meine variable z.b kontonummer ist, dann hätte ich nicht kontonummer=kontonummer; , sondern kontonummer=kontonr;
das würde auch gehen?
also die variable kontonummer muss einmal in der klammer des KONSTRUKTERS abgekürzt/unbenannt werden und einmal hier.
das würde auch gehen?
 

Final_Striker

Top Contributor
ja aber wenn ich das ohne this. mache und meine variable z.b kontonummer ist, dann hätte ich nicht kontonummer=kontonummer; , sondern kontonummer=kontonr;
das würde auch gehen?
also die variable kontonummer muss einmal in der klammer des KONSTRUKTERS abgekürzt/unbenannt werden und einmal hier.
das würde auch gehen?

Wie wäre es einfach mit ausprobieren, was geht und was nicht. ;-)
 
M

maki

Gast
Hi,

this bezieht sich nciht auf die Klasse, sondern auf das Objekt.

Die Java Coding Conventions empfehlen, Parameter nciht zu "kürzen", sondern sie als final zu deklarieren, damit ist this auch nciht mehr optional.
 

babuschka

Top Contributor
Java:
public class ggt_eingabe2 { 
public static int zahl_einlesen(String text) { 
    int zahl = 0; 
    boolean erfolg = false; 
  Scanner scanner = new Scanner(System.in); 
  String falscheEingabe = ""; 
    // Do-While-Schleife, frage solange bis wirklich eine Zahl
eingegeben wurde
    do
    { 
   System.out.println(text); 
      try
      { 
    zahl = scanner.nextInt(); 
        // Die zahl muss ungleich 0 sein
        if (zahl > 0) 
     erfolg = true; 
        else
     System.out.println("Eingabe war <= 0!"); 
      } 
      // Exception, falls keine Zahl eingegeben wurde
      catch (InputMismatchException ime) 
      { 
        // Falsche Eingabe entfernen
    falscheEingabe = scanner.next(); 
    System.out.println("Eingabe war kein Integer!"); 
      } 
    } 
    while (!erfolg); 
     
return zahl; 
 }

Frage 1:
Kann mir vielleicht jemand sagen, was diese Zeile bedeutet:
"public static int zahl_einlesen(String text)"

Frage 2:r er ze
Bei dem while in der vorletzten Zeile , will man doch sagen, while(ungleich erfolge) , also wenn erfolge auftritt bricht es ab.Aber ungleich ist doch immer "!=" .....wieso steht hier denn nur ein "!"....hab das mit "!=" probiert, aber es werden nur Fehler angezeigt!
 

HimBromBeere

Top Contributor
Frage 1:
Kann mir vielleicht jemand sagen, was diese Zeile bedeutet:
Java:
public static int zahl_einlesen(String text)
Dass bedeutet, dass die Methode
Code:
zahl_einlesen
statisch ist. Das hat den Vorteil, dass du keine Instanz deiner Klasse erstellen musst, um die Methode nutzen zu können (du kannst also schreiben
Code:
GGT.zahl_einlesen()
), aber auch den Nachteil, dass du innerhalb dieser Methode keinerlei Instanzvariablen verwenden kannst (Klassenvariablen dagegen gehen, also solche, die ebenfalls statisch sind). Die Methode "gehört" somit zu keiner speziellen Instanz sondern zur Klasse selbst.

Frage 2:r er ze
Bei dem while in der vorletzten Zeile , will man doch sagen, while(ungleich erfolge) , also wenn erfolge auftritt bricht es ab.Aber ungleich ist doch immer "!=" .....wieso steht hier denn nur ein "!"....hab das mit "!=" probiert, aber es werden nur Fehler angezeigt!
Ausrufezeichen heißt nichts weiter als "nicht",
Code:
!=
heißt somit
Code:
nicht gleich
,
Code:
!erfolg
heißt damit "
Code:
nicht/kein Erfolg
". Beides sind logische Operatoren und unabhängig voneiander verwendbar. Alternativ kannst du auch schreiben
Code:
while (erfolg != true)
.
 
G

Gast2

Gast
zu 1:
Das ist ne statische Methode.

zu 2:
Erfolg ist dein boolean. Der wird auf true gesetzt sobald eine Zahl >0 eingegeben wurde. Daher fragst du ab: "solange wie erfolg false ist".
 

babuschka

Top Contributor
alles klar danke leute....
ich hab noch eine frage in java kann man doch mit "Math.randoom" zufällige zahlen auswählen lassen....
1)wo kommt diese "Math.randoom" immer hin?
2) wie bekomme ich Zahlen
zwischen 0-99, wie von 1-100, was ist der Unterschied bei meinem Code : wenn ich zahlen von 0-99 oder 1-100 haben will?
 

timbeau

Gesperrter Benutzer
Ein kompliziertes Beispiel:
Java:
int würfel;
Random r = new Random();
würfel = r.nextInt(6);
 

HimBromBeere

Top Contributor
Vorsicht:
Code:
Math.random
(mit nur einem o übrigens^^) liefert eine double-Zahl zwischen
Code:
0.0
und
Code:
1.0
zurück. Mit timbeaus Vorschlag dagegen kannst du gezielt Integeres oder was auch immer erhalten, oder eine Zufallsreihe widerholen. Ein solches Random-Objekt brauchst du nur ein einziges Mal (darauf rufst du dann
Code:
.nextInt()
zum Erzeugen der nächsten Zahl auf),
Code:
Math.random()
dagegen brauchst du immer, wenn du eine neue Zufallszahl brauchst.
 

Neue Themen


Oben