# Konstruktor ohne Parameter



## abc (15. Aug 2007)

Hallo,

ich habe ein Konstruktor Auto 

```
class Auto {
int ps;
String farbe;
String modell;
String kennzeichen
int  erstzulassung;
boolean gebraucht;

public Auto
{
}


}
```


was passiert, wenn ich in dem Konstruktor folgendes mache:


```
public Auto
{
    this.ps = ps;
    this.farbe = farbe;
    this.kennzeichen = kennzeichen;
    this.erstzulassung = erstzulassung;
    this.gebraucht = gebraucht;
}
```

habe ich damit einen leeren Konstruktor erzeugt? Und was passiert, wenn der KOnstruktor aufgerufen wird?
wenn ich das Objekt benutzen will, kann ich das mit set-Methoden machen?

Bsp:

```
public void setFarbe(String farbe)
	{
		this.farbe = farbe;
	}
```

oder ist das ganz falsch? was passiert, wenn ich in dem Konstruktor this.x=x eingebe? Konstruktor hat ja dann immernoch keine Parameter oder? Wo ist der Unterschied zu 

```
public Auto (int ps; String farbe, String modell, String kennzeichen)
{
   this.ps=ps;
   this.farbe = farbe;
   usw...
}
```


----------



## SlaterB (15. Aug 2007)

> habe ich damit einen leeren Konstruktor erzeugt? 

ja

> Und was passiert, wenn der KOnstruktor aufgerufen wird? 

dann wird er ausgeführt?!

> oder ist das ganz falsch?

nein

> was passiert, wenn ich in dem Konstruktor this.x=x eingebe?

dann wird x x zugewiesen, komt darauf an, ob es eine lokale Variable/ Parameter x gibt, der/ die die Exemplarvariable überlagert

> Wo ist der Unterschied zu 

mal gibts Parameter, mal nicht, das ist der Unterschied


----------



## Gast2 (15. Aug 2007)

> Wo ist der Unterschied

Der Unterschied ist einfach mit einem leeren Konstruktor hat dein Objekt keine  Informationen, da es leer ist

und mit Parameter kannst du dein Objekt befüllen und bruachst nicht alles mit den set methoden zu machen


----------



## abc (15. Aug 2007)

Noch eine Frage:

ich habe ja Klasse Auto, die  so aussieht:

```
class Auto { 
int ps; 
String farbe; 
String modell; 
String kennzeichen 
int  erstzulassung; 
boolean gebraucht; 

public Auto 
{ 
} 


}
```

wenn ich jetzt schreibe:

```
public Auto ()
{ 
    this.ps = ps; 
}
```

wird alles gelb unterstrichen(benutze eclipse) und da steht noch folgendes: "The assignment to variable ps has no effect"

Also meine Frage:
Kann ich die Klasse so lassen (so wie ganz oben steht) und wenn ich den Konstruktor brauche, die Parameter dann mit set-Methoden setzten?
So zb:

```
public Auto ()
{ 
    this.ps = ps; 
}

public void setPs(String ps)
{
    this.ps=ps;
}
```

bin im moment ein wenig  verunsichert, mache seit montag ein praktikum und eigentlich wollte ich das ganze so machen:

```
public Auto (int ps, String farbe, String modell, String kennzeichen, String  erstzulassung;  )
{ 
    this.ps = ps; 
    this.farbe = farbe;
   usw.....
}

public Auto()
{  
   this(0, "", "", "", "")
}

}
```

mir wurde aber gesagt, dass das keine gute lösung ist, weil es so viele parameter gibt (ca. 20)
und nun weiss ich nicht weiter, was gibt es denn für eine alternative? (ist meine erste praktische erfahrung mit java)
danke für eure hilfe


----------



## abc (15. Aug 2007)

@SirWayne
habe deine antwort erst jetzt gesehen und meine frage schon abgeschickt, kannst du mir vielleicht erklären, warum mein praktikumsbetreuer die lösung mit den parametern nicht gut findet? seine antwort war wie gesagt, zu viele parameter,lieber set-methoden oder ist das einfach eine geschmacksfrage?


----------



## abc (15. Aug 2007)

und schon wieder ich

noch ein bsp:

```
public Auto 
{ 
    this.ps =0;
    this.farbe = "";
    this.modell = "";   
}
```

was passiert denn hier? wird hier ein leeres objekt erzeugt? der konstruktor selbst ist ja nicht mehr leer, oder?
kreiert hier der konstruktor autos mit ps, farbe, modell, usw und diese bekommen dann mit set-methoden einen wert?
sind ps, farbe und modell in diesem fall parameter?

danke!


----------



## Guest (15. Aug 2007)

abc hat gesagt.:
			
		

> @SirWayne
> habe deine antwort erst jetzt gesehen und meine frage schon abgeschickt, kannst du mir vielleicht erklären, warum mein praktikumsbetreuer die lösung mit den parametern nicht gut findet? seine antwort war wie gesagt, zu viele parameter,lieber set-methoden oder ist das einfach eine geschmacksfrage?



Dazu solltest Du dir mal das Thema Refactoring durchnehmen. Habe ein schickes Buch auf englisch, da sind so programmiertechnische Todsünden drin. Eine Totsünde ist, zu viele Parameter.


Gruß


----------



## SlaterB (15. Aug 2007)

> sind ps, farbe und modell in diesem fall parameter? 


nein, feste Werte,

```
public Auto 
{ 
    this.ps =0; 
    this.farbe = ""; 
    this.modell = "";    
}
```
ist gleichbedeutend mit

```
public Auto 
{ 
} 

Auto auto = new Auto();
auto.setPS("0");
usw.
```

----------


```
public Auto () 
{ 
    this.ps = ps; 
}
```
macht dagegen keinen Sinn und wird zurecht von Eclipse bemeckert,
was soll this.ps = ps; denn dort bringen deiner Meinung nach?
schreibe nie Code, wenn du dessen Bedeutung nicht kennst

>  warum mein praktikumsbetreuer die lösung mit den parametern nicht gut findet? 

Ansichtssache, vielleicht zu unübersichtlich,
kannst du ihn nicht selber fragen?


----------



## Guest (15. Aug 2007)

abc hat gesagt.:
			
		

> und schon wieder ich
> 
> noch ein bsp:
> 
> ...




Du sollest Dir mal Grundlagern der Objektorientierten Programmierung durchlesen.
Und mal schauen wofür ein Konstruktor da ist.

ps, farbe und modell sind die Eigenschaften deiner Klasse.
Ihnen werden wir im Konstruktor üblich Werte zugewiesen, dafür ist der Konstruktor da.
Dieser Vorgang nennt sich auch Initialisierung.


Gruß


----------



## abc (15. Aug 2007)

also ist 

```
public Auto 
{ 
    this.ps =0; 
    this.farbe = ""; 
    this.modell = "";    
}
```

gleichbedeutend mit 


```
class Auto { 
int ps =0; 
String farbe = null; 
String modell= null; 
String kennzeichen =null; 
int  erstzulassung = null; 
boolean gebraucht = true; 

public Auto 
{ 
} 

}
```

???


----------



## SlaterB (15. Aug 2007)

abgesehen davon, dass 
this.farbe = ""; und farbe = null; 
ein deutlicher Unterschied ist,
sind direkte Zuweisungen an Exemplarvariablen ziemlich ähnlich, ja


----------



## abc (15. Aug 2007)

und nun meine letzte frage:
wo ist denn der unterschied zwischen
this.farbe = ""; und farbe = null; 
???

im ersten fall heisst es ja, dass fabre existiert, aber ein leerer string ist und im zweiten fall heisst es, dass es noch gar keine frabe gibt?


----------



## abc (15. Aug 2007)

oder anders ausgedruckt
String farbe = null; => farbe hat überhaupt noch keinen wert (bedeutet das auch noch kein speicherplatz steht zur verfügung?)

String farbe = ""; => farbe hat einen wert und zwar den leeren string(hat speicherplatz und dieser ist mit "" belegt?)

danke!


----------



## SlaterB (15. Aug 2007)

ja, damit hast du es doch selber gesagt?
inhaltlich mag der Unterschied nicht so groß sein,

aber wenn dir bald NullPointerExceptions um die Ohren fliegen,
wirst du wissen, dass es schon ein Unterschied ist, ob ein Objekt da ist oder gar nix, die pure Leere

edit: 
farbe ist immer nur eine Referenz von 4 Byte, entweder zeigt diese Referenz auf nichts, oder auf ein beliebiges String-Objekt,
ob das leer ist ("") oder 1000 Zeichen enthält ist relativ egal für farbe, das ist einfach nur eine Referenz


----------



## schuetzejanett (15. Aug 2007)

Na da hast du doch deinen Unterschied. Probleme gibt es aber wenn du auf die Farbe zugreifst und sie null ist. Denn dann kommt es zu einer nullpointer exception.


----------



## abc (15. Aug 2007)

danke, habe es endlich verstanden!


----------

