در این جلسه تیم کدگیت را با آموزش کلاس تودرتو غیر استاتیک در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:
کلاس تودرتو در جاوا
در جاوا میتوانیم یک کلاس را درون یک کلاس دیگر بنویسیم. اگر کلاسی درون کلاس دیگر باشد را کلاس تودرتو در جاوا (Nested Class) میگویند.در کلاس های تودرتو در جاوا تعاریف زیر را به یاد داشته باشید:
- کلاس بیرونی (outer class) کلاسی است که درون آن یک کلاس دیگر نوشتیم.
- کلاس داخلی (inner class) کلاسی است که درون کلاس دیگر است.
انواع کلاس تودرتو
در جاوا کلاس های تو در تو را به 2 دسته تقسیم میکنند. در این آموزش فقط نوع اول این کلاس ها را میگوییم و در جلسه های بعدی نوع دوم را به صورت جداگانه توضیح خواهیم داد:
- Non-static nested class(inner class)
- Member inner class
- Annomynous inner class
- Local inner class
- Static nested class
![](https://codegate.ir/wp-content/uploads/2016/10/inner_classes-2.jpg)
کلاس تودرتو غیر استاتیک در جاوا
در قسمت قبل در مورد انواع کلاس تودرتو در جاوا صحبت کردیم. این قسمت به توضیح کلاس تودرتو غیر استاتیک در جاوا میپردازیم. این نوع کلاسها خود شامل سه قسمت میشوند:
- Member inner class
- Annomynous inner class
- Local inner class
Member inner class
این نوع کلاس ها بسیار ساده اند و فقط کافی است یک کلاس را درون کلاس دیگر نوشت تا یک member inner class ساخته باشیم. این کلاس ها میتوانند static یا final یا protected یا public یا private یا abstract باشند. نکته مهم این است که اگر ما بخواهیم شی از کلاس داخلی بسازیم باید حتما کلاس خارجی آن را هم بسازیم!!! یعنی این کلاس تنها از طریق کلاس خارجی قابل دسترس است(البته منطقی هم است). مثال ساده ای را ببینیم:
public class Outer_class {
private int data = 30;
class Inner_class {
void msg() {
System.out.println("data is " + data);
}
}
public static void main(String args[]) {
Outer_class obj = new Outer_class();
Outer_class.Inner_class in = obj.new Inner_class();
in.msg();
}
}
یک کلاس به نام outer_class ساختیم که کلاس خارجی ما است. در این کلاس فیلدی به نام data تعریف کردیم که private است. کلاس دیگری به نام inner_class تعریف کردیم.این کلاس متدی به نام msg دارد که فیلد data را چاپ میکند(در آموزش قبل گفتیم که کلاس داخلی به فیلدهای کلاس خارجی خود دسترسی دارند).
در متد main نیز ابتدا کلاس خارجی را ساختیم سپس کلاس داخلی را ساختیم و در آخر متد msg را صدا زدیم(به نحوه ساخت کلاس داخلی توسط کلاس خارجی دقت کنید).
Annomynous inner class
در این قسمت از کلاس تودرتو غیر استاتیک در جاوا به معرفی کلاس بی نام میپردازیم. همانطور که از نام آن پیداست این کلاس نامی ندارد. ویژگی های این کلاس به صورت زیر است:
- نام ندارد.
- Constructor ندارد (دلیلش بی نامی کلاس است!!).
- فقط یک بار ساخته میشود.
- معمولا این کلاس را درون متد میسازند.
- فقط در نقطه ای که تعریف شده قابل دسترسی است!!
- نمیتواند static باشد.
- موقعی استفاده میشود که ما متدی را از یک کلاس یا interface بخواهیم override کنیم.
کد زیر مثالی از این نوع کلاس است:
public abstract class Person {
abstract void eat();
}
public class TestAnonymousInnerClass {
public static void main(String[] args) {
Person p = new Person() {
void eat() {
System.out.println("nice fruits");
}
};
p.eat();
}
}
یک کلاس به نام person ساختیم. این کلاس abstract است و نیاز به override متدی به نام eat دارد به همین دلیل میتوانیم از کلاس بی نام استفاده کنیم. در main یک شی از person ساختیم و در همانجا یک کلاس ساختیم که از جنس person است (قبلا گفتیم که نمیتوانیم از کلاس abstract یک شی بسازیم). کلاس بی نام ما دقیقا بعد از new کردن ساخته شده است.
Local inner Class
در آخرین قسمت از کلاس تودرتو غیر استاتیک در جاوا به توضیح Local inner Class میپردازیم. این نوع کلاس ها درون متد نوشته میشوند. محدوده دید این کلاس درون متد است. به مثال زیر توجه کنید:
public class LocalInner {
private int data = 30;// instance variable
void display() {
class Local {
void msg() {
System.out.println(data);
}
}
Local l = new Local();
l.msg();
}
public static void main(String args[]) {
LocalInner obj = new LocalInner();
obj.display();
}
}
یک کلاس به نام Local درون متد display ساختیم. کلاس LocalInner هم کلاس خارجی ما است. در متد display از کلاس درونی خود یک شی ساختیم و از آن استفاده کردیم. درون متد main از کلاس خارجی خود شی ساختیم و متد display را صدا زدیم(خروجی برنامه چاپ مقدار data است).