Objekte aus einer anderen Klasse(in der sich weitere Klassen befinden) erzeugen

  • Themenstarter Themenstarter Brahms18
  • Beginndatum Beginndatum
B

Brahms18

Gast
Guten Abend.

Ich habe zwei Klassen, zum einem Autos, in der sich noch viele weitere Klasse befinden(BMW,Audi,Ford etc.) und eine seperate Klasse mit einer GUI.
Nun möchte ich in der Klasse mit der GUI ein Objekt aus der Klasse Autos( z.B. BMW ) erzeugen und eine Methode aufrufen.

Durch Recherche weiß ich, dass ich eine Methode aus einer anderen Klasse so aufrufen könnte.
Klassenname.Methode();

Jedoch sind die Klassen (BMW,Audi,Ford etc.) nicht public, sondern nur die Klasse Autos.
Und wenn ich BMW public mache, dann will er eine neue Datei (BMW.java) erstellen. Ich will aber nur mit den Dateien Autos.java und GUI.java auskommen.

Wie kann ich nun Objekte von Klassen aus einer anderen Klasse erzeugen?

Ich hoffe Ihr könnt mir helfen 🙂

Vielen Dank für jede Hilfe.
 
Java:
public class Auto {


   public class BMW {

   }
}
wäre denkbar, lies dich zu Inneren Klassen schlau,
Klassen übrigens möglichst immer in Einzahl benennen, Auto statt Autos
 
Mein eigentliches Programm handelt nicht von Autos, jedoch darf ich den Quellcode noch nicht öffentlich machen, deswegen verändere ich die Namen, vom Prinzip ist alles gleich, nur die Logik oder der Sinn stimmt vllt. nicht ganz.

Java:
public class Autos{

  public static void main(String[] args) {
   


  }
}
class Auto{

// Hier sind viele konstante Variablen

Auto(){

}

public double Mehtode1(){
return 0;

}
public void Methode2(){

}


}

class BMW extends Auto{

// paar Attribute

BMW(){

}

public double Mehtode1(){
return 0;

}
public void Methode2(){

}

class Irgendetwas extends BMW{

// paar Attribute

Irgendetwas(){

}

public double Mehtode1(){
return 0;

}
public void Methode2(){

}

etc.

Wenn ich nun public vor class BMW schreibe erhalte ich diese Fehlermeldung.
Java:
Fahrkarten.java:58:8: class Monatskarte is public, should be declared in a file named Monatskarte.java

Ich will aber nicht unzählige Dateien mehr haben, weil nun jede Klasse als .java vorhanden sein muss.
Oder geht es nicht anders?

Bzw. ich würde gerne nur Autos.java und GUI.java benötigen um das Programm zu starten.
Mache ich alle weiteren Klassen public müsste ich auch alle diese Klassen als Dateien (Klasse.java) benötigen um das Programm zu starten oder?

Dankeschön Slaster und Eike 🙂
 
Ergänzend muss ich sagen das alle inneren Klassen zwei Konstruktoren bestizen, einen leeren und einen an den Parameter übergeben werden.

Definiere ich sie ineinander bekomme ich leider diese Fehlermeldung bei beiden Konstruktoren der Klasse Irgendetwas.
Java:
 cannot reference this before supertype constructor has been called
 
Genau so sieht der Fehler bei mir aus.

Okay, habe die Klasse Autos rausgeschmissen und es sieht jestzt so aus.

Java:
public class Auto{
 
// Hier sind viele konstante Variablen

// Leerer Konstruktor
Auto(){
 
}
 
public double Mehtode1(){
return 0;
 
}
public void Methode2(){
 
}
 
 
// Hier jetzt keine Klammer mehr
 
class BMW extends Auto{
 
// paar Attribute
 
BMW(){
 
}

BMW(Parameter1, Parameter2){
Methode2();
}
 
public double Mehtode1(){
return 0;
 
}
public void Methode2(){
 
}

}
 
class Irgendetwas extends BMW{
 
// paar Attribute


// leerer Konstruktor 
Irgendetwas(){
 
}

Irgendetwas(Parameter1){
Methode2;
}


 
public double Mehtode1(){
return 0;
 
}
public void Methode2(){
 
}

} // Hier wird die Klasse Auto geschlossen

So sieht es nun aus und dann erhalte ich den oben genannten Fehler bei beiden Konstrukoren der Klasse Irgendetwas.
 
Eine Klammer habe ich ganz unten noch vergessen also:

Java:
...
...

public void Methode2(){
 
}

}
 
} // Hier wird die Klasse Auto geschlossen
 
ja, Pech, noch eine weitere Vererbung, dann trifft exakt die Situation wie im Link zu, Lösung steht doch da,
wobei vielleicht zu hoch um selber auszuprobieren, habe ich bisher auch noch nicht gesehen, aber scheint zu funktionieren:

Java:
public class Auto {

	// Hier sind viele konstante Variablen

	// Leerer Konstruktor
	Auto() {

	}

	public double Mehtode1() {
		return 0;

	}

	public void Methode2() {

	}

	// Hier jetzt keine Klammer mehr

	class BMW extends Auto {

		// paar Attribute

		BMW() {
			
		}

		BMW(String a, String b) {
			Methode2();
		}

		public double Mehtode1() {
			return 0;

		}

		public void Methode2() {

		}

	}

	class Irgendetwas extends BMW {

		// paar Attribute

		// leerer Konstruktor
		Irgendetwas() {
			Auto.this.super();
		}

		Irgendetwas(String a) {
			Auto.this.super();
			Methode2();
		}

		public double Mehtode1() {
			return 0;

		}

		public void Methode2() {

		}
	}
} // Hier wird die Klasse Auto geschlossen

eine einfachere Lösung und standardmäßig durchaus auch zu empfehlen wäre alternativ, die inneren Klassen als static zu definieren,
also [c]static class BMW extends Auto { [/c],

frag mich nicht was das bedeutet, einerseits könnte ich es gar nicht exakt definieren, nur einen bestimmten Effekt nennen,
andererseits ja: 'mache dich zu Inneren Klassen schlau' 😉
 
Ach ja, eine Frage noch:

Java:
Beispiel   Die Klasse Haus besitzt die innere Element-Klasse Zimmer.

class Haus
{
  class Zimmer
  {
  }
}


Um von außen ein Objekt von Zimmer aufzubauen, schreiben wir:

Haus h = new Haus();
Zimmer z = h.new Zimmer();

Das Kompilieren klappt, jedoch habe ich noch kein Objekt aus der GUI Klasse erzeugt.
Müssen beide Klassen nur in einem Ordner sein, damit ich das obige Beispiel durchführen kann?

Also ich will ein Objekt von Zimmer erzeugen, befinde mich aber in einer anderen Klasse (GUI-Klasse).
Kann die Gui-Klasse einfach durch :

Haus h = new Haus();
Zimmer z = h.new Zimmer();

ein Objekt von Zimmer erzeugen, oder muss man i.was in die GUI-Klasse importieren?

Danke.
 
Die GUI-Klasse muss sich zwangsläufig im selben Package befinden wie die Haus-Klasse, von daher musst du nichts importieren.
 
probiere es doch erst aus, gibt es Fehlermeldungen?
du benutzt nicht zufällig eine IDE mit automatischen Imports?

Eclipse muss man nur downloaden und starten.., ok wenn man es nicht kennt ist das schon auch eine gewisse Arbeit alles kennenzulernen

bei static kann man übrigens auf das h in
Zimmer z = h.new Zimmer();
verzichten, das ist genau der eine entscheidende Punkt
 
Hey hdi,

versteht man unter selbem Package, den gleichen Ordner?
Also beide Klassen müssen sich nur im selben Ordner befinden?

Bei mir siehts so aus:

Java:
Auto a = new Auto();
BMW z = a.new BMW();


In der 2. Zeile gibt er mir den Fehler "cannot find symbol", obwohl die Klasse BMW als public deklariert ist.

Ich benutze den JavaEditor.
 
versteht man unter selbem Package, den gleichen Ordner?
Ja. Die Toplevel Klasse (Auto) muss eine ensptrechende package-Deklaration haben:
Code:
package ordnerName; // erste Zeile in der Datei

Also beide Klassen müssen sich nur im selben Ordner befinden?
Ja, da deine Auto-Klasse, zumindest gemäß dem letzten Code den du gepostet hast, nicht public ist. Das bedeutet, dass nur Klassen die im selben Package liegen Zugriff darauf haben. Wenn auch Auto public ist, dann kann die GUI-Klasse auch in einem anderen Ordner liegen, muss aber die Auto-Klasse dann importieren:
Code:
import orderName.Auto; // unter der package-Deklaration

In der 2. Zeile gibt er mir den Fehler "cannot find symbol", obwohl die Klasse BMW als public deklariert ist.
Es muss Auto.BMW heißen - wenn du es nicht ausschreiben willst musst du die innere Klasse durchaus explizit importieren:
Code:
import ordnerName.Auto.BMW;

Und vor dem a(a.new BMW()😉 noch zusätzlich der Fehler:
"qualified new of static class"
Hä? Das ist ungültige Syntax, was sollen die Klammern da drumrum? Wenn die Klasse BMW statisch ist kannst du sie nicht über die a-Referenz ansprechen, sondern über die A-Klasse, also:
Code:
new Auto.BMW();
 
Wow, mit
Java:
new Auto.BMW();
geht es einwandfrei.

Aber warum muss ich nun nicht in dieser Form eingeben?

Java:
Auto a = new Auto();
BMW z = a.new BMW();

BMW ist doch ein inneres Element von Auto und nach dem Beispiel müsste es wie oben angeben werden..

Danke hdi 😉
 
Wenn Y eine innere statische Klasse von X:

Java:
new X.Y();

Wenn Y eine innere nicht-statische Klasse von X:

Java:
new X().new Y();

Es gibt einen großen (logischen) Unterschied zwischen statischen Klassen und nicht-statischen Klassen. Da steckt also weit mehr dahinter als dieser syntaktische Unterschied einer Instanz-Erzeugung. Du solltest dir den Unterschied erstmal klar machen bevor du weiter mit inneren Klassen arbeitest.
 
Okey, den kenne ich leider noch nicht.
Bin auch noch Anfänger.. :/

Aber es klappt und dafür danke ich dir hdi und auch Slatter nochmal 🙂

Gute Nacht.
 
Okey, den kenne ich leider noch nicht [...] Aber es klappt [...] Gute Nacht!
Grrr... :noe: Da bereue ich doch glatt, dir "geholfen" zu haben. Du solltest verstehen was du tust, und nicht einfach ahnungslos am Code rumbasteln bis er kompiliert. Das bringt dir nix. Und es vergeht einem auch schnell die Lust jemandem zu helfen der eigentlich nur den richtigen Code will, ohne ihn zu verstehen.. Du solltest deine Einstellung zum Thema Java lernen nochmal überdenken. So wird das nix.
 
Genau Slatter, so funktioniert es auch.

Oh hdi, so meinte ich das nicht.
Natürlich hätte ich dich gerne gefragt, was denn dieser Unterschied zwischen statistischen und nicht statistischen Klassen ist, jedoch habe ich es mir verkniffen, weil ich meinen Erfahrungen nach, sowieso sofort darauf angewiesen werde mich im Internet schlau zu machen.

Und da es schon so spät ist und ich müde bin habe ich mich einfach für die Hilfe bedankt, da es klappt.

Ich kenne dich noch von Youtube und deinen Tutorials bzw. deinem Java-Projekt und von daher wollte ich nicht deine kostbare Zeit verschwenden 😛
 
Ich kenne dich noch von Youtube und deinen Tutorials bzw. deinem Java-Projekt und von daher wollte ich nicht deine kostbare Zeit verschwenden 😛
Das ist Quatsch, verschwendet ist sie wenn ich hier abhäng aber keine Fragen kommen 😉 Der Post sollte dich nicht so angreifen wie's vllt rüberkam. Es ist ja i.O. wenn du für heute genug hast bzw erstmal selbst recherchieren willst. Hat sich halt so angehört als hättest du das Thema damit abgeschlossen. Egal, ich mach für heute auch Schluss, mein Fernseher sehnt sich nach mir 😀
 
Okey, dann kommt morgen eine Frage oder eine Antwort zum Thema "Unterschied zwischen statistischen und nicht statistischen Klassen" 🙂

Freut mich, dass du dir für jeden Zeit nimmst.

Viel Spaß beim Tv schaun 😉
 

Zurück
Oben