# Welche Klasse besitzt einen Standardkonstruktor ?



## Nudge (21. Nov 2007)

Ich bearbeite gerade eine Klausuraufgabe zum Thema Standardkonstruktor. Folgende Klassen sind vorgegeben:



```
class A
{
 double d;

 A()
 {
  d = 3.5;
 }

}

class B extends A
{
 B(double d)

 {
  this.d = d;
 }

}

class C extends B
{

 C(double d)
 {
  super(d);
 }

}
```

Die Frage dazu: welche dieser Klassen besitzt einen Standardkonstruktor - A, B oder C ?

Nun würde ich gerne Eure Meinung dazu wissen. Ich für meinen Teil, habe meine Antwort schon: keine der Klassen besitzt einen Standardkonstruktor !

Wollte aber zusätzlich Euren Rat dazu einholen.


----------



## SlaterB (21. Nov 2007)

meine Meinung ist A,

was ist deine DEFINITION eines Standardkonstruktors?!


----------



## mu (21. Nov 2007)

^^ das natürlich schwer jetzt, ich will deine hausaufgaben ned machen,  anderseits gibts über 100 beispiele mit dieser frage als übung. 

begründe pls wieso du nichts gewählt hast(geraten?)

- hab bei google 1. eintrag lösung gefunden btw.


----------



## RicoSoft (21. Nov 2007)

1. Schritt: Nachschauen, was ein Standardkonstruktor ist (Java Insel, Script der Vorlesung, XY Buch des Professors)
2. Schritt: richtige Antwort ankreuzen (wenn Du schon weisst, dass genau eine Klasse einen Default Konstruktor hat). Zudem sollte man die einfachen Grundlagen nicht vernachlässigen


----------



## Nudge (21. Nov 2007)

SlaterB hat gesagt.:
			
		

> meine Meinung ist A,
> 
> was ist deine DEFINITION eines Standardkonstruktors?!



Ich dachte auch zuerst an A. Aber streng genommen spricht man nur dann von einem Standardkonstruktor, wenn diesen der Compiler anlegt. Natürlich kann man den Standardkonstruktor überschreiben, aber dann ist es kein Standardkonstruktor mehr !

Hier mal ein Beispiel:


```
class A 
{ 
} 
 
class B extends A 
{ 
}
```


Der Compiler macht nun Folgendes, da kein expliziter Konstruktor definiert wurde:


```
class A 
{ 
  A()
 { 
    super();         // für Object() 
  } 
} 

class B extends A
{ 
  B()
 { 
    super();         // für A() 
  } 
}
```

Sobald ich einen eigenen Standardkonstruktor definiere, existiert der defaultmäßige nicht mehr.


----------



## Der Müde Joe (21. Nov 2007)

SlaterB hat gesagt.:
			
		

> was ist deine DEFINITION eines Standardkonstruktors?!



DIE Definition ist

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.9


----------



## SlaterB (21. Nov 2007)

nach DER Definition liege ich  falsch


----------



## mu (21. Nov 2007)

kurz gesagt, der defaultkonstruktor ist ein konstruktor ohne argumente.

in deinem beispiel ists also a


----------



## Körby (21. Nov 2007)

Ich hab die Definition nicht gelesen, hab aber auch keine Lust dazu.
Bin der Meinung, B und C haben einen Standartkonstruktor...

Grund:
Standartkonstruktor

```
B()
{
}
```

und 

```
C()
{
}
```

werden nicht überschrieben, sondern bekommen jeweils einen zweiten Konstruktor mit einem Übergabe Wert vom Typ double dazu.


----------



## tfa (21. Nov 2007)

Anonymous hat gesagt.:
			
		

> Ich hab die Definition nicht gelesen, hab aber auch keine Lust dazu.
> Bin der Meinung, B und C haben einen Standartkonstruktor...
> 
> Grund:
> ...



Konstruktoren werden niemals überschrieben. Was meinst Du mit Überschreiben?  Und was dazu kommt da auch nicht. Der Standardkonstruktor wird nur erzeugt, wenn kein anderer definiert wurde, und das ist hier nicht der Fall.


----------



## Nudge (21. Nov 2007)

RicoSoft hat gesagt.:
			
		

> 1. Schritt: Nachschauen, was ein Standardkonstruktor ist (Java Insel, Script der Vorlesung, XY Buch des Professors)
> 2. Schritt: richtige Antwort ankreuzen (wenn Du schon weisst, dass genau eine Klasse einen Default Konstruktor hat). Zudem sollte man die einfachen Grundlagen nicht vernachlässigen



Nur zur Info: ich bin selbst schon seit einigen Jahren Diplom-Informatiker  :bae:  Mir ist durchaus bewußt, was ein Standardkonstruktor ist. Wer sich allerdings mal die Mühe macht, etwas zu googlen, der findest schnell heraus, daß die Frage nicht so einfach zu beantworten ist. 

Die Frage ist doch: spricht man nur dann von einem Standardkonstruktor, wenn der Compiler diesen implizit anlegt (dann wäre es wohl ein Defaultkonstruktor) oder auch schon, wenn man einen eigenen "Standardkonstruktor" explizit definiert ?

Standardmäßig legt der Compiler bei Nichtvorhandensein eines Konstruktors implizit einen an, in der Form <Klassenname> () {}


----------



## Der Müde Joe (21. Nov 2007)

???:L  :shock: 

viel erfolg bei
B b = new B();


----------



## SlaterB (21. Nov 2007)

> Die Frage ist doch: spricht man nur dann von einem Standardkonstruktor, wenn der Compiler diesen implizit anlegt (dann wäre es wohl ein Defaultkonstruktor) oder auch schon, wenn man einen eigenen "Standardkonstruktor" explizit definiert ? 

diese Frage hat dann aber nix mit der Aufgabe zu tun, sondern könntest du so stellen,

außerdem ist diese Frage leicht behämmert, 'Standardkonstruktor' ist doch nur ein Wort, 
was sich jeder so hindefinieren kann wie er/ sie es will

wenn du keine Definition hast, dann ist die Frage sinnlos,
hast du dagegen eine, dann sollte es doch klar sein..


----------



## Nudge (21. Nov 2007)

Körby hat gesagt.:
			
		

> Ich hab die Definition nicht gelesen, hab aber auch keine Lust dazu.
> Bin der Meinung, B und C haben einen Standartkonstruktor...
> 
> Grund:
> ...



Sorry, sobald ich einen eigenen Konstruktor definiere (selbst, wenn dieser keine Parametrisierung aufweist), gibt es keinen Defaultkonstruktor seitens des Compilers mehr. Man kann auf diesen dann auch nicht mehr zugreifen. In diesem Fall muß man sich selbst eine Standardkonstruktor anlegen. Das ist dann aber nicht mehr der eigentliche Defaultkonstruktor !


----------



## ms (21. Nov 2007)

Nudge hat gesagt.:
			
		

> Standardmäßig legt der Compiler bei Nichtvorhandensein eines Konstruktors implizit einen an, in der Form <Klassenname> () {}


Und warum tut er das überhaupt?
Weil zum Erzeugen einer Instanz immer ein Konstruktor benötigt wird. Im einfachsten Fall eben ein Konstruktor der keine Argumente hat und nichts tut außer den Konstruktor der Superklasse aufzurufen.
Darum würde ich als Defaultkonstruktor oder Standardkonstruktor einen Konstruktor mit keinen Argumenten sehen.
Egal ob er vom Compiler oder vom Programmierer angelegt wird.

ms


----------



## Nudge (21. Nov 2007)

mu hat gesagt.:
			
		

> kurz gesagt, der defaultkonstruktor ist ein konstruktor ohne argumente.
> 
> in deinem beispiel ists also a



Falsch: das wäre eine Defaultkonstruktor seitens des Compilers: A() {}. Das hier ist ein expliziter Standardkonstruktor: A() { d = 3.5}


----------



## Jango (21. Nov 2007)

ms hat gesagt.:
			
		

> Darum würde ich als Defaultkonstruktor oder Standardkonstruktor einen Konstruktor mit keinen Argumenten sehen.
> Egal ob er vom Compiler oder vom Programmierer angelegt wird.


Und genau das ist falsch (rein terminologisch). Sobald du einen Konstruktor definierst, gibt es keinen Standartkonstrukter mehr. Es ist halt so...


----------



## Der Müde Joe (21. Nov 2007)

wenn man streng sein müsste:

If the class being declared is the primordial class Object, then the default constructor has an empty body.

also ne Klasse die nix extended (also A), hat einen Defaultkonstruktor mit einem leeren Körper.

Dabei würde A ausscheiden, denn da ist ja was drin.


----------



## ms (21. Nov 2007)

Jango hat gesagt.:
			
		

> rein terminologisch


 :toll: 

Wie wird denn der Standardkonstruktor im englischen bezeichnet?

ms


----------



## Körby (21. Nov 2007)

Hab das mit B() und C() mal getestet, also einen Defaultkonstruktor besitzen die wirklich nicht...


----------



## Nudge (21. Nov 2007)

ms hat gesagt.:
			
		

> Nudge hat gesagt.:
> 
> 
> 
> ...



Dann lies mal das Untenstehende. Demzufolge wird ein Defaultkonstruktor stets implizit angelegt, ein Standardkonstruktor nicht. Wenn der Aufgabensteller also den Unterschied zwischen "Defaultkonstruktor" und "Standardkonstruktor" kennt, ist die Antwort auf die gestellte Frage die Klasse A. Selbst wenn ich mir selbst einen Kontruktor der Form "A () {}" definiere, wäre es dann nicht mehr der Defaultkonstruktor. So, und jett soll mir nochmal jemand sagen, daß die Aufgabe trivial ist ...

"Allerdings ist auch diese Bezeichnung begrifflich nicht unbedingt treffend für einen parameterlosen Konstruktor, denn ein Vorgabekonstruktor (“default constructor ”) ist ein Konstruktor, der verwendet wird, wenn kein  Konstruktor explizit angegeben wurde. Um einen parameterlosen  Konstruktor zu bezeichnen sollte am besten die Bezeichnung parameterloser Konstruktor  verwendet werden und dies kann auch ein ausdrücklich notierter Konstruktor sein, der kein Vorgabekonstruktor ist. In Java  ist allerdings ein erzeugter Vorgabekonstruktor immer parameterlos, aber ein expliziter parameterloser Konstruktor ist kein Vorgabekonstruktor.

Ein Konstruktor mit Parametern kann als parametrisierter Konstruktor  bezeichnet werden."


----------



## Nudge (21. Nov 2007)

Jango hat gesagt.:
			
		

> ms hat gesagt.:
> 
> 
> 
> ...



Naja, streng genommen gibt es bei der Erzeugung eines eigenen Konstruktors keinen Defaultkonstruktor mehr. Du könntest Dir ja auch selbst einen Konstruktor der Art "A () {}" erzeugen. Das wäre dann ein Standardkonstruktor, aber kein Defaultkonstruktor mehr.


----------



## ms (21. Nov 2007)

Diese Diskussion betrifft nur mehr die Begrifflichkeiten.
Wie es funktioniert scheinen wir nun alle zu wissen.

Nochmal meine Frage: Wenn Defaultkonstruktor != Standardkonstruktor ist, wie ist dann die offizielle englische Bezeichnung für Standardkonstruktor?

ms


----------



## Jango (21. Nov 2007)

ms hat gesagt.:
			
		

> Jango hat gesagt.:
> 
> 
> 
> ...


Ich verstehe deine Frage nicht - was hat das mit dem
Thema zu tun? "Terminologie" ist die Gesamtheit aller Begriffe, ob nun englisch, deutsch, vietnamesisch, hinterindisch, oder meinetwegen auch polnisch.
Das ändert nichts an der Tatsache, dass es so ist, wie ich geschrieben habe.  :wink:


----------



## Nudge (21. Nov 2007)

ms hat gesagt.:
			
		

> Jango hat gesagt.:
> 
> 
> 
> ...



Dir kann geholfen werden:

Im Deutschen wird ein Konstruktor mit Parametern meist als allgemeiner Konstruktor  bezeichnet, der parameterlose Konstruktor wird auch Standardkonstruktor  genannt.

Diese Bezeichnungen können allerdings zu Mißverständnissen führen, sobald auch die englischsprachigen Bezeichnungen vorkommen, denn im Englischen ist mit “standard constructor ” nicht das gemeint, was im Deutschen als „Standardkonstruktor“ bezeichnet wird, sondern das, was im Deutschen als „allgemeiner Konstruktor“ bezeichnet wird, während das, was im Deutschen „Standardkonstruktor“ heißt, auf Englisch ein “default constructor ” ist.

uebliche Konstruktorbezeichnungen [Tabelle]

    "Englisch",                   "Deutsch".

    "default constructor",        "Standardkonstruktor". 
    "standard constructor",       "allgemeiner Konstruktor". 
    "general constructor",        "allgemeiner Konstruktor".


Die Bezeichnung „Standardkonstruktor“ ist vielleicht als Übersetzung von “default constructor ” entstanden. Da hier aber Verwechslungen mit “standard constructor ” möglich sind, empfiehlt Stefan Ram  statt dessen die Übersetzung „Vorgabekonstruktor“ für “default constructor ”, wenn man dann noch alle Bezeichnungen mit „Standard“ oder “standard ” vermeidet, ergeben sich nicht-mißverständliche Konstruktorbezeichnungen für den Vorgabekonstruktor und für Konstruktoren mit Parametern.

nicht-missverstaendliche Konstruktorbezeichnungen [Tabelle]

    "Englisch",                   "Deutsch".

    "default constructor",        "Vorgabekonstruktor". 
    "general constructor",        "allgemeiner Konstruktor".


----------



## Nudge (21. Nov 2007)

Körby hat gesagt.:
			
		

> Hab das mit B() und C() mal getestet, also einen Defaultkonstruktor besitzen die wirklich nicht...



Das ist auch absolut einleuchtend, da Du ja explizit einen Konstruktor definiert hast. Damit existiert dann kein Standardkonstruktor mehr.

Daher fallen die Antwortmöglichkeiten B und C komplett weg. Die Frage ist nur, was mit A ist ?


----------



## ms (21. Nov 2007)

> Ich verstehe deine Frage nicht - was hat das mit Thema zu tun? "Terminologie" ist die Gesamtheit aller Begriffe, ob nun englisch, deutsch, vietnamesisch, hinterindisch oder meinetwegen auch polnisch.
> Das ändert nichts an der Tatsache, dass es so ist, wie ich geschrieben habe.  :wink:



Wir meinen ja eh alle dasselbe, nur die Bezeichnung ist unterschiedlich, darum geht es letztendlich hier noch.

@Nudge
Danke

ms


----------



## ARadauer (21. Nov 2007)

also ich glaube wir sind uns einig, das die richtige antwort auf diese klausurfrage nur der lehrer geben kann. denn richtig in einer klausur ist das, was der lehrer als richtig ansieht.

ich würde jedoch sagen, wenn ein standard konstruktor ein konstruktor ohne Parameter ist, dann A
wenn ein standard konstruktor ein konstruktor ohne parameter ist der den konstruktor der superklasse aufruft, dann keine der gezeigten lösungen


----------



## mu (21. Nov 2007)

so wie ich die frage verstanden hab bleib ich trotzdem noch bei a


----------



## Jango (21. Nov 2007)

ARadauer hat gesagt.:
			
		

> dann keine der gezeigten lösungen


Genau. 
Die richtige Antwort ist: Keine der Klassen hat einen Standardkonstruktor.


----------



## ms (21. Nov 2007)

In dem Buch SCJP for Java 5 Study Guide von Kathy Sierra und Bert Bates steht folgendes:



> -) If you don't type a constructor into you class code, a default constructor will be automatically generated by the compiler.
> 
> -) The default constructor is ALWAYS a no-arg constructor.
> 
> -) A no-arg constructor is not necessarily the default (i.e., compiler-supplied) constructor, although the default constructor is always a no-arg constructor. The default constructor is the on the compiler provides! While the default constructor is always a no arg constructor, you're free to put in your own no-arg constructor.



Damit sollten jetzt alle Klarheiten beseitigt sein. 

Bin übrigens auch für Antwort A.

ms


----------

