# konstruktor = methode?



## MOEP_BIBER (28. Feb 2011)

Hey,

Frage steht schon im Titel:

Ist der Konstruktor an sich eine Methode?
Ich denke schon, will nur auf Nummer sichergehn und im Netz find ich nix.

MfG Biber


----------



## abcjk (28. Feb 2011)

Der Konstruktor ist eine besondere Methode.

Er legt neue Objekte von deiner Klasse an.
.
Die Unterschiede zur normalen Methode:

heißt genauso wie die Klasse also Großgeschrieben

wird mit new aufgerufen.

Bsp.:

es existiert eine Klasse Test, in der ein Konstruktor und die Methode print vorhanden sind.

Konstruktoraufruf:

Test t = new Test();

Methodenaufruf:

t.print();


----------



## MOEP_BIBER (28. Feb 2011)

alles klar danke =)


----------



## bibnew (28. Feb 2011)

Anweisungen in Konstruktoren werden immer mit der Objekterzeugung ausgeführt. Konstruktoren sind wie Methoden mit Parametern und ohne Rückgabe. Siehe new.


----------



## tfa (28. Feb 2011)

Laut JLS ist ein Konstruktor keine Methode. Obwohl Ähnlichkeiten da sind, sind die Unterschiede doch recht groß.


----------



## musiKk (28. Feb 2011)

Auf JVM-Ebene ist der Konstruktor wieder eindeutig eine Methode mit dem Namen _<init>_. Ist eine Frage der Sichtweise.


----------



## agent0013 (28. Feb 2011)

Hallo,
ich stehe wieder auf dem schlauch....
Hier ist noch eine aufgabe:

Es wäre schön eine Box zu erzeugen, die größer ist als eine gegebene Box. Schreiben Sie diese Methode:

    public Box groessereBox()

Das ist eine öffentliche Methode, die eine Referenz auf ein neues Box-Objekt zurückgibt. Die neue Box wird in jeder Dimension 25% größer sein als die alte Box. Die Methode wird einen Konstruktor verwenden müssen, um die neue Box zu erzeugen:

    public Box groessereBox()
    {

      return new Box( 1.25 * this.breite, ...... )
    }

Das Schlüsselwort this bezieht sich auf das Objekt, das diese Methode aufruft.

und hier ist mein Code:

```
class Box
{
	// Instanzvariablen
	private double laenge;
	private double breite;
	private double hoehe;

	// Konstruktoren
	public Box (double breite, double hoehe, double laenge)
	{
		this.breite  = breite;
		this.hoehe   = hoehe;
		this.laenge  = laenge;
	}
.
.
.
```

ich verstehe nicht,welche unterschied gibts zwischen obere und untere "public Box groessereBox()"
oder sind die gleiche??und wie soll ich den Konstruktor schreiben??
danke


----------



## Volvagia (28. Feb 2011)

Das obere ist eine Methode, welches eine neue Instanz von Box generiert, und sie zurückgibt. Dabei greift es auf die Variablen der 'alten' Instanz, also der in der die Methode aufgerufen wird zu.







Unten steht nur der Konstruktor, der mit der Methode garnichts gemeinsam hat.


----------



## agent0013 (28. Feb 2011)

Theoretisch weiß ich auch wie es funktioniert,aber praktisch realisiere ich es irgendwie nicht.. 

ich muss also schreiben:

```
// Konstruktoren
        public Box groessereBox();
	{
		return new Box (1.25 * this.breite, 1.25 * this.hoehe, 1.25 * this.laenge);
	}
```

und dann kommt die Methode noch:

```
public Box groessereBox();
```

oder??


----------



## Volvagia (28. Feb 2011)

Das ist eine Methode, und kein Konstruktor. Ein Konstruktor hat keinen Rückgabewert (gesehen von der Aufrufsicht gibt er 'this' zurück), hat immer die Bezeichnung der Klasse (außer bei package protected Klassen, aber dann ist er unbrauchbar) und kann außerdem nur indirekt per new oder aus einen anderen der selben Klasse per this oder einer subklasse per super aufgerufen werden. Eine Methode hat einen Rückgabewert oder das reservierte Wort 'void' für keinen, einen beliebigen Namen und kann von überall aufgerufen werden, was die Sichtbarkeit zulässt.


----------



## agent0013 (28. Feb 2011)

das hab ich auch gedacht,das es kein Konstruktor ist..   
aber wenn ich es als Methode benutze,da kommt eine Fellermeldung:

BoxTester.java:62: missing method body, or declare abstract
	public Box groessereBox();
	           ^
BoxTester.java:64: return outside method
		return new Box (1.25 * this.breite, 1.25 * this.hoehe, 1.25 * this.laenge);
		^
2 errors

was fehlt da noch oder was ist falsch?


----------



## Illuvatar (28. Feb 2011)

agent0013 hat gesagt.:


> was ist falsch?



Der Strichpunkt:


> // Konstruktoren
> public Box groessereBox();
> {
> return new Box (1.25 * this.breite, 1.25 * this.hoehe, 1.25 * this.laenge);
> }


muss weg.


----------



## agent0013 (28. Feb 2011)

Der Strichpunkt.. so eine kleinigkeit und muss man so lang denken.. :shock:
Das funktioniert erst mal,aber jetzt wie rufe ich die methode auf?
ist es so richtig:


```
void anzeige()
	{
		System.out.println(groessereBox());
	}
```
danach kommt noch so ähnliche ausgabe:
>javac *.java
>Exit code: 0
>java -cp . BoxTester

Box@19821f

>Exit code: 0


----------



## agent0013 (28. Feb 2011)

Ich glaube heute reichts mir. muss morgen weiter machen..  
danke euch für eure Tipps!!


----------



## agent000 (28. Feb 2011)

groessereBox ist eine Objektmethode, die eine Instanz der Klasse Box zurück gibt. Also ist ist die Methode kein Konstruktor. Meist werden Instanzen von Klassen in anonymen statischen Methoden (Fabrikmethoden) erstellt und zurückgegeben, innerhalb von Objektmethoden ist das eher selten.

Wird System.out.println() mit einem Objekt aufgerufen, wird toString() auf dem Objekt aufgerufen und das Ergebnis ausgegeben. Das Ergebnis ist, wenn toString() nicht überschrieben wurde, eine kryptischer, alphanumerischer Name. Siehe toString() in API.


----------



## agent0013 (1. Mrz 2011)

Sorry, aber das hab ich nicht wirklich verstanden.. ???:L


----------



## Volvagia (1. Mrz 2011)

groessereBox gibt eine Box-Instanz zurück, ein Konstruktor garnichts, der wird einfach nur aufgerufen wenn du mit new eine neue Instanz anlegst, oder eine Subklasse angelegt wird. Mit der Fabrikmethode meint er soetwas wie BorderFactory.createBevelBorder(), eben eine statische Methode. Alternativ wird das, was du hast öfters als eigener Konstruktor (Copy-Konstruktor) angelegt. Dabei bleiben die Daten aber idR. unverändert, eben nur um zu kopieren. Dabei schwärmen die einen aber dafür, die anderen sind total abgeneigt. Ich habe dabei aber selbst noch nie einen wirklich großen Grund gesehen, ihm zu verwenden oder abzulehnen, ich selbst überschreibe eigendlich fast immer nur die Methode clone().

Der 2. Absatz ist ganz einfach erklärt, wenn du System.out.print/ln(Object obj) aufrufst, wird der String, den du bei instance.toString() zurückbekommst ausgegeben. Das ist standartgemäß der Klassenname @ Hash. Eine Verwendung dafür kenne ich aber nicht, ist vielleicht auch nur so eine art Platzhalter.

Ich selbst hatte zwar nie einen Lehrer, aber bei dem was ich alleine in den letzten 3 Tagen hier gelesen habe, habe ich das Gefühl, das entweder die Lehrer keinen Bock haben euch was beizubringen, oder ihr Informatikschulen besucht, aber eigendlich keine Lust habt etwas zu lernen. Nicht persönlich nehmen, ist nur mein Eindruck.


----------



## agent000 (1. Mrz 2011)

agent0013 hat gesagt.:


> Sorry, aber das hab ich nicht wirklich verstanden.. ???:L



Du postest auch nicht den ganzen Quelltext oder die Aufgabenstellung, sondern nur Abschnitte - und das, was es zu erklären gilt, muss man sich aus Fehlermeldungen usw. zusammensuchen.

Eine Box hat die Werte Breite, Höhe und Länge und soll um 25% vergrößert werden. Eigentlich schreibt man dann eine Methode, die die Box vergrößert. Wenn man dann zwei Boxen benötigt, kopiert man die erste Box und ruft auf der neuen zweiten Box die Vergrößerungsmethode auf. Deine Methode hingegen aber kopiert quasi die Box und gibt eine vergrößerte neue zurück.

Ein Konstruktor ist die Methode dennoch nicht, IMHO, auch wenn sie eine neue Box mit den um 25% vergrößerten Werten der alten Box erzeugt und zurückgibt.

Konstruktoren haben eine eindeutige Form:
Zugriffsmodifier NameDerKlasse (Parameter) { Anweisungen }

Mehrere Konstruktoren einer Klasse sind nur dann gültig, wenn sie sich in Parametertyp und/oder Parameteranzahl unterscheiden.


----------



## Andi_CH (1. Mrz 2011)

Lieber TO - poste doch einfach mal kompilierbaren Code!



Volvagia hat gesagt.:


> Ich selbst hatte zwar nie einen Lehrer,


???:L Nie zur Schule gegangen?



Volvagia hat gesagt.:


> aber bei dem was ich alleine in den letzten 3 Tagen hier gelesen habe, habe ich das Gefühl, das entweder die Lehrer keinen Bock haben euch was beizubringen, oder ihr Informatikschulen besucht, aber eigendlich keine Lust habt etwas zu lernen.


Lernen? Was ist das? 

Mein ganz persönlicher Eindruck ist, dass die Grundhaltung der heutigen Lernenden in etwa so ist, dass die Lehrer die verdammte Pflicht und Schuldigkeit haben ihnen etwas beizubringen und wenn die das nicht schaffen sind die selbst schuld. Demzufolge ist aber die Bezeichnung "Lernende" falsch - "Auszubildende" passt besser - die müssen ausgebildet werden.
Die Aktivität hat also immer bei den Ausbildnern / Lehrern zu liegen - so die weit verbreitete Meinung.


Die Erfahrung von Lehrern ide ich kenne und meine eigene (ich hab tatsächlich Abendkurse gegeben) ist schon die, dass viele nicht wirklich etwas zum Erfolg dazu beitragen wollen und das führt dann dazu, dass auch die Lehrer nicht wirklich motiviert sind. (Bzw. wie in meinem Fall aufhören Kurse zu geben)

KEIN Lehrer kann irgendjemandem etwas beibringen - er kann nur beim Lernen helfen.

Ich frage mich nur, wer für untaugliche Stoffpläne verantwortlich ist - da wird der schwarze Peter im Kreis herumgeschoben.



Volvagia hat gesagt.:


> Nicht persönlich nehmen, ist nur mein Eindruck.


dito (aber nur weil man das aus Höflichkeit so sagt und denken darf ich ja was ich will)


----------



## agent0013 (1. Mrz 2011)

Hallo, 
ich hab eure Kommentare gelesen und will euch danke sagen.

erstens,ich bin anfänger und mache alles allein.ich hab niemand,wen ich was fragen kann und wer mir irgendwie helfen kann.Aslo persönlich nehme ich nichts..
zweitens,hier ist mein Code:

```
class Box
{
	// Instanzvariablen
	private double laenge;
	private double breite;
	private double hoehe;

	// Konstruktoren
	public Box (double breite, double hoehe, double laenge)
	{
		this.breite  = breite;
		this.hoehe   = hoehe;
		this.laenge  = laenge;
	}
	public Box (double seite)
	{
		breite  = seite;
		hoehe   = seite;
		laenge  = seite;
	}
	
	// Methoden
	public double berechneFlaeche()
	{
		return 	2 * (breite*hoehe + laenge*hoehe + breite*laenge);

	}
	public double berechneVolumen()
	{
		return breite * hoehe * laenge;
	}
	public Box groessereBox()
	{
		return new Box (1.25 * this.breite, 3.125 * this.hoehe, 1.5 * this.laenge);
	}
	void anzeigen()
	{
		System.out.println("Laenge: " + laenge + 
					" Hoehe: " + hoehe + 
					" Breite: " + breite);
	}
}

class BoxTester
{

	public static void main (String[] args)
	{

		// eine Box mit den Seiten 2.5, 5.0 und 6.0 erzeugen

		Box box = new  Box(5.0,2.5, 6.0);

		System.out.println("Flaeche: " + box.berechneFlaeche() +
					"  Volumen: " + box.berechneVolumen());
		
		box.anzeigen();
		System.out.println(box.groessereBox());
	}
}
```

oben steht,daß groessereBox() eine Methoe ist.ok und ich will diese Methode aufrufen.ist das nicht richtig,wenn ich es einfach mit System.out.println() mache?
vlt könnte jemand einfach kurz ein Code schreiben,ich weiß,daß hier nur eine kleinigkeit fählt und komme einfach nicht drauf..
danke..


----------



## xehpuk (1. Mrz 2011)

Was möchtest du denn nun genau machen? Die Maße deiner größeren Box auf der Konsole sehen? Das würdest du bei deinem Code dann so machen:
[JAVA=58]box.groessereBox().anzeigen();[/code]

Besser wäre es jedoch, wenn 
	
	
	
	





```
anzeigen()
```
 einen String zurückgeben würde. So bist du flexibler, indem du den Text dann auch woanders als nur auf die Standardausgabe bringen kannst.

[JAVA=36]    String anzeigen()
    {
        return ("Laenge: " + laenge + 
                    " Hoehe: " + hoehe + 
                    " Breite: " + breite);
    }
[/code]
Nun kannst du es so ausgeben lassen:
[JAVA=58]System.out.println(box.groessereBox().anzeigen());[/code]
Am besten noch gleich die 
	
	
	
	





```
toString()
```
 überschreiben.

```
@Override
public String toString() {
    return "Box [" + anzeigen() + "]";
}
```
So reicht dann auch dieser Aufruf:
[JAVA=58]System.out.println(box.groessereBox());[/code]

Beim zweiten Konstruktor kannst du redundanten Code sparen.
[JAVA=15]    public Box (double seite)
    {
        this(seite, seite, seite);
    }
[/code]


----------



## agent0013 (1. Mrz 2011)

das war jetzt die beste antwort.   danke dir


----------



## Volvagia (1. Mrz 2011)

Andi_CH hat gesagt.:


> ???:L Nie zur Schule gegangen?


Das war jetzt auf Java bezogen. ^^

Meiner Erfahrung nach ist es aber schon teilweise anders. Beispielweiße, wenn wir einen "guten" Lehrer hatten, der sich auch um die Schüler gekümmert hat, hatten wir am Ende des Schultages alle nötigen Informationen mitgenommen, für Test mussten wir nie explizit lernen. Bei anderern Lehrern die sich um die Schüler nicht wirklich gekümmert haben, mussten wir ständig für Test lernen. Also ich glaube schon, dass es stark von dem Lehrer abhängt.

Vor kurzen hat hier z. B. soweit ich mich errinnere geschrieben, dass er per JOptionPane eine Zahl abfragen soll, und behauptet, er hat noch kein for gelernt. ???:L

Und es war wirklich nur meine Meinung, bezog sich ja nicht nur auf ihm (bzw. da er ja keine Schule/Kurs besucht überhaupt nicht), es wundert mich einfach.


----------



## agent000 (1. Mrz 2011)

agent0013 hat gesagt.:


> das war jetzt die beste antwort.   danke dir



Es ist aber sinnlos, eine Instanz zu erstellen, nur um ihre Werte auszugeben. Und es ist sinnvoller, toString() zuerst so zu überschreiben, dass ein gehaltvoller String zurückgegeben wird, auf dem in anzeigen() Bezug genommen wird. Nicht umgekehrt. Außerdem sollte die Stringkonkatenation mit + vermieden werden.


----------



## maki (1. Mrz 2011)

agent000 hat gesagt.:


> Es ist aber sinnlos, eine Instanz zu erstellen, nur um ihre Werte auszugeben. Und es ist sinnvoller, toString() zuerst so zu überschreiben, dass ein gehaltvoller String zurückgegeben wird, auf dem in anzeigen() Bezug genommen wird. Nicht umgekehrt. Außerdem sollte die Stringkonkatenation mit + vermieden werden.


Bei toString gebe ich dir recht, Stringkonketation mit + ist allerdings etwas was man nicht unbedingt vermeiden sollte (ausser in Schleifen), ist ein Uralter Mythos den man nicht noch weiterverbreiten sollte


----------



## agent000 (1. Mrz 2011)

maki hat gesagt.:


> ist ein Uralter Mythos



Das die Stringkonkatenation nicht effizient ist, ist kein Mythos oder Hexerei bzw. Übernatürliches...


----------



## maki (1. Mrz 2011)

agent000 hat gesagt.:


> Das die Stringkonkatenation nicht effizient ist, ist kein Mythos oder Hexerei bzw. Übernatürliches...


Doch, genau das ist es, und auch noch falsch dazu.

Wenn Leute mal einen Profiler nutzen und damit messen würden anstatt sich auf theoretische Falschannahmen zu berufen wäre das kein Thema mehr.

Hier wird erklärt warum: Becoming a Better Programmer: A Conversation With Java Champion Heinz Kabutz

Hier ist einer auf den alten Mythos reingefallen und aht sich ganz schön blamiert:
A Better StringBuilder | Javalobby
Seine "Performanceverbesserung" mit StringBuilder war nur 6 mal langsamer... *g*

Das Netz ist übrigens voll von echten tests, das Thema ist uralt, einfach mal suchen und weniger Gerüchte verbreiten


----------



## agent000 (1. Mrz 2011)

Oh, jetzt fühlt sich jemand besonders stark. Hier ein anderes Zitat:


> Die Klasse StringBuffer
> 
> Diese Klasse realisiert Objekte, die wie Strings ebenfalls Zeichenketten darstellen. Allerdings sind die Objekte dieser Klasse veränderlich, wodurch sie String-Manipulationen wesentlich effizienter durchführen können. Dadurch wird erreicht, dass weniger String-Objekte erzeugt werden müssen, um einen neuen String aus verschiedenen Teilen zusammenzusetzen. Objekte der Klasse StringBuffer besitzen z.B. verschiedene Varianten einer Methode append(), mit der ein gegebener Wert (ein String oder der ein Wert eines primitiven Typs) an den bisherigen Wert angehängt werden kann.


 Programmierkurs Java: Strings ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

Ist zwar nicht "from the Source" ist inhaltlich dennoch nicht falsch.


----------



## maki (1. Mrz 2011)

> Oh, jetzt fühlt sich jemand besonders stark. Hier ein anderes Zitat:


Das liegt daran dass ca. alle paar MOnate ein Anfänger hier vorbeikommt und meint er müsste etwas falsches predigen (was er irgendwo mal gelsene/gehört hatte und meistens auch nich missverstanden), hatten hier auch genug Diskussion inkl. Messungen im Forum, da hilft kein Link zu offensichtlich falschen Aussagen 

Solltest meine Posts nicht persönlich nehmen, wenn etwas falsch ist, dann sage ich das, und wie gesagt, diese falsche Aussage(String + vermeiden) ist sehr alt, aber deswegen nicht richtig.
Musst mir auch nicht glauben, einfach selber nachmessen


----------



## agent000 (1. Mrz 2011)

maki hat gesagt.:


> Hier wird erklärt warum: Becoming a Better Programmer: A Conversation With Java Champion Heinz Kabutz



Zudem ist es auch ein Unterschied, ob ich als Argument übergebe String-Objekte konkatenieren will oder String-Literale, die sich innerhalb einer Methode befinden. Hast du nicht passendere Beispiele für "deine" Behauptungen?


----------



## maki (1. Mrz 2011)

agent000 hat gesagt.:


> Zudem ist es auch ein Unterschied, ob ich als Argument übergebe String-Objekte konkatenieren will oder String-Literale, die sich innerhalb einer Methode befinden. Hast du nicht passendere Beispiele für "deine" Behauptungen?


Wenn du den Artikel gelesen hättest dann wüsstest du dass der Compiler bereits aus String + einen StringBuilder baut, ein "Problem" gibt es nur in Schleifen, da der Compiler nicht errät wann er einen StringBuilder weiterverwenden dürfte anstatt neuen StringBuilder zu erzeugen.

Die Sache ist die: Ich muss dir nix beweisen, könntest den Wahrheitsgehalt gleich selber überprüfen anstatt hier zu diskutieren, ich werde aber deine falschen behaupten hier nciht so stehen lassen nur weil du Beratungsresistent bist, geht auch nicht nur dir so hier.


----------



## abcjk (1. Mrz 2011)

Hallo,

ich hab deinen Code so abgeändert, dass er meiner Meinung nach funktionieren müsste. Aber Achtung ich hab ihn nicht compeliert und ausprobiert.


```
// Immer die Sichtbarkeit dazuschreiben. Hat den Vorteil, dass du selber immer sicher weißt welche Sichtbarkeit die Klasse, Methode gerade hat.
public class Box
{
    // Instanzvariablen
    private double laenge;
    private double breite;
    private double hoehe;
 
    // Konstruktoren
    public Box (double breite, double hoehe, double laenge)
    {
        this.breite  = breite;
        this.hoehe   = hoehe;
        this.laenge  = laenge;
    }

    public Box (double seite)
    {
        breite  = seite;
        hoehe   = seite;
        laenge  = seite;
    }
    
    // Methoden
    public double berechneFlaeche()
    {
        return  2 * (breite*hoehe + laenge*hoehe + breite*laenge);
 
    }
    public double berechneVolumen()
    {
        return breite * hoehe * laenge;
    }
    public Box groessereBox()
    {
        return new Box (1.25 * this.breite, 3.125 * this.hoehe, 1.5 * this.laenge);
    }
    
    //void anzeigen()
   // Deine Box soll immer wenn sie ausgegeben wird in der Form erscheinen, das geht am Einfachsten in dem du toString                       //überschreibst, das wird automatisch aufgerufen, wenn du System.out.print oder System.out.println benutzt, dadurch hast du   //weniger Methodenaufrufe.

    public String toString()
    {
        return ("Laenge: " + laenge + 
                    " Hoehe: " + hoehe + 
                    " Breite: " + breite);
    }
}
```


```
// in einer eigenen Klasse bitte nicht in die gleiche java Datei schreiben
public class BoxTester
{
 
    public static void main (String[] args)
    {
 
        // eine Box mit den Seiten 2.5, 5.0 und 6.0 erzeugen
 
        Box box = new  Box(5.0,2.5, 6.0);
 
        System.out.println("Flaeche: " + box.berechneFlaeche() +
                    "  Volumen: " + box.berechneVolumen());
       
       // Hier wird automatisch toString aufgerufen
        System.out.println(box);
        
        // Hier wird die größere Box auch mittels toString ausgegeben
        System.out.println(box.groessereBox());
    }
}
```

Ich hoff der Code läuft, hab ihn wie gesagt nicht ausprobiert

Viele Grüße


----------



## abcjk (1. Mrz 2011)

Hallo,

es tut mir Leid ich hab xehpuk Antwort weiter oben nicht gesehen. Er erklährt die Sachen viel besser wie ich.

Viele Grüße


----------



## Melin (30. Jun 2012)

Das Thema ist eigentlich längst nicht mehr aktuell dennoch habe ich hier ein paar Fragen:
Warum wird hier der Konsruktor this gesetzt 

```
public Box groessereBox()
    {
        return new Box (1.25 * this.breite, 3.125 * this.hoehe, 1.5 * this.laenge);
    }
```

und hier nicht

```
public double berechneFlaeche()
    {
        return  2 * (breite*hoehe + laenge*hoehe + breite*laenge);
 
    }
    public double berechneVolumen()
    {
        return breite * hoehe * laenge;
    }
```


----------



## njans (30. Jun 2012)

Das macht, soweit ich das jetzt aus dem Code ersehen kann, keinen Unterschied ob du da this oder eben nicht verwendest. Es gibt keine anderen Variablen, die überlagert werden.


----------

