# Konstruktoren (Verständnisproblem)



## Trucka (25. Feb 2008)

Hallo Welt!

Ich habe letztens eine Informatik-Klausur geschrieben und es ist meines erachtens alles gut gelaufen. Jedoch sah der Lehrer das anders und hat mir bei einer Aufgabe mit Konstruktoren Punkte abgezogen, weil ich angeblich die Aufgabe nicht richtig verstanden hätte. Jetzt würde ich gerne von euch sehen, wie ihr das Programm zu der Aufgabe programmiert hättet. Damit ihr nicht voreingenommen seid, werde ich meine Lösung erst später posten.

Aufgabe 1:
Schreiben Sie eine Klasse Schiff, mit folgenden Eigenschaften:
Instanzvariablen: knoten (double), mitMotor (boolean)
Instanzmethode: fahren, Inhalt: Stringausgabe: z.B.: "Das Schiff faehrt vorwaerts!"
Klassenvariablen: anzahl (zählt alle Schiffobjekte)
Klassenmethode: moreSchiffe (Zählt die Anzahl der Schiffe jeweils um eins hoch)

Aufgabe 2:
Erzeuge Sie folgende Konstruktoren für die Klasse Schiff:

Konstruktor 1: ohne Parameter
Konstruktor 2: Übergabe des Herstellernamens als String
Konstruktor 3: Übergabe des Herstellernamens als String und PS-Zahl als Integer

Bei jedem neuen Schiffobjekt soll die Klassenvariable anzahl durch die Konstruktoren erhöht werden.


Schonmal vielen Dank für euere Antworten


----------



## Wildcard (25. Feb 2008)

Ist doch eindeutig. Poste deine Lösung, dann sieht man weiter.


----------



## maki (25. Feb 2008)

> Damit ihr nicht voreingenommen seid, werde ich meine Lösung erst später posten.


Kann ich nicht nachvollziehen, da die Lösung wirklich schon eindeutig in der Aufgabenstellung steht.

Würde sagen, dass einer von euch beiden (du oder dein Lehrer) die Aufgabe missverstanden haben.


----------



## Niki (25. Feb 2008)

```
public class Schiff{
  private double knoten = 0.0;
  private boolean mitMotor = false;

  private String hersteller = null;

  private int ps = 0;

  private static int anzahl = 0;

  public Schiff(){
    this(null);
  }

  public Schiff(String hersteller){
    this(hersteller, 0);
  }

  public Schiff(String hersteller, int ps){
    this.hersteller = hersteller;
    this.ps = ps;

    anzahl++;
  }

  public boolean isMitMotor(){
    return mitMotor;
  }

  public void setMitMotor(boolean b){
    mitMotor = b;
  }

  public void setKnoten(double d){
    knoten = d;
  }

  public boolean getKnoten(){
    return knoten;
  }

  public void fahren(){
    System.out.println("Das Schiff fährt vorwärts");
  }
}
```


----------



## Wildcard (25. Feb 2008)

Dir fehlt die moreSchiffe Methode. Diese solltest du vermutlich auch im Konstruktor aufrufen.


----------



## ARadauer (25. Feb 2008)

```
public static void moreSchiffe(){
	Schiff.anzahl++;
}

public static int anzahl(){
	return Schiff.anzahl;
}
```
dann wären wir komplett, vermut ich mal.

wobei ich insgeheim glaube, dass wir gerade eine hausübung gelöst haben ;-)


----------



## maki (25. Feb 2008)

Sollte moreSchiffe nicht private oder zumindest protected sein?

Schliesslich wird es doch nur vom Konstruktor aufgerufen.


----------



## Trucka (25. Feb 2008)

danke für eure antworten und NEIN es hat niemand meine hausübungen gelöst meine lösung war/ist


```
public class Schiff {
	double Knoten;
	boolean mitMotor;
	static int anzahl = 0;
	
	public Schiff() {
		anzahl++;
	}
	public Schiff(String hersteller) {
		anzahl++;
	}
	public Schiff(String hersteller, int ps) {
		anzahl++;
	}
	public void fahren() {
		System.out.println("Das Schiff faehrt vorwaerts");
	}
	public static void moreSchiff() {
		anzahl++;
	}
}
```

Das Problem bestand nämlich darin, dass in der zweiten Aufgabe stand, dass z.B. der hersteller als String übergeben werden soll. Jedoch stand da für mich nicht drin, dass ich dann den herstelllernamen auch an das Objekt übergeben soll. Aber anscheinend liege ich mit dieser Ansicht falsch, denn Wildcard hat es ja automatisch so gemacht. 
Trotzdem wäre es nett, wenn ihr noch eure Meinungen dazu abgebt.
Danke


----------



## maki (25. Feb 2008)

Solltest die konstruktoren Kaskadieren, wie im Beispiel von niki, somit hast du nur eine Baustelle an der die anzahl hochgezählt wird, und zwar wie gefordert über die Methode moreSchiffe() und nicht direkt mit anzahl++.


----------



## SlaterB (25. Feb 2008)

aha, dem Konstruktor einen String übergeben, der dort nicht genutzt und auch nicht abgespeichert wird..

sowas macht nirgendwo auf dieser Welt Sinn, weder in Programmiersprachen noch irgendwo anders 
(einen Koffer in den Kofferraum des Autos legen, der dort dann nicht drinbleibt)
das kannst du dir ein für allemal merken, das hat nichts mit dem Verstehen von Aufgabenstellungen zu tun


----------



## Trucka (25. Feb 2008)

Über Sinn lässt sich immer Streiten, für mich macht es nämlich auch keinen Sinn eine Informatik-Klausur, wo programmiert wird, aufm Zettel zu schreiben  :wink:


----------



## SlaterB (25. Feb 2008)

wenn du den Unterschied zwischen diesen beiden Sinns nicht siehst, dann gut Nacht


----------



## tuxedo (25. Feb 2008)

Wer auf dem "Zettel" fehlerfrei programmieren kann, kann wie ein compiler denken ;-)

Von daher ist die Übung gar nicht so verkehrt (auch wenn ich sie selbst gehasst habe). Und in diesem Fall, bzw. dieser Aufgabenstelung, war's ja nun wirklich nicht schwer.

btw: *slaterb zustimm*

- Alex


----------



## Janus (27. Feb 2008)

Niki hat gesagt.:
			
		

> ```
> public class Schiff{
> 
> public Schiff(){
> ...


konstruktorkaskadierung mit mehr als einem schritt sollte man vermeiden. besser ist es, sich auf einen hauptkonstruktor zu reduzieren.


----------

