Was ist der Hauptunterschied zwischen einer inneren Klasse und einer statischen verschachtelten Klasse in Java? Spielt der Entwurf/die Implementierung eine Rolle bei der Wahl einer dieser beiden Klassen?
Antworten
Zu viele Anzeigen?Statische verschachtelte Klassen greifen auf PRIVATE statische Variablen auf Klassenebene der Klasse zu, in der sie definiert sind. Dies kann aus architektonischer Sicht von großer Bedeutung sein (z. B. das Service Locator-Muster, das verschachtelte statische Hilfsklassen in Diensten verwendet) und kann OP helfen zu verstehen, warum sie zusammen mit inneren Klassen existieren.
Der Unterschied besteht darin, dass eine verschachtelte Klassendeklaration, die auch statisch ist, außerhalb der umschließenden Klasse instanziiert werden kann.
Wenn Sie eine verschachtelte Klassendeklaration haben, die no statisch, auch bekannt als innere Klasse lässt Java die Instanziierung nicht zu, außer über die umschließende Klasse. Das aus der inneren Klasse erstellte Objekt ist mit dem aus der äußeren Klasse erstellten Objekt verknüpft, so dass die innere Klasse auf die Felder der äußeren Klasse verweisen kann.
Wenn es sich jedoch um eine statische Klasse handelt, existiert die Verknüpfung nicht, es kann nicht auf die äußeren Felder zugegriffen werden (außer über eine gewöhnliche Referenz wie bei jedem anderen Objekt) und Sie können daher die verschachtelte Klasse selbst instanziieren.
Ich habe verschiedene mögliche korrekte und fehlerhafte Szenarien illustriert, die in Java-Code auftreten können.
class Outter1 {
String OutStr;
Outter1(String str) {
OutStr = str;
}
public void NonStaticMethod(String st) {
String temp1 = "ashish";
final String tempFinal1 = "ashish";
// below static attribute not permitted
// static String tempStatic1 = "static";
// below static with final attribute not permitted
// static final String tempStatic1 = "ashish";
// synchronized keyword is not permitted below
class localInnerNonStatic1 {
synchronized public void innerMethod(String str11) {
str11 = temp1 +" sharma";
System.out.println("innerMethod ===> "+str11);
}
/*
// static method with final not permitted
public static void innerStaticMethod(String str11) {
str11 = temp1 +" india";
System.out.println("innerMethod ===> "+str11);
}*/
}
// static class not permitted below
// static class localInnerStatic1 { }
}
public static void StaticMethod(String st) {
String temp1 = "ashish";
final String tempFinal1 = "ashish";
// static attribute not permitted below
//static String tempStatic1 = "static";
// static with final attribute not permitted below
// static final String tempStatic1 = "ashish";
class localInnerNonStatic1 {
public void innerMethod(String str11) {
str11 = temp1 +" sharma";
System.out.println("innerMethod ===> "+str11);
}
/*
// static method with final not permitted
public static void innerStaticMethod(String str11) {
str11 = temp1 +" india";
System.out.println("innerMethod ===> "+str11);
}*/
}
// static class not permitted below
// static class localInnerStatic1 { }
}
// synchronized keyword is not permitted
static class inner1 {
static String temp1 = "ashish";
String tempNonStatic = "ashish";
// class localInner1 {
public void innerMethod(String str11) {
str11 = temp1 +" sharma";
str11 = str11+ tempNonStatic +" sharma";
System.out.println("innerMethod ===> "+str11);
}
public static void innerStaticMethod(String str11) {
// error in below step
str11 = temp1 +" india";
//str11 = str11+ tempNonStatic +" sharma";
System.out.println("innerMethod ===> "+str11);
}
//}
}
//synchronized keyword is not permitted below
class innerNonStatic1 {
//This is important we have to keep final with static modifier in non
// static innerclass below
static final String temp1 = "ashish";
String tempNonStatic = "ashish";
// class localInner1 {
synchronized public void innerMethod(String str11) {
tempNonStatic = tempNonStatic +" ...";
str11 = temp1 +" sharma";
str11 = str11+ tempNonStatic +" sharma";
System.out.println("innerMethod ===> "+str11);
}
/*
// error in below step
public static void innerStaticMethod(String str11) {
// error in below step
// str11 = tempNonStatic +" india";
str11 = temp1 +" india";
System.out.println("innerMethod ===> "+str11);
}*/
//}
}
}
- See previous answers
- Weitere Antworten anzeigen
99 Stimmen
Die Antwort von Joshua Bloch ist in Leistungsfähiges Java lesen
item 22 : Favor static member classes over non static
24 Stimmen
Für das Protokoll, es ist Punkt 24 in der 3. Auflage des gleichen Buches.