JavaRush /وبلاگ جاوا /Random-FA /تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا...

تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا. قسمت 5

در گروه منتشر شد
سلام سلام! امروزه توسعه دهندگان جاوا تقاضای زیادی دارند. البته من نمی‌توانم جای خالی برای شما فراهم کنم، اما سعی می‌کنم به شما در کسب دانش جدید و رفع برخی از شکاف‌ها کمک کنم. بنابراین ما به تجزیه و تحلیل بیش از 250 سوال مصاحبه برای توسعه دهنده جاوا ادامه می دهیم. پیوندهای قسمت های قبلی تحلیل در انتهای مقاله موجود است.تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 1

39. اصلاح کننده های دسترسی در جاوا چیست؟ آنها را نام ببر. آنها برای چه مواردی مناسبند؟

من قبلاً اصلاح کننده های دسترسی را در سؤال در مورد عناصر کپسوله سازی جاوا توضیح دادم. اما به هر حال به شما یادآوری می کنم. اصلاح کننده های دسترسی در جاوا کلمات کلیدی هستند که سطح دسترسی اعطا شده به یک جزء خاص جاوا را توصیف می کنند. اصلاح کننده های دسترسی می توانند:
  • عمومی - یک عنصر با این اصلاح کننده برای عموم قابل دسترسی خواهد بود. آن ها فیلدها و متدها، کلاس های اعلام شده با اصلاح کننده عمومی برای سایر کلاس ها هم از بسته فعلی و هم از بسته های خارجی قابل مشاهده هستند.
  • محافظت شده - یک عنصر با این اصلاح کننده از هر جایی در کلاس فعلی بسته فعلی یا در کلاس های فرعی قابل دسترسی خواهد بود، حتی اگر آنها در بسته های دیگر باشند.
  • پیش‌فرض ، یا اصلاح‌کننده گمشده - این اصلاح‌کننده به طور ضمنی زمانی استفاده می‌شود که اصلاح‌کننده دسترسی اصلاً مشخص نشده باشد. مشابه قبلی است، با این تفاوت که در کلاس‌های فرعی که در بسته‌های دیگر هستند، قابلیت مشاهده وجود دارد.
  • private از همه اصلاح کننده ها خصوصی ترین است، که اجازه دسترسی به عنصر را فقط در کلاس فعلی می دهد.
تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 2

40- ویژگی اصلی روش های استاتیک و متغیر را نام ببرید

یک فرمول بسیار عجیب - "روش های متغیر". مطمئناً این به روش های معمولی و غیر ایستا اشاره دارد. بنابراین، تفاوت اصلی این است که متدهای استاتیک متعلق به کلاس هستند و در واقع، برای آنها نیازی به ایجاد نمونه ای از این کلاس نیست: فقط با استفاده از نوع کلاس می توان آن را فراخوانی کرد. به عنوان مثال، ما یک روش ثابت برای نوازش گربه داریم:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
برای فراخوانی آن به نمونه ای از کلاس CatService نیاز نداریم :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
در حالی که متدهای معمولی به یک شی محدود می شوند (متعلق به) هستند و برای فراخوانی آنها باید یک نمونه (ابجکت) داشته باشید که در آن متد فراخوانی شود. به عنوان مثال، یک گربه یک روش غیر ساکن دارد - میو:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
برای فراخوانی این روش، به یک نمونه خاص از گربه نیاز داریم:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. محدودیت های اصلی در روش استاتیک و "متغیر" چیست؟

همانطور که قبلاً گفتم، محدودیت اصلی یک متد معمولی این است که همیشه باید نمونه ای وجود داشته باشد که متد بر اساس آن فراخوانی شود. اما یک روش ایستا به این نیاز ندارد، اما نمی تواند به این ارجاع - به عناصر شی فعلی - اشاره کند زیرا شی فعلی برای آن وجود ندارد.

42. کلمه کلیدی ثابت به چه معناست؟ آیا می توان یک روش استاتیک را overrid یا overload کرد؟

عنصری که با کلمه کلیدی استاتیک تعیین می شود به یک شی از کلاس تعلق ندارد، بلکه به کلاس تعلق دارد و زمانی بارگذاری می شود که خود کلاس بارگذاری شود. عناصر استاتیک تنها برای کل برنامه هستند و عناصر معمولی تنها برای یک شی خاص هستند. استاتیک می تواند باشد:
  • فیلدهای کلاس؛
  • بلوک اولیه سازی کلاس؛
  • روش کلاس؛
  • کلاس های داخلی یک کلاس (با این حال، این هنوز یک توتولوژی است).
یک متد استاتیک را نمی توان نادیده گرفت: به کلاس تعلق دارد و به ارث نمی رسد، اما در عین حال می تواند بیش از حد بارگذاری شود.

43. آیا یک روش می تواند در عین حال ایستا و انتزاعی باشد؟

قبلاً در مقاله قبلی به این موضوع اشاره کردم: یک روش نمی تواند همزمان انتزاعی و ایستا باشد. انتزاعی بودن یک روش به این معنی است که باید در جانشینی آن را نادیده گرفت. در عین حال، یک متد استاتیک به کلاس تعلق دارد و نمی توان آن را نادیده گرفت: این باعث تناقض می شود که کامپایلر آن را می بیند و شروع به فحش دادن می کند. اگر چنین موقعیتی دارید، باید به طور جدی به درستی معماری برنامه خود فکر کنید (در نهایت، واضح است که مشکلی در آن وجود دارد).تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 3

44. آیا می توان از روش های استاتیک در وسط روش های معمولی استفاده کرد؟ برعکس؟ چرا؟

روش های استاتیک را می توان در روش های معمولی استفاده کرد، زیرا هیچ چیز مانع این کار نمی شود. در عین حال، وضعیت معکوس غیرممکن است: یک روش استاتیک نمی تواند از یک روش معمولی بدون ارجاع به یک نمونه خاص از این کلاس استفاده کند. و همانطور که به یاد می آوریم، این مرجع برای اعضای کلاس ایستا در دسترس نیست: می توانید هر تعداد شیء خاص از کلاس که بخواهید وجود داشته باشد، و هر یک از آنها یک مرجع به خود در داخل خواهند داشت - این . و سپس چگونه متوجه می شوید که کدام پیوند را باید انتخاب کنید؟ اما به هیچ وجه. بنابراین، عناصر ایستا بدون ارجاع به یک شی خاص نمی توانند به غیر ایستا اشاره کنند. در واقع، یک متد استاتیک تنها در صورتی می‌تواند از یک روش غیراستاتیک استفاده کند که به یک شی خاص اشاره داشته باشد. به عنوان مثال، آن چیزی که به عنوان استدلال آمده است:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
در اینجا می بینیم که متد استاتیک petTheCat متد معمولی و غیراستاتیک شی Cat - getName را فراخوانی می کند .

45. رابط چیست؟ آیا یک رابط نهایی وجود دارد؟

همانطور که به یاد داریم، در جاوا وراثت چندگانه وجود ندارد. اینترفیس ها جایگزینی برای آن هستند. رابط کاربری به نظر یک کلاس بسیار ساده است. آنها عملکرد را بدون پیاده سازی خاصی تعریف می کنند که توسط کلاس هایی که این رابط ها را پیاده سازی می کنند (اجرا می کنند) پیاده سازی می کنند. مثال رابط:
public interface Animal {
    void voice();
}
نمونه ای از پیاده سازی رابط توسط یک کلاس:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
نکته اصلی که باید در مورد استفاده از رابط ها بدانید این است:
  1. متدهای واسط باید فقط شامل یک هدر، بدون بدنه متد خاص، یعنی. باید انتزاعی باشد (اما بدون استفاده از کلمه کلیدی انتزاعی ). استثناء این روش، متدهای استاتیک و پیش فرض است که به بدنه متد نیاز دارند.
  2. یک کلاس می‌تواند رابط‌های زیادی را پیاده‌سازی کند (همانطور که گفتم، این جایگزینی برای وراثت چندگانه است)، که با کاما از هم جدا می‌شوند: کلاس Lion پیاده‌سازی Animal، Wild .
  3. رابط ها با استفاده از کلمه کلیدی - رابط ایجاد می شوند .
  4. هنگام پیاده سازی یک رابط توسط یک کلاس، کلمه کلیدی Implements است .
  5. کلاسی که یک اینترفیس خاص را پیاده سازی می کند باید تمام متدهای انتزاعی خود را پیاده سازی کند یا باید خود را انتزاعی اعلام کند.
  6. هدف اصلی از استفاده از رابط ها، پیاده سازی چند شکلی (توانایی اشیاء برای به خود گرفتن اشکال مختلف) است.
  7. به عنوان یک قاعده، اصلاح‌کننده‌های دسترسی برای متدها در رابط نوشته نمی‌شوند: آنها به‌طور پیش‌فرض عمومی هستند و اصلاح‌کننده‌های دیگری غیر از public را نمی‌توان مشخص کرد. از جاوا 9، می توانید از اصلاح کننده های خصوصی برای روش ها استفاده کنید.
  8. متغیرهای رابط به طور پیش‌فرض نهایی ثابت هستند ، به عبارت دیگر، ثابت هستند: آنها همیشه باید مستقیماً در واسط مقداردهی اولیه شوند.
  9. شما نمی توانید یک شی رابط ایجاد کنید.
پاسخ به این سوال که آیا اینترفیس ها می توانند نهایی باشند البته نه. از این گذشته، ماهیت اینترفیس ها این است که پیاده سازی شوند. و همانطور که همه ما به خوبی به یاد داریم، نهایی در سطح کلاس باعث می شود آن را غیرقابل ارث بری، و در مورد یک رابط، غیر قابل پیاده سازی. چرا به رابطی نیاز داریم که قابل پیاده سازی و استفاده نباشد؟ درست است - نیازی نیست! و کامپایلر اینطور فکر می کند)) تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 4معنی فقط با معرفی روش های استاتیک در رابط های جاوا 8 ظاهر شد، اما این واقعیت را تغییر نداد که رابط نمی تواند نهایی باشد. من در مورد رابط ها صحبت کردم، بسیار سطحی، زیرا ... این یک موضوع گسترده است. در مقاله‌های مربوط به رابط‌ها در جاوا و تفاوت بین کلاس‌های انتزاعی و اینترفیس‌ها در این مورد بیشتر بخوانید .

46. ​​از کجا می توانم فیلدهای استاتیک را مقداردهی اولیه کنم؟

فیلدهای استاتیک را می توان مقدار دهی اولیه کرد:
  • مستقیماً پس از اعلام، از طریق علامت مساوی = ;
  • در یک بلوک اولیه سازی استاتیک؛
  • در یک بلوک اولیه غیر استاتیک، اما باید بدانید که هر بار که یک شی ایجاد می شود، این فیلد توسط این بلوک اولیه بازنویسی می شود.
  • در سازنده کلاس هر بار که این سازنده فراخوانی می شود (یعنی وقتی یک شی از طریق این سازنده ایجاد می شود)، این فیلد بازنویسی می شود.
  • در روش های استاتیک؛
  • در روش های غیر استاتیک؛
  • در کلاس های داخلی استاتیک و غیر ایستا، محلی و ناشناس.

47. کلاس های ناشناس چیست؟

کلاس های ناشناس کلاس هایی هستند که نوع خاص خود را ندارند. من در مورد چه چیزی صحبت می کنم؟ وقتی در مورد اینترفیس ها صحبت کردیم، اشاره کردم که شما نمی توانید یک شی رابط ایجاد کنید: شما فقط می توانید یک شی از یک کلاس ایجاد کنید که رابط را پیاده سازی می کند. اگر نمی خواهید یک رابط را در یک کلاس پیاده سازی کنید، اما همچنان به یک شی از نوع رابط نیاز دارید، چه؟ و به احتمال زیاد، این یک مورد واحد از استفاده از این شی خواهد بود. و نیازی به ایجاد یک کلاس پیاده سازی کامل ندارید. چطور این کار رو می کنی؟ درست! از طریق یک کلاس ناشناس! تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 5بیایید بگوییم که ما یک رابط Animal داریم :
public final interface Animal {
   public void voice();
}
اگر بخواهیم این رابط را از طریق یک کلاس ناشناس نمونه سازی کنیم:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
و سپس می توانید با خیال راحت از این شی و روش پیاده سازی شده آن - voice استفاده کنید . یعنی یک کلاس ناشناس این رابط و تمام متدهای انتزاعی آن را اینجا و اکنون پیاده سازی می کند. در غیر این صورت، ما نمی‌توانیم یک شی کلاس رابط/انتزاعی ایجاد کنیم، زیرا متدهای اجرا نشده/انتزاعی وجود دارد. همانطور که اشاره کردم، کلاس های ناشناس نه تنها برای پیاده سازی متدهای انتزاعی یک رابط، بلکه برای پیاده سازی متدهای انتزاعی یک کلاس انتزاعی نیز استفاده می شوند. این رویکرد برای موقعیت‌هایی خوب است که یک شی یکبار استفاده می‌شود یا یک پیاده‌سازی معین از متدها فقط یک بار مورد نیاز است، و نیازی به ایجاد کلاس جداگانه‌ای نیست که کلاس/رابط انتزاعی مورد نیاز را پیاده‌سازی کند. اما من همچنین متذکر می شوم که استفاده از کلاس های ناشناس یک اتفاق نادر در کار است: به عنوان یک قاعده، اولویت همچنان به کلاس های معمولی داده می شود. در این مقاله می‌توانید درباره کلاس‌های ناشناس بیشتر بخوانید .

48- طبقات اولیه چیست؟

در مورد من، این یک سوال بسیار عجیب است و، شاید، این یک سوال دام است، زیرا در جاوا چیزی به نام کلاس های اولیه وجود ندارد: به جز مفهوم انواع اولیه، که قبلاً قبلاً در نظر گرفتیم. همانطور که به یاد داریم، 8 نوع اولیه در جاوا وجود دارد - بایت ، کوتاه ، int ، طولانی ، شناور ، دوبل ، char ، بولی .تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 6

49. کلاس "wrapper" چیست؟

مشکل اصلی استفاده از انواع اولیه در جاوا این است که آنها هنوز کلاس نیستند و جاوا هنوز یک زبان OOP است. یعنی برنامه های نوشته شده به این زبان به تعامل بین اشیاء تقلیل می یابد. خب، بدوی اشیاء نیستند. آنها متدهایی ندارند، حتی متدهای استاندارد کلاس Object . خوب، اگر لازم بود از یک کلید به عنوان کلید در Map استفاده کنیم چه؟ سپس باید متد hashCode را فراخوانی کنید . همچنین می توانید متد برابر را در آنجا فراخوانی کنید . بعدش چی شد؟ ممکن است لحظات بسیار بسیار زیادی وجود داشته باشد که باید یک کلاس وجود داشته باشد، نه یک کلاس اولیه، که باعث می شود عناصر اولیه استفاده نشده و نامطلوب در برنامه وجود داشته باشد، زیرا این ایده اصلی OOP را از بین می برد. اما همه چیز آنقدر که به نظر می رسد بد نیست. پس از همه، جاوا مفهوم یک wrapper اولیه را دارد. هر نوع اولیه یک کلاس آنالوگ دارد:
  • byte -> Byte.class
  • short -> Short.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Character.class
  • boolean -> Boolean.class
این نمایشی از انواع ساده است، اما در قالب کلاس های تمام عیار با دسته ای از روش های متنوع و کاربردی. برای استفاده راحت از این کلاس ها، مفاهیم اتوباکسینگ و جعبه گشایی معرفی شدند. Autoboxing - تبدیل خودکار یک نوع اولیه به یک کلاس آنالوگ در صورت لزوم (به عنوان مثال، int به عدد صحیح ). جعبه‌گشایی فرآیند معکوس فرآیند قبلی است: تبدیل خودکار یک کلاس wrapper اولیه به یک نوع اولیه (مثلاً Integer به int ). به لطف معرفی کلاس های بسته بندی اولیه و فرآیندهای خودکار و جعبه گشایی ، انواع اولیه توانستند به اعضای کامل زبان OOP - جاوا تبدیل شوند. برای کسب اطلاعات بیشتر در مورد این موضوع، خواندن این مقاله راتجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 7 به شدت توصیه می کنم .

50. کلاس تودرتو چیست؟ چه زمانی استفاده می شود؟

کلاس تودرتو یک کلاس داخلی است که عضوی از کلاس دیگری است. در جاوا 4 نوع کلاس داخلی وجود دارد: 1. کلاس داخلی این نوع کلاس مستقیماً در بدنه یک کلاس دیگر اعلان می شود. یک کلاس داخلی تو در تو می تواند به هر فیلد خصوصی یا روش نمونه ای از کلاس خارجی دسترسی داشته باشد. به عنوان مثال، بیایید یک باغ وحش ایجاد کنیم که در آن یک حیوان - گورخر خواهیم داشت:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
هیچ چیز پیچیده ای نیست، درست است؟ بیایید نگاهی به مثالی از ایجاد یک شی کلاس داخلی بیندازیم:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
همانطور که قبلاً دیدید، ایجاد یک شی از کلاس فریمینگ ضروری است که بر اساس مرجع آن می توانید یک شی از کلاس داخلی ایجاد کنید. همچنین می‌خواهم توجه داشته باشم که یک کلاس داخلی تودرتو نمی‌تواند متدهای ثابت یا فیلدهای استاتیک داشته باشد. به این دلیل است که یک کلاس داخلی به طور ضمنی با شی کلاس خارجی خود مرتبط است و نمی تواند هیچ روش ایستا را در خود اعلام کند. 2. کلاس های تودرتو ایستا این کلاس مشابه کلاس قبلی است، فقط یک اصلاح کننده دسترسی استاتیک در نزدیکی اعلان کلاس دارد. از آنجایی که این نوع کلاس به فیلدهای غیراستاتیک کلاس بیرونی دسترسی ندارد، بیشتر شبیه به قسمت استاتیک کلاس خارجی است تا کلاس داخلی. در این حالت، داده های کلاس به تمام اعضای ثابت کلاس بیرونی، حتی خصوصی، دسترسی دارند. مثالی از یک کلاس تودرتو ایستا:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
روش ایجاد کمی متفاوت از روش قبلی است:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
در اینجا ما برای ایجاد یک شی از یک کلاس استاتیک تو در تو نیازی به یک شی از یک کلاس خارجی نداریم. از کلاس خارجی فقط به نوع آن نیاز داریم تا بتوانیم محل کلاس تودرتو را پیدا کنیم. 3. کلاس های محلی کلاس های محلی کلاس هایی هستند که در بدنه یک متد اعلام شده اند و ایجاد و استفاده از یک شی از یک کلاس محلی منحصراً در این متد امکان پذیر است. مثال:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
مثال استفاده:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
بدون دیدن کد متد toFeed ، حتی به وجود یک کلاس محلی مشکوک نمی‌شوید، درست است؟ یک کلاس محلی نمی تواند ایستا یا گذرا باشد ، اما می تواند به عنوان انتزاعی یا نهایی علامت گذاری شود (فقط OR، زیرا استفاده از این دو اصلاح کننده باعث تضاد می شود). 4. کلاس های ناشناس قبلاً در مورد کلاس های ناشناس در بالا صحبت کرده ایم، و همانطور که به یاد دارید، آنها می توانند از دو منبع ایجاد شوند - رابط ها و کلاس ها. دلایل استفاده از کلاس‌های استاتیک و غیراستاتیک داخلی به این دلیل است که گاهی اوقات بهتر است کلاس‌های کوچک را در کلاس‌های بزرگ‌تر جاسازی کنیم و در کنار هم نگه داریم: به این ترتیب انسجام بالاتر و هدف مشترکی خواهند داشت. در واقع، استفاده از کلاس‌های تو در تو، کپسوله‌سازی کد را افزایش می‌دهد. دلیل انتخاب کلاس های محلی ممکن است این باشد که یک کلاس معین منحصراً در یک متد استفاده می شود. در این صورت آیا لازم است کد را در سراسر اپلیکیشن پخش کنید؟ خیر اما در عین حال اضافه می کنم که در عمل من هرگز استفاده از کلاس های محلی را ندیده ام، زیرا نیاز به آنها بسیار بحث برانگیز است. خوب، دلیل استفاده از کلاس های ناشناس ممکن است این باشد که یک پیاده سازی خاص از یک رابط یا کلاس انتزاعی فقط یک بار مورد نیاز است، بنابراین نیازی به ایجاد یک کلاس جداگانه و کامل با یک پیاده سازی برای این کار نیست. در عوض، به روشی ساده، متد(های) مورد نیاز خود را از طریق یک کلاس ناشناس پیاده سازی کردیم، از این شی استفاده کردیم و آن را فراموش کردیم (خوب، گردآورنده زباله آن را به خاطر آورد). این مقاله و اینتجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 8 مقاله به شما کمک می کند تا کلاس های داخلی را با جزئیات بیشتری مطالعه کنید .

51. یک کلاس چه تغییر دهنده دسترسی می تواند داشته باشد؟

همانطور که به یاد داریم، انواع مختلفی از کلاس ها وجود دارد و اصلاح کننده های دسترسی متفاوتی برای آنها قابل استفاده هستند:
  • یک کلاس بیرونی می تواند اصلاح کننده دسترسی عمومی داشته باشد یا بدون اصلاح کننده باشد (اصلاح کننده پیش فرض).
  • کلاس داخلی از هر 4 اصلاح کننده دسترسی پشتیبانی می کند.
  • کلاس استاتیک تو در تو از همه اصلاح کننده های دسترسی به جز محافظت شده پشتیبانی می کند ، زیرا این اصلاح کننده دلالت بر وراثت دارد که با عضو ثابت کلاس در تضاد است (عناصر استاتیک به ارث نمی رسند).
  • یک کلاس محلی فقط می تواند یک اصلاح کننده پیش فرض داشته باشد (یعنی اصلاً اصلاح کننده ای وجود ندارد).
  • کلاس ناشناس : اگر اعلان نوع کلاس وجود نداشته باشد، اصلاً تغییر دهنده دسترسی وجود ندارد.
این همان جایی است که امروز متوقف خواهیم شد. به زودی میبینمت!تجزیه و تحلیل پرسش و پاسخ از مصاحبه برای توسعه دهنده جاوا.  قسمت 5 - 9
سایر مواد این سری:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION