تفاوت میان inner و nested را که قبلا دوستان توضیح داده اند، anonymous هم نوعی از inner class ها می باشد که در ابتدا شبیه نوعی خلاصه نویسی مطرح می شود مانند مثال زیر (کاربرد های دقیق تر را جلوتر می گویم):
به جای نوشتن
public class WindowClosingAdapter extends WindowAdapter {
public void windowClosing( WindowEvent e ) {
System.exit(0);
}
}
...
addWindowListener( new WindowClosingAdapter() );
می نویسیم:
addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit(0);
}
});
در روش فوق به جای این که ابتدا یک کلاس تعریف کنیم که از WindowsAdapter ارث بری کرده باشد و سپس تابع windowClosing را به آن اضافه (یا override) کنیم، همه را یک جا انجام داده ایم، با تعریف یک رفرنس از کلاس پایه و اضافه کردن تابع مورد نظر در آن به عنوان یک پارامتر در تابع addWindowListener. این کلاس WindowClosingAdapter را که در حالت دوم نامی از آن نبرده ایم anonymous یا ناشناخته می گویند.
این روش تعریف inner class علاوه بر کاربردهای عام کلاس های داخلی، دو کاربرد و مزیت زیر را هم دارد:
1- استفاده از آن ها برای ایجاد چیزی شبیه closureها
2- استفاده ی رایج: راه حلی کوتاه و خلاصه برای تعریف یک کلاس داخلی محلی و ایجاد یک instance از آن.