Verschachtelte Klassen

seux

Aktives Mitglied
Hallo,
ich versuch grad zwei Klassen inneinader zu verschachteln. Das Ziel ist, das ich die innere Klasse ungefähr so aufrufen kann
Java:
OuterClass out = new OuterClass.InnerClass(123);

Bisher sieht mein Java Code dazu so aus.

Java:
class OuterClass
{
	int m_i;
	
	public getI()
	{
		return m_i;
	}
	
	class InnerClass extends OuterClass
	{
		public InnerClass(int j)
		{
			m_i = j;
			System.out.println("m_i: " + m_i);
		}
	}
}

Der Compiler spuckt mir aber für den obigen aufruf den Fehler
Code:
error: non-static variable this cannot be referenced from a static context
und dann verweist er auf das "new" vom Aufruf
 
Versuchst du, den obigen Aufruf aus einer main auszuführen? Wenn ja, das geht nicht, da die main eine statische Funktion ist. Unterschied statisch/non-statisch -> Forumsuche, wurde unzählige male hier erklärt.

Schreib innerhalb der Klasse die Initialisierung und dann arbeite in der main damit, dürfte funktionieren.

edit: Deine Methode
Code:
getI()
ist auch falsch, du hast keinen Return Typ angegeben.
edit2: Und das was du machen willst, funktioniert so eh nicht. Am besten baust du dir eine Instanz der inneren Klasse direkt in deiner Äußeren Klasse, um damit später zu arbeiten. Oder du machst die Innere Klasse static, dann kannst du einfach schreiben
Code:
OuterClass.InnerClass out = new OuterClass.InnerClass(123);
..
 
Zuletzt bearbeitet:
Außerdem kannst du kein Objekt der inneren Klasse anlegen, wenn keins der äußeren existiert. Der korrekte Aufruf muss so heißen:
Java:
OuterClass out = new OuterClass().new InnerClass(123);
 
Danke schonmal für eure antworten 🙂

Außerdem kannst du kein Objekt der inneren Klasse anlegen, wenn keins der äußeren existiert.

Ich dachte durch die Polymorphie sei dies möglich. Nachdem ich den Konstruktor der inneren Klasse aufgerufen hab, möchte ich im weiteren Verlauf gerne mit meinem OuterClass Objekt weiterarbeiten.

@pro2:
ja, ich hab versucht den aufruf in main auszuführen. Ich werd mich gleich mal zu static informieren. Das mit getI() hab ich korigiert.
Zu deinem zweiten edit:
Da legst du ja auch ein Object der inneren Klasse an, dass möchte ich aber nicht. Es soll schon mit der äußeren Klasse weitergearbeitet werden.
 
Dann sollte man InnerClass nicht als InnerClass sondern einfach als normale Klasse implementieren, dann geht das auch ;D
 
@seux Was für einen Vorteil erwartest du dir denn dadurch, dass du eine Innere-Klasse hast? Wie bereits erwähnt tut es in deinem Fall eine ganz normale Klasse die von Outer erbt auch. Das mit den inneren Klassen ist so ein Thema für sich in Java, ehrlich gesagt hab ich selten einen Fall gesehen, der sich nicht auch ohne innere Klassen lösen hätte können. Meistens kommt dann auch noch übersichtlicher Code raus.

@irgendjemand
Polymorphie. Echt das gibt es in Java nicht?
 
...ButAlive;843745@irgendjemand [URL="http://de.wikipedia.org/wiki/Polymorphie_%28Programmierung%29" hat gesagt.:
Polymorphie[/URL]. Echt das gibt es in Java nicht?

NEIN ... denn Generics und Interfaces haben in Java nichts mit eigentlicher Polymorphie wie z.B. überladenen Operatoren oder mehreren Basis-Klassen zu tun ... sondern sind lediglich normaler Sprachsyntax ...

wer allerdings in diesem wiki-artikel darauf gekommen ist Interfaces als Polymorphie zu bezeichnen weis ich nicht ...
 
Polymorphie heißt nur, dass für den Aufrufer es vollkommend egal ist was er für einen konkreten Typen hat, solange dieser die Methoden anbietet, die der Aufrufer für seine Aufgabe braucht.

Man braucht keine Mehrfachvererbung für Polymophie, man braucht noch nicht mal unbedingt Interfaces um Polymorphie zu haben.

Java:
public void printHashcode(Object o){
   System.out.println(o.hashCode());
}

Diese Methode kann ich mit jedem beliebigen Objekt in Java aufrufen, was o konkret ist, interessiert an der Stelle nicht.

Generics hat mit Polymorphie wirklich nicht viel zu tun, Interfaces schon.
 
@seux Was für einen Vorteil erwartest du dir denn dadurch, dass du eine Innere-Klasse hast? Wie bereits erwähnt tut es in deinem Fall eine ganz normale Klasse die von Outer erbt auch. Das mit den inneren Klassen ist so ein Thema für sich in Java, ehrlich gesagt hab ich selten einen Fall gesehen, der sich nicht auch ohne innere Klassen lösen hätte können. Meistens kommt dann auch noch übersichtlicher Code raus.

hmm, ich wollte das mit der inneren Klasse machen, um zu zeigen zu welcher Hauptklasse das gehöhrt, um eventuelle doppeldeutigkeiten mit Klassennamen zu umgehen. Aber ich glaub ich sollte mir mal Packages angucken...
 
hmm, ich wollte das mit der inneren Klasse machen, um zu zeigen zu welcher Hauptklasse das gehöhrt, um eventuelle doppeldeutigkeiten mit Klassennamen zu umgehen. Aber ich glaub ich sollte mir mal Packages angucken...

Statt der inneren Klasse kannst du auch einfach eine statische, verschachtelte Klasse verwenden. Schreibe einfach ein [c]static[/c] vor das [c]class[/c] der eingebetteten Klasse. Die kannst du dann ganz normal wie eine Top-Level-Class benutzen.
 
Interfaces als Polymorphie zu bezeichnen

In der Tat, eine Schnittstelle ist oft kein Gegenstand, der viele Formen haben kann, sondern eher eine Eigenschaft, die wir beliebigen Gegenständen zuordnen können. Nichtsdestotrotz können wir in Java mit Interfaces die Vorteile der "Polymorphie" nutzen, ohne eine Klassenvererbung aufbauen zu müssen 😉.

Gruß.
André
 
Zuletzt bearbeitet:
Der Begriff "Polymorphie" ist selbst ziemlich "polymorph", es gibt ganz verschiedene Versionen davon:

Arten der Polymorphie

- Polymorphie überladener Operatoren
- Polymorphie der Objektorientierten Programmierung
- Polymorphie einer Funktion bzw. Prozedur
- Polymorphie von Datentypen oder Klassen
- Polymorphie bei der Softwareentwicklung
Polymorphie (Programmierung) ? Wikipedia

Sicher gibt es noch mehr Varianten...
 
Zuletzt bearbeitet:

Zurück
Oben