main()-Konstruktor überschreiben / überladen

Status
Nicht offen für weitere Antworten.

Mesqualito

Mitglied
Habe mir Alexander Niemanns "Objektorientierte Programmierung in Java" vorgeknöpft.

Die Anleitung:

Ich habe die Klasse 'Auto'.
In der "Standard-Methode" main() wird eine Variable festgesetzt:
Code:
 public static int anzAutos = 0;

Die main()-Methode (der Standard-Konstruktor) soll überschrieben werden.
Ganz klar, mit dem Name des Konstruktors = Name der Klasse.

Da steht nun drin:
Code:
public Auto()
{
    anzAutos++
}

Auch gut: es wird, da Überschreibung, beim Aufruf der Methode 'Auto()' in einer Instanz nun nicht mehr main() (also 'public static int anzAutos = 0') aufgerufen, sondern 'anzAutos++'.

Jetzt gibt es aber noch die Überladung:

Code:
public Auto(String kBez, short kGeschw, short kPlaetze)
{
    // Definition der o.g. Variablen
   anzAutos++;
}


Meine Verständnisprobleme:

1.) Ist die zweite Definition nun eine Überladung UND Überschreibung? Wo liegt der Unterschied?

2.) Wieso wird beim Aufruf des Konstruktors 'Auto(var1, (short)var2, (short)var3)' aus einer Instanz heraus nicht sowohl die erste Definition (Überschreibung) als auch die zweite Definition (Überschreibung/Überladung) aufgerufen?

2.) Würde 'anzAutos' wieder überschrieben werden, wenn das 'public static int anzAutos = 0;' in der main()-Methode in der Code-Reihenfolge nach der Überschreibung/Überladung des Konstruktors 'Auto()' bzw. 'Auto(var1, (short)var2, (short)var3)' stehen würde?

Eventuell hat jemand mal ein Beispiel, bei dem mir das "Nu' ist's sonnenklar !!" - Erlebnis beschieden wird...
Jaja, jeder fängt mal klein an :)
 

Ark

Top Contributor
Mesqualito hat gesagt.:
Ich habe die Klasse 'Auto'.
Im Standardkonstruktor main()
Schon der erste grobe Fehler: Konstruktoren heißen immer so wie die Klasse selbst. Der Standard-Konstruktor zu Auto heißt also Auto(). Das, was du main() nennst, ist mit an Sicherheit grenzender Wahrscheinlichkeit der Einsprungpunkt für das Betriebssystem (bzw. der VM).

Ark
 

Mesqualito

Mitglied
Da sag ich mal: ja :) - das fördert die Gemeinsamkeit...


Und zwar hab ich das so verstanden, dass jede Klasse die main() - Methode hat.

Fängt doch immer so an:
Code:
package Verstaendnis;

// hier ein eventueller 'import'

public class NeueKlasse
{
    public static void main(String[] args)
    {
     // Variablendefinitionen
     // Überschreiben/Überladen der Standardmethode main() der Klasse 'NeueKlasse' mit
    //  z.B. public NeueKlasse()
    //  {
    //      public static int erweiterung = 1;
    //   }
    // zusätzliche Methodendefinitionen
    }
}


Aufruf des Konstruktors mit:
Code:
NeueKlasse ErsteInstanz; // Definition des Typs der "Variablen" 'ErsteInstanz'
ErsteInstanz =  new NeueKlasse(); // Setzen des Verweises bezüglich des Objekts 'ErsteInstanz'

Analyse:
Name der aufgerufenen Methode in der Klasse 'NeueKlasse':
main() // solange keine Überladung/Überschreibung definiert ist

Das dachte ich verstanden zu haben.
Bleiben noch die offenen Fragen meines ersten Threads?!?
 

Fu3L

Top Contributor
"public static void main(String[] args)" ist der Einstieg der VM in ein Programm (wie Ark schon geschrieben ha), d.h. an dieser Stelle beginnt dein Programm und nur eine Klasse in einem Programm braucht diese Methode, damit das komplette Programm gestartet werden kann. Ein Konstruktor sorgt für die initialisierung eines Objektes, das sind also 2 komplett verschiedenen Dinge:

Code:
public class Auto {

  public Auto() {

    System.out.println("Hier wird eine Instanz von Auto erzeugt und zurückgegeben");

  }

  public hupen() {

    System.out.println("HUUPPP");

  }

  public static void main(String[] args) {

    Auto a = new Auto();
    a.hupen();

  }

}

Die VM beginnt in der Main Methode, sieht, dass ein Auto erzeugt werden soll und ruft den Konstruktor, Auto(), auf. Auto() gibt ein Auto zurück. Danach kann die VM für Auto die Methode hupen() aufrufen. Die Ausgabe wäre also:

Hier wird eine Instanz von Auto erzeugt und zurückgegeben
HUUPPP

Danach ist das Ende der Main-Methode erreicht und das Programm wird beendet.

Edit: Variablen schreibt man übrigends normalerweise klein, wenns keine Konstanten sind....
 

Fu3L

Top Contributor
Da dir Überladung auch nicht klar zu seien scheint:

Bei der Überladung werden Methoden nciht überschrieben. Sie werden nur ein zweites mal definiert und zwar mit anderen Parametern.

Code:
public class Auto {

	Auto() {
	
		System.out.println("Hier wird eine Instanz von Auto erzeugt und zurückgegeben"); 
		
	}
	
	Auto(String name) {
	
		System.out.println("Hier wird eine Instanz von Auto erzeugt und zurückgegeben"); 
		System.out.println("Der Name des Autos lautet: " + name); 
		
	}
	
	schalten() {
	
		System.out.println("Ich schalte einen Gang höher")
		
	}
	
	schalten(int gang) {
	
		System.out.println("Ich schalte in Gang: " + gang);
		
	}
	
	public static void main(String[] args) {
	
		Auto a = new Auto("Audi");
		a.schalten();
		a.schalten(4);
		
	}
	
}

Dies führt zu folgender Ausgabe:


Hier wird eine Instanz von Auto erzeugt und zurückgegeben
Der Name des Autos lautet: Audi
Ich schalte einen Gang höher
Ich schalte in Gang: 4
 
P

P

Gast
Hi,

hab dir hier mal ein kleines Beispiel gebastelt, das vieles klarer werden lassen sollte.

Es gibt also eine Klasse "Auto", die eine statische Variable zum Speichern der Räder aller Fahrzeuge hat. Erstelle ich also ein Auto mit "new Auto();", wird durch die Methode "getRaeder" die Anzahl der Räder von einem Auto ermittelt: 4.
Wenn ich nun ein 4er-Auto (was auch immer das sein mag), erstelle mit "new Auto(4)" ein Objekt, das die Methode getRaeder(4) aufruft, die 16 zurückgibt und diese Zahl wird anzRaedern addiert.
An dieser Stelle hatten wir also eine "Überladung", d.h. zwei mal den "gleichen" Konstruktor, die sich aber in den Parametern unterscheiden. Sie müssen sich entweder in der Anzahl oder in der Anordnung unterscheiden:

Auto() und Auto(int i) sind zu unterscheidene Konstruktoren (Anzahl der Parameter), also gültig.
Auto(int i) und Auto(String s) sind ebenfalls gültig, da man sie anhand der Parametertypen unterscheiden kann.
Auto(int i, int j) und Auto(int k, int l) sind nicht gültig, da beide die gleiche Anzahl von Parametern haben UND sich nicht in ihren Typen unterscheiden.


Die zweite Klasse LKW erbt von der Klasse Auto, d.h. sie hat alle Eigenschaften der Elternklasse.
Jetzt kommt die große Überraschung :)
Rufe ich nun "new LKW();" auf, wird der entsprechende Konstruktor aufgerufen, der aber anscheinend nichts macht. Tja, von wegen. Es wird einfach und ohne meinen Willen super(); aufgerufen, also den Konstruktor der Elternklasse (an dieser Stelle könnte ich aber auch super(5) aufrufen, um den anderen Konstruktor zu wählen).
Nun steht aber im Auto()-Konstruktor, dass er getRaeder() aufrufen soll und das ist ja falsch, da ja nur jeweils 4 Rädern vom Auto hinzuaddiert werden würden. Und genau dazu "überschreiben" wir die Methode getRaeder().
Die Methode muss den gleichen Namen und die gleiche Anzahl von Attributen bzw. auch die gleichen Typen in der gleichen Reihenfolge haben, quasi "genau so aussehen". In LKW() rufe ich zwar den Konstruktor der Elternklasse auf, der widerum getRaeder() aufruft, aber er weiß, dass ich ein LKW-Objekt erstelle und es wird geschaut, ob es nicht in der LKW-Klasse eine Methode mit diesem Namen gibt. Und Tatsache, es gibt sie.

Hoffe, es ist klarer geworden ;) einfach mal versuchen, die Beispiele nachzuvollziehen.

Code:
public class Auto {

    protected static int anzRaeder = 0;
    
    protected Auto() {
        anzRaeder += getRaeder(1);
        
    }
    
    // Überladung des Konstruktors Auto. 
    protected Auto(int anzahl) {
        anzRaeder += getRaeder(anzahl);
    }
    
    protected int getRaeder(int anzahlAutos) {
        return anzahlAutos * 4;
    }
    

}

public class LKW extends Auto {

private LKW() {

}

// Überschreibung der Methode "getRaeder", diese wird für LKW-Objekte statt der Methode aus der Auto-Klasse aufgerufen
protected int getRaeder(int anzahlLKW) {
return anzahlLKW * 12;
}

public static void main(String[] args) {
// Ausgabe Räder (0)
System.out.println("Anzahl Räder: " + anzRaeder);
// Ein Auto mit 4 Rädern wird erstellt, Ausgabe 4 Räder
new Auto();
System.out.println("Anzahl Räder: " + anzRaeder);
// 4 Autos mit 16 Rädern werden erstellt, Ausgabe 4 Räder
new Auto(4);
System.out.println("Anzahl Räder: " + anzRaeder);

// Ein LKW mit 12 Rädern wird erstellt, Ausgabe 32 Räder
new LKW();
System.out.println("Anzahl Räder: " + anzRaeder);

}

}

PS: warum wird letzter Code nicht mit Highlights versehen? :(
 

Mesqualito

Mitglied
Danke für die Antworten, hat mir tatsächlich auf die Sprünge geholfen!

Hab da wohl erst einmal etwas durcheinander gebracht :)

Ich werde den Code trotzdem gleich mal abpinseln und durchdenken.

Und gleich dazu lernen, wie man das Thema als abgehakt markiert...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Unterschied main-Methode und Konstruktor Java Basics - Anfänger-Themen 13
C Konstruktor und main() Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Denix The public type Main must be defined in its own fileJava(16777541) Java Basics - Anfänger-Themen 13
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
N Wozu nutzt man in der Main Methode das args Array? Java Basics - Anfänger-Themen 10
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
J In main() Datei geöffnet, von anderer Funktion beschreiben Java Basics - Anfänger-Themen 3
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
KogoroMori21 Methode in der main ausgeben Java Basics - Anfänger-Themen 2
s_1895 zu viele Zeilen in der Main Methode Java Basics - Anfänger-Themen 4
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
B Wie kann ich etwas vor der Main-Methode ausführen? Java Basics - Anfänger-Themen 21
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
K Übergabe von Werten (zweidimensionales Array) aus einer Methode an zweidimensionales Array in main() Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
G main Methode Java Basics - Anfänger-Themen 5
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
J main methode Java Basics - Anfänger-Themen 1
B No Main Classes Found Java Basics - Anfänger-Themen 7
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
D java main methode kann nicht kompiliert werden (Erstellen eines Objekts) Java Basics - Anfänger-Themen 6
M String außerhalb der main-Methode Java Basics - Anfänger-Themen 4
scratchy1 ArrayOutOfBoundException in main-Methode Java Basics - Anfänger-Themen 17
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
P Parameterübergabe, von Methode zu Methode zu main Java Basics - Anfänger-Themen 4
J Kapselung Array in Set ändern und in Main ausgeben lassen Java Basics - Anfänger-Themen 4
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
D Compiler-Fehler Aufrufen einer Methode von Main Java Basics - Anfänger-Themen 4
G Was als main Method Java Basics - Anfänger-Themen 6
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
J Compiler-Fehler Java findet main Klasse nicht Java Basics - Anfänger-Themen 16
B Parameterübergabe in main Java Basics - Anfänger-Themen 1
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
I java.lang.ArrayIndexOutOfBoundsException at lösung.main Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J Frage zu: public static void main (String[]args) Java Basics - Anfänger-Themen 1
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
M Methodenaufruf in der Main Datei funzt nicht Java Basics - Anfänger-Themen 13
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
G Instanzvariable in main-Methode verboten? Java Basics - Anfänger-Themen 3
M Objekt starten von der main-Methode Java Basics - Anfänger-Themen 1
S Fehler: Editor does not contain a main type Java Basics - Anfänger-Themen 3
G Programm wird nicht ausgeführt: Editor does not contain a main type Java Basics - Anfänger-Themen 10
A Methode aufrufen in main-Methode Java Basics - Anfänger-Themen 5
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
C Erste Schritte (Netbeans) no main classes found Java Basics - Anfänger-Themen 5
U Klassen IntelliJ14.1.1 Ultimate startet eine Main-Klasse NICHT MEHR Java Basics - Anfänger-Themen 0
P Methoden private int[] in main Java Basics - Anfänger-Themen 16
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
AssELAss Klassen Java Klasse in main-methode ausführen Java Basics - Anfänger-Themen 7
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
P could not find main class obwohl da Java Basics - Anfänger-Themen 17
J Methode in main-Methode aufrufen Java Basics - Anfänger-Themen 5
B OOP Wie benutze ich die Main Funktion richtig? Java Basics - Anfänger-Themen 10
M Klassen Main Methode in einer anderen Klasse aufrufen Java Basics - Anfänger-Themen 13
TheMenox Methoden Auslagerung von Code aus der "main" Methode sinnvoll? Java Basics - Anfänger-Themen 70
quecksilver if-Abfrage in main ausführen Java Basics - Anfänger-Themen 4
J Exception in thread "main" Java Basics - Anfänger-Themen 1
S Methode auf Main zugreifen Java Basics - Anfänger-Themen 5
D String aus Main in Klasse übergeben Java Basics - Anfänger-Themen 4
S Methoden main-Methode integrieren Java Basics - Anfänger-Themen 2
K Methoden Programm ohne Main Methode starten Java Basics - Anfänger-Themen 2
I Fehlermeldung: Java does not contain a main type Java Basics - Anfänger-Themen 1
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
F Erste Schritte (Gelöst) Anfängerfrage Arraylist ausserhalb der Main Methode Java Basics - Anfänger-Themen 2
N Variablen Variable in Main deklarieren und in anderer Methode nutzen Java Basics - Anfänger-Themen 12
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
R window-Klasse, main-loop und unausschaltbares anti-aliasing Java Basics - Anfänger-Themen 0
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
P Compiler-Fehler Could not load or find main class fehler Java Basics - Anfänger-Themen 15
S Selection does not contain a main type! Java Basics - Anfänger-Themen 5
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
P Compiler-Fehler could not find or load main class Java Basics - Anfänger-Themen 5
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
U Umschreiben ohne main methode ;-) Java Basics - Anfänger-Themen 8
A Fehlermeldung beim aufruf der main Methode Java Basics - Anfänger-Themen 17
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben