# OOP, Konstruktor



## Ich (4. Jan 2011)

Hey! Ich bin im ersten Semester der OOP und habe eine Frage,die sich auf die Verwendung von Konstruktoren bezieht.
Ich habe eine Klasse Auto und eine Main. 
Nachdem ich das Aufgabenblatt soweit abgearbeitet habe und versch. Objekte (auto) erstellt habe, soll ich fuer die Klasse Auto weitere Attribute anlegen. Marke, Modell und ob es jeweils eine Klimaanlage hat.  Jetzt habe ich mir in der Klasse Auto einen Konstruktor ueberlegt, der fuer alle Attribute bei der Objekterzeugung Werte entgegennimmt.  Das habe ich auch getan, nur jetzt zeigt er mir in meiner Main bei Auto auto2 = new Auto (); "the constructor Auto() is undefined" an. Das war, bevor ich meinen Konstruktor geschrieben habe, der alle Attribute entgegennimmt allerdings noch nicht so. Woran liegt das und wie kann ich es aendern? Danke fuer eure Tipps!



```
public class Main {

	public static void main(String[] args) {

		Auto a1 = new Auto (); //neues Objekt erzeugt
		a1.Baujahr = 1963;
		
		Auto a2 = new Auto (); //neues Objekt erzeugt
		a2.Baujahr = 2010;
		
		a2=a1;
		//auto1 wird das Baujahr von auto2 zugewiesen
		
		System.out.println("Das Baujahr von dem ersten Auto lautet: " + a1.Baujahr);
		System.out.println();
		System.out.println("Das Baujahr von dem zweiten Auto lautet: " + a2.Baujahr);
		System.out.println();
		// auto1=1963, auto2=1963

		//a) + c)
		Auto auto1 = new Auto ();
		auto1.gibBaujahr = 2010;
		
		Auto auto2 = new Auto ();
		auto2.gibBaujahr = 2011;
		
		System.out.println("Ausgabe der Methode gibBaujahr:" + " " + auto1.gibBaujahr + " " + "und" + " " + auto2.gibBaujahr);
		System.out.println();
		
		auto1 = null;
		// null ist eine leere Referenz, die auf nichts zeigt
		
		//Ausgabe der statischen Methode
		System.out.println("Statische Methode,Referenzuebergabe:" + " " + Auto.getgibBaujahrVonAuto());
	
		Auto auto3 = new Auto();
		auto3.Baujahr = 2015;
		auto3.Marke = "Ford";
		auto3.Modell = "Focus";
		auto3.Klimaanlage = false;	
	}
}
public class Auto {

	public Integer Baujahr;	
	
	//c)
	public Integer gibBaujahr;
	
	public static int gibBaujahrVonAuto = 2055; 
	
	public static int getgibBaujahrVonAuto () {
	return gibBaujahrVonAuto;
	}
	
	public String Marke;
	
	public String Modell;
	
	public boolean Klimaanlage;
	
	public Auto ( int bauj, int gibBJ, String automarke, String automodell, boolean klimaanl) {
	
		Baujahr = bauj;
		gibBaujahr = gibBJ;
		Marke = automarke;
		Modell = automodell;
		Klimaanlage = klimaanl;
	}
}
```


----------



## Swoop (4. Jan 2011)

Der Konstruktor hat doch einige Parameter ? Diese solltest du beim Erzeugen des Konstruktors auch mitübergeben. 

Also es sollte irgendwie so aussehen

```
Auto a2 = new Auto ( 2001, 23, "Audi", "A8 3.0", true);
```


----------



## Suinos (4. Jan 2011)

Als Erklärung:

Solange eine Klasse keine Konstruktoren definiert, wird automatisch ein Standard-Konstruktor (no-arg constructor) eingefügt, welcher keine Parameter hat und nur den oberen Konstruktor aufruft, also quasi so:

```
public Auto()
{
	super();
}
```

Wenn du vorher also 
	
	
	
	





```
new Auto()
```
 aufgerufen hast, hast du diesen unsichtbaren Konstruktor verwendet.

Da du jetzt aber einen eigenen Konstruktor geschrieben hast, wird der Standard-Konstruktor nicht mehr erzeugt und der Compiler kann den Konstruktor 
	
	
	
	





```
Auto()
```
 nicht mehr finden -> Fehlermeldung.


----------



## Ich (4. Jan 2011)

Danke fuer deinen Tipp. Aber auch so aendert das nichts an meinem Fehler. 
Vielleicht hier mal meine Frage mit weniger Quellcode.

In der main wollte ich die Richtigkeit des Konstruktors aus der Klasse Auto mit der Erzeugung eines neuen Autos demonstrieren und dem Konstruktor hierbei sinnvolle Werte uebergeben. 

               Main :

```
Auto auto3 = new Auto ();
		auto3.Baujahr = 2015;
		auto3.Marke = "Ford";
		auto3.Modell = "Focus";
		auto3.Klimaanlage = false;
```
Konstruktor in der Klasse Auto:

public Auto ( int bauj, int gibBJ, String automarke, String automodell, boolean klimaanl) {


```
Baujahr = bauj;
		gibBaujahr = gibBJ;
		Marke = automarke;
		Modell = automodell;
		Klimaanlage = klimaanl;
```

Nun kommt eben in der Main der Fehler, dass der Konstruktor Auto() undefined ist. Reichen nicht diese Zeilen als Uebergabe?        
	
	
	
	





```
auto3.Baujahr = 2015;
		auto3.Marke = "Ford";
		auto3.Modell = "Focus";
		auto3.Klimaanlage = false;
```


----------



## VfL_Freak (4. Jan 2011)

Moin



Ich hat gesagt.:


> Nun kommt eben in der Main der Fehler, dass der Konstruktor Auto() undefined ist.



Hast Du ihn denn inzwischen in der Klasse AUTO deklariert ? ? 

gruß
Klaus


----------



## Ich (4. Jan 2011)

Ich weiss nicht, wie das geht...
In der Klasse AUTO ist doch mein Konstruktor um den es geht. 

```
public Auto (int bauj, int gibBJ, String automarke, String automodell, boolean klimaanl)
```
 Aber der stimmt doch eigtl so. Oder etwa nicht?
Muss ich nicht in der Main etwas an den Standardkonstruktoren aendern?
Denn da scheint er ja -->Dank an Suionos<< die Stand.konstr.nicht mehr zu finden und gibt die Fehlermeldung an.

Es tut mir Leid, wenn ihr bei mir mit all euren Hilfen bei 0 anfangen muesst


----------



## Landei (4. Jan 2011)

Ich hat gesagt.:


> ```
> public Auto (int bauj, int gibBJ, String automarke, String automodell, boolean klimaanl)
> ```



Dann musst du diese Werte auch *mitliefern*, nicht [c]new Auto();[/c] wie in deinem Beispiel weiter oben, sondern


```
Auto auto = new Auto (1984, 4711, "Sachsenring", "Trabant", false);
```


----------



## VfL_Freak (4. Jan 2011)

Moin,



Ich hat gesagt.:


> In der Klasse AUTO ist doch mein Konstruktor um den es geht.
> 
> ```
> public Auto (int bauj, int gibBJ, String automarke, String automodell, boolean klimaanl)
> ...



Sicher stimmt der so, aber Du nutzt ihn ja gar nicht 
Du rufst nur *"Auto()"* auf - und der ist jetzt halt nicht deklariert (genau das hat Dir Suinos schon erklärt)!

Also entweder deklarierst Du *"Auto()"* zusätzlich in Deiner Klasse "Auto" (dann kannst Du ihn benutzen) oder Du nutzt statt dessen besser gleich den o. g. Konstruktor und übergibst die Werte so wie in der Parameterliste vorgeben! 

Gruß
Klaus


----------



## Ich (4. Jan 2011)

Es funktioniert...
Danke an alle! :applaus:


----------



## Swoop (5. Jan 2011)

Landei hat gesagt.:


> Dann musst du diese Werte auch *mitliefern*, nicht [c]new Auto();[/c] wie in deinem Beispiel weiter oben, sondern
> 
> 
> ```
> ...



Genau das hab ich doch oben geschrieben ?! 

naja ^^ thema kannste noch auf gelöst stellen!


----------



## Landei (5. Jan 2011)

Du hattest einen Audi. Deren Zuverlässigkeit wird total überschätzt...

Nee, ich hatte den Eindruck, dass der TO deinen Beitrag überlesen hatte.


----------

