xem xét sau Ví dụ:
public class OuterClass {
private AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass() {
@Override
protected void printAboutme() {
System.out.println("AnonymousInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
};
public void displayAnonymousInnerClass() {
anonymousInnerClass.printAboutme();
}
public void displayStaticInnerClass() {
NestedStaticClass staticInnerClass = new NestedStaticClass();
staticInnerClass.printAboutMe();
}
public void displayInnerClass() {
InnerClass innerClass = new InnerClass();
innerClass.printAboutMe();
}
public void displayMethodInnerClass(){
class MethodInnerClass {
private String sampleField = "Method Inner Class";
public void printAboutMe() {
System.out.println("MethodInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
MethodInnerClass methodInnerClass = new MethodInnerClass();
methodInnerClass.printAboutMe();
}
class InnerClass {
private String sampleField = "Inner Class";
public void printAboutMe() {
System.out.println("InnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
abstract class AnonymousInnerClass {
protected String sampleField = "Anonymous Inner Class";
protected abstract void printAboutme();
}
static class NestedStaticClass {
private String sampleField = "NestedStaticClass";
public void printAboutMe() {
System.out.println("NestedStaticClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
}
trong ví dụ này có so sánh tất cả các loại phi lớp lồng nhau tĩnh với class.Now lồng tĩnh nếu bạn chạy phương pháp hiển thị của lớp Outer cho mỗi lớp lồng nhau, bạn sẽ thấy đầu ra của mỗi lớp inAbout lồng nhau() phương pháp, trong đó có một số mã phản ánh để in tất cả các biến thành viên của các lớp lồng nhau.
Bạn sẽ thấy đối với các lớp không lồng nhau có một biến thành viên khác ngoài chuỗi biến được khai báo trong mã, chỉ xuất hiện vào thời gian chạy. Ví dụ:
nếu chúng tôi thực thi mã sau cho InnerClass. : -
public class NestedClassesDemo {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.displayInnerClass();
}
}
đầu ra là như thế này: -
InnerClass.printAboutMe.........
private String sampleField
protected OuterClass this$0
Note có thành viên bí ẩn biến $ này 0 của lớp loại kèm theo (lớp Outer).
Bây giờ bạn đã rõ ràng rằng lớp bên trong giữ tham chiếu đến lớp ngoài. Kịch bản hình ảnh nơi bạn chuyển tham chiếu lớp bên trong đến lớp ngoài thế giới khác và sau đó tham chiếu không bao giờ được phát hành đến lượt OuterClass cũng được tham chiếu, do đó bị rò rỉ.
Vì vậy, điều này làm cho việc sử dụng các lớp bên trong trở nên tồi tệ nếu không được sử dụng prpperly.
Không có trường hợp như vậy với các lớp bên trong tĩnh. Vui lòng chạy tất cả các phương thức hiển thị. Ngoài ra, nếu có bất kỳ vấn đề nào trong mã, vui lòng chỉ ra.
Nguồn
2016-02-03 02:03:15
http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –
"Thuật ngữ: Các lớp lồng nhau được chia thành hai loại: tĩnh và không tĩnh. Các lớp lồng nhau được static được khai báo đơn giản được gọi là các lớp lồng nhau tĩnh. Các lớp lồng nhau không tĩnh được gọi là các lớp bên trong. - Từ http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –
Có thể trùng lặp http://stackoverflow.com/questions/487126/is-usage-of-anonymous-classes -in-java-coi-bad-style-or-good –