Nov 29

Heute ein Beispiel einer anonymen inneren Klasse mit interfaces anstatt einer Oberklasse:

public class Abteilung {

public static void main(String args [ ]){

Gruppe g = new Gruppe () {

public void getInfo(){

System.out.println(“anonyme Gruppe”);

}

};

g.getInfo();

}

}

interface Gruppe {

public void getInfo();

}

Es gibt also nur wenige Änderungen im Vergleich zur Anwendung mit Oberklassen.

Es mag den einen oder anderen verwirren, da es ja so aussieht, ob ein Interface instanziiert wird – was natürlich nicht möglich ist;  es wird ein anonymes Objekt initiiert, welches das interface Gruppe implementiert.

Nov 27

Eigene Methoden (Methoden, die nicht in der Oberklasse vorhanden sind) innerhalb der anonymen inneren Klasse sind nicht legal.

public class Abteilung {

public static void main(String args [ ]){

Gruppe g = new Gruppe () {

public void getInfo(){

System.out.println(“anonyme Gruppe”);

}
public void doSomething(){
// nicht legal, da die Oberklasse diese Methode nicht hat, aber kein CompilerFehler an dieser Stelle

System.out.println(“Hier bin ich”);

}

};

g.getInfo(); //Ausgabe: anonyme Gruppe
g.doSomething();// CompilerFehler bei Implementierung der Methoden-Nutzung

}

}
class Gruppe {

public void getInfo(){

System.out.println(“nicht-anonyme Gruppe”);

}

}

Nov 25

Bei der Verwendung von anonymen inneren Klassen werden Klassen an ein und derselben Stelle deklariert und instanziiert. Es wird also automatisch ein Objekt erzeugt, welches nur für streng lokale Zwecke genutzt werden kann. Da hierbei kein Klassenname vergeben wird (die Klasse somit namenlos ist), spricht man von einer anonymen Klasse.

Um anonyme innere Klassen verwenden zu können, braucht man entweder ein einfaches interface oder eine Superklasse, die den Hauptteil der benötigten Implementierung bereitstellt.

Jetzt erst einmal ein Beispiel zum besseren Verständnis:

public class Abteilung {

public static void main(String args [ ]){

Gruppe g = new Gruppe () { //  Es wird eine Art Unterklasse von Gruppe deklariert und erzeugt, die aber keinen eigenen Namen hat

// Definition der anonymen Klasse

public void getInfo(){ // Überschreibung der Methode getInfo()

System.out.println(“anonyme Gruppe”);

}

}; // Ende der anonymen inneren Klasse welche zwingend mit ‘;’ abgeschlossen werden muss

}

}

class Gruppe { // Definition der eigentlichen Klasse

public void getInfo(){ // Ursprüngliche Methode der Klasse Gruppe

System.out.println(“nicht-anonyme Gruppe”);

}

}

Nov 23

Bei statischen Methoden bitte beachten, dass nur statische Variablen außerhalb der Methode aufgerufen werden können:

public class Abteilung {

final String name3 =”Test3″;
static String name4 = “Test4″;
String name5 = “Test5″;

static void doSomething(){

String name1 =”Test1″;
final String name2 =”Test2″;
class newClass{

void getName() {

System.out.println(name1); // CompilerFehler, da innerhalb der Methode und nicht final
System.out.println(name2);
// ok, da final
System.out.println(name3); // CompilerFehler, da evtl. noch nicht intialisiert
System.out.println(name4);
// ok, statische Methoden können nur (äußere) statische Variablen aufrufen, alle anderen sind evtl. zu dem Zeitpunkt des Aufrufes nicht initialisiert
System.out.println(name5); // CompilerFehler

}

}
newClass a = new newClass();
a.getName();

}
public static void main(String args [ ]){

Abteilung a = new Abteilung();
a.doSomething();

}

}

Tagged with:
Nov 21

Ich hatte ja schon erläutert, das eine innere Klasse auf alle Variablen/Objekte der äußeren Klasse zugreifen kann. Ist aber eine Klasse innerhalb einer Methode der Oberklasse definiert, verhält sich dies für die Variablen/ Objekte der Methode nicht so:

public class Abteilung {

String name =”Finance”;

void doSomething(){

String name1 =”Test1″;
final String name2 =”Test2″;
class newClass{

void getName() {

System.out.println(name1); //CompilerFehler, da nicht final
System.out.println(name2); // Ausgabe: Test2

System.out.println(name); // Auf die Variablen der Klasse kann wie gewohnt zugegriffen werden; Ausgabe ist: “Finance”

}

}
newClass a = new newClass();
// Erzeugen einer Instanz von newClass
a.getName(); // Aufruf der Methode getName von newClass

}
public static void main(String args [ ]){

Abteilung a = new Abteilung();
a.doSomething();

}

}

Klassen innerhalb von Methoden (auch lokale Klassen genannt) können auf deren Variablen/Objekte nur zugreifen, wenn diese als final und damit als unveränderlich deklariert sind.

Tagged with:
Nov 20

Welche Zeilen compilieren nicht einwandfrei?

final int AbtNr;
Byte PersSchlüssel=7;
Integer PersNr=123;
AbtNr=10;

switch(PersSchlüssel){
case 128:System.out.println(“128″);
//1
default:System.out.println(“default”);
//2
case AbtNr:System.out.println(“AbtNr”);
//3
case PersNr:PersNr++ ;
//4

Antwort/ answer
Tagged with:
Nov 19

Auch in einer Methode der Oberklasse kann eine innere Klasse definiert werden:

public class Abteilung {

void doSomething(){

class newClass{ } // Nur Definition keine Instantiierung
newClass a = new newClass();
// erst hier erfolgt die Instantiierung

}
public static void main(String args [ ]){

Abteilung a = new Abteilung();
a.doSomething();

}

}

Die Klasse newClass ist außerhalb der Methode doSomething nicht bekannt und kann daher auch nur innerhalb dieser Methode verwendet werden.

Tagged with:
Nov 17

Das mit this auf Variablen innerhalb der Klasse definiert wird, dürfte bereits bekannt sein, aber wie referenziert man auf die Oberklasse?

… ebenfalls mit this:

public class Abteilung {

private String name=”Finance”;

class Gruppe{

private String name=”Dunning”;

void getInfo(){

System.out.println(this.name); // Referenzierung auf Gruppe.name: Dunning
System.out.println(Abteilung.this.name); // Referenzierung auf name der Abteilung: Finance

System.out.println(this); // Ausgabe des Objektes der Klasse Abteilung.Gruppe: Abteilung$Gruppe@19821f
System.out.println(Abteilung.this); //Ausgabe des Objektes der Klasse Abteilung: Abteilung@addbf1

}

}

public static void main(String args [ ]){

Abteilung a = new Abteilung();
Gruppe b = a.new Gruppe();
b.getInfo();

}

}

Tagged with:
Nov 15

Da ja innere Klassen ein privater Teil der äußeren Klasse sind, können innere Klassen auch auf alle Variablen/Objekte  der äußeren Klasse (egal ob privat oder nicht) zugreifen:

public class Abteilung {

private String name=”Finance”;

class Gruppe{

void getAbteilung(){

System.out.println(name); // Zugriff auf private Variable der äußeren Klasse ist problemlos möglich

}

}
public static void main(String args [ ]){

Abteilung a = new Abteilung();
Gruppe b = a.new Gruppe();
b.getAbteilung();
// Zugriff auf Variable der äußeren durch Methode der inneren Klasse

}

}

Tagged with:
Nov 13

Die Instantiierung findet innerhalb der Klasse statt:

public class Abteilung {

class Gruppe{ . . . }

public static void main(String args [ ]){

Abteilung a = new Abteilung();
Gruppe b = a.new Gruppe();
//oder
Abteilung.Gruppe c =a.new Gruppe(); //oder
Abteilung.Gruppe d = new Abteilung().new Gruppe();

}

}

Es kann also keine Gruppe ohne eine  Abteilung angelegt werden. Alternativ kann die innere Klasse auch innerhalb einer Methode angelegt werden; aber aufgepasst: auf diese Klasse kann nur innerhalb der Methode zugegriffen werden:

public class Abteilung {

private String name=”Finance”;
void newInner(){

Gruppe g = new Gruppe(); // neue Gruppe innerhalb der Methode newInner
g.getAbteilung();

}

class Gruppe{

void getAbteilung(){
System.out.println(name);

}

}
public static void main(String args [ ]){

Abteilung a = new Abteilung();
a.newInner();
//Ausgabe: Finance
g.getAbteilung(); //CompilerFehler, auf die Instanz g kann nur innerhalb der Methode zugegriffen werden

}

}

Tagged with:
preload preload preload
http://www.wikio.de Blog Top Liste - by TopBlogs.de Blogverzeichnis - Blog Verzeichnis bloggerei.de Bloggeramt.de Software
Webbhotell Top Blogs