Learn Java
304 subscribers
92 photos
1 video
94 files
84 links
یاد گیری زبان برنامه نویسی جاوا و نکات و مفاهیم
کاربردی ان



@parsa8113
@bardiademon
Download Telegram
کدام زبان برنامه نویسی برای یادگیری #اندروید بهتر است؟؟

👈برای افرادی که #تازه_کار هستند و سوالاتی در مورد بهترین زبان برای یادگیری و کار با اندروید دارند، پیشنهاد می کنم مطالب زیر را مطالعه بفرمایند و برای دیگران هم که دچار این ابهام هستند، این مطلب را فوروارد کنند.

زبان رسمی برای توسعه اندروید، #جاوا می باشد.بخش های بزرگی از اندروید به زبان جاوا نوشته شده اند وAPIهای آن نیز به گونه ای طراحی شده اند که در درجه اول توسط جاوا اجرا شوند.
با این حال می توان با بکارگیری ابزاری به نامNDK که توسط گوگل ارائه می شود، با استفاده از زبان های سی یا سی پلاس پلاس هم برنامه های اندرویدی را توسعه داد، اما این چیزی نیست که کمپانی گوگل سعی در ترویج آن داشته باشد.

❗️به گفته شرکت گوگل، "استفاده ازNDk در اکثر برنامه ها مصلحت نمی باشد و مزیت خاصی نخواهد داشت".شما به عنوان یک توسعه دهنده باید مزایای استفاده ازNDk را در برابر اشکالات استفاده از آن بررسی کنید و بین آن ها یک تعادل برقرار کنید.آن چه که باید به آن توجه کرد، این است که استفاده ازNDK در اندروید، تاثیر قابل ملاحظه ای در بهبود عملکرد برنامه ها نخواهد داشت و همیشه به پیچیدیگی برنامه شما می افزاید.

باقی ماجرا را در لینک های زیر ببینید. در این لینک ها به وضوح در مورد انتخاب زبان مناسب برای برنامه نویسی اندروید توضیح داده شده است.

در مورد محیط توسعه اندروید هم، شکی نیست که اندروید استودیو کامل ترین و مناسب ترین محیط خواهد بود.

https://stackoverflow.com/questions/3949980/what-programming-languages-can-one-use-to-develop-android-applications

https://stackoverflow.com/questions/1994703/which-programming-languages-can-i-use-on-android-dalvik

https://stackoverflow.com/questions/3316801/which-programming-languages-can-be-used-to-develop-in-android

https://stackoverflow.com/questions/3316801/which-programming-languages-can-be-used-to-develop-in-android

@this_java
اساسی ترین کار در علم کامپیوتر انتخاب مناسب الگوی معماری (Architecture Pattern) پروژه است. تنها راهی است که میتوان پروژه را براساس آن تمیز (clean)، گسترش پذیر (expansible) و قابل تست (testable) نگهداری کرد. الگوها روش های شناخته شده ای هستند که در طول سال های برنامه نویسی بوجود آمده اند، تست شده اند، بهینه شده اند و امروزه بعنوان استاندارد شناخته میشوند. آنها بطور مدارم درحال متحول شدن هستند. بعنوان نمونه در اندروید الگوی معتبر (Model-View-Controller (MVC به الگوی (Model-View-Presenter (MVP تغییر کرده است.
منبع:kamalan.ir
@this_java
کدام کتابخانه Networking؟

کتابخانه OkHTTP: توسط Square تولید شده. مناسب برای Streaming و استفاده General مبتنی بر HTTP. پشتیبانی از POST, GET, UPLOAD. دارای مستندات آموزشی. زیربنای پیشفرض Retrofit و Picasso. یکی از زیربناهای Volley هستش. دارای disk cache. پشتیبانی از conn pooling. از پروتکل SPDY پشتیبانی می کنه. از اندروید 4.4 به بعد بصورت builtin در زیربنای اندروید استفاده شده. پشتیبانی از NewIO و...

کتابخانه Retrofit: توسط Square تولید شده. مناسب برای RESTful API / Web Service. پشتیبانی از POST, GET, PUT, DELETE, Multipart. دارای مستندات آموزشی. مبتنی بر کلاینت OkHTTP. دارای disk cache. پشتیبانی از async با کمترین کد. دارای cancellation و retry برای درخواست ها. پشتیبانی از Dynamic URL. کمی کندتر از Volley اما سریعتر از AsyncTask هستش. دارای مفسر پیشفرض JSON و تبدیلش به POJO بکمک GSON. پشتیبانی از NewIO. پشتیبانی از فعالیت های background.

کتابخانه Volley: توسط Google پشتیبانی شده. مناسب برای استفاده General و کار با تصاویر. پشتیبانی از POST, GET, PUT, DELETE. دارای مستندات آموزشی. دارای کلاینت های OkHTTP, Apache, HttpUrlConnection. دارای memory cache. پشتیبانی از conn pooling. پشتیبانی از async با کمترین کد. دارای prioritization, cancellation, retrying برای درخواست ها. پشتیبانی از Dynamic URL. کمی سریعتر از Retrofit هستش. پشتیبانی از Image loading. دارای bitmap caching. سازگاری مناسب با activity lifecycle. دارای memory error handing مناسب. هندل کننده duplicate calls. استفاده نسبتاً آسان.
@this_java
فرگمنت (Fragment) چیست
فرگمنت . (Fragment را می توان به عنوان یک زیر مجموعه و یا یک بخش از اکتیویتی (sub-activity) در نظر گرفت که در نهایت قسمتی از رابط کاربری را تشکیل داده و به واسطه آن یک رابط کاربری چند قسمتی ایجاد می شود. فرگمنت در اندروید مشابه آنچه قبلا برای اکتیویتی ها آموختیم، چرخه حیات و رفتار خاص خود را دارد، رویدادهای ورودی را دریافت می کند و از دو قسمت xml (لایه واسط کاربری) و کد عملیاتی (java) تشکیل شده است. هر اکتیویتی می تواند چندین فرگمنت را در خود جای دهد و هر فرگمنت می تواند در چندین اکتیویتی استفاده شود. بنابراین فرگمنت به تنهایی قابلیت اجرا ندارد و به اکتیویتی والد و چرخه حیات آن وابسته است. فرگمنت از API 11 (اندروید Honeycomb) اضافه شد.

@this_java
Dangling else
همیشه کامپایلر جاوا یک else را بلافاصله با یک if در نظر می گیرد , مگر اینکه خلاف آنرا با استفاده از براکت ها {} مشخص کنید. به این مشکل dangling-else می گویند. برای مثال ,
if (x > 5)
if (y>5)
System.out.println("x and y are > 5");
else
System.out.println("x is <= 5");

به نظر میرسد که اگر x بزرگتر از ۵ باشد , عبارت if تو در تو تعیین می کند که آیا y نیز بزرگتر از ۵ است یا خیر. اگر چنین باشد , رشته ی x and y are >5 در خروجی چاپ می شود. در غیر اینصورت اگر x بزرگتر از ۵ نباشد , بخش else از عبارت if..else رشته ی x is <=5 را چاپ خواهد کرد. با این همه امکان دارد عبارت تو در توی فوق مطابق با انتظار کار نکند.. تفسیر کامپایلر از عبارت بالا بصورت زیر خواهد بود :


if (x > 5)
if (y>5)
System.out.println("x and y are > 5");
else
System.out.println("x is <= 5");

که در ان بدنه اولین عبارت if یک عبارت if..else تو در تو است . در این عبارت اگر x از ۵ بزرگتر باشد شرط دوم اجرا میشود و در صورت برقرار نبودن شرط دوم عبارت else اجرا میشود
برای اینکه عبارت فوق به نحوی کار کند که از ان انتظار داریم بایستی کل عبارت بصورت زیر نوشته شود :


if (x > 5) {
if (y>5)
System.out.println("x and y are > 5");
}
else
System.out.println("x is <= 5");
براکت ها نشان میدهند که دومین if در بنده اولین if قرار دارد و else در ارتباط با اولین if میباشد
@this_java
مقادیر تصادفی در جاوا ایا واقعا تصادفی تولید میشوند؟
درواقع مقادیر تصادفی تولید شده در جاوا (مثلا با استفاده از کلاس Random و یا SecureRandom) مقادیر شبه تصادفی هستند- دنباله ای از مقادیر تولید شده با محاسبات پیچیده ریاضی. در این محاسبات از زمان استفاده میشود (که مدام در حال تغییر است) تا دنباله ای مقادیر تصادفی متفاوت ازهم تولید شود.
@this_java
کلاس های انتزاعی

هنگامی که در مورد نوع یک کلاس فکر می کنیم , فرض ما بر این است که برنامه ها اقدام به ایجاد شی ها از نوع تعیین شده خواهند کرد. با این همه , گاهی اوقات فقط کلاس ها تعریف میشوند و برنامه نویسان هرگز قصد ندارند هیچ شی را نمونه سازی کنند. چنین کلاس هایی, کلاس های انتزاعی نامیده میشود. چرا که چنین کلاس هایی معمولا بعنوان سوپرکلاس ها در سلسه مراتب توارث بکار گرفته میشوند, از اینرو معمولا با عنوان سوپر کلاس های انتزاعی شناخته می شوند.

هدف از کلاس های انتزاعی

هدف از یک کلاس انتزاعی فراهم اوردن یک سوپر کلاس مناسب از سایر کلاس ها است که ممکن است به ارث برسند و طرح مشترکی را به اشتراک بگذارند. کلاس هایی که میتوانند در نمونه سازی شی ها بکار گرفته شوند , کلاس های مقید (غیر انتزاعی) نام دارند
چنین کلاس هایی تدارک بیننده پیاده سازی هر متد هستند که اعلان می کنند (برخی از پیاده سازی ها را می توان به ارث برد).
برای مثال میتوانیم یک سوپر کلاس انتزاعی بنام TwoDimensionalShape ‌و زیر کلاس های مقید همانند Square و Triangle داشته باشیم. همچنین میتوانیم یک سوپر کلاس انتزاعی بنام ThreeDimensionalShape و زیر کلاس های مقید همانند Cube, Sphere, Testrahedron داشته باشیم. سوپر کلاس های انتزاعی برای تعریف شی های واقعی بسیار کلی هستند , از اینرو قبل از اینکه شی را نمونه سازی کنیم باید با دقت در مورد ان فکر کنیم.
برای مثال اگر شخصی به شما بگوید شکلی دو بعدی ترسیم کنید باید بپرسید چه شکلی؟

نحوه تعریف کلاس انتزاعی

اعلان کلاس همراه با کلمه کلیدی abstract انرا بصورت یک کلاس انتزاعی ایجاد میکند. معمولا یک کلاس انتزاعی حاوی یک یا چند متد انتزاعی است (این مقدار به صفر نمیرسد زیرا دلیل وجود کلاس انتزاعی تعریف متد های انتزاعی میباشد). متد انتزاعی متدی است که با کلمه کلیدی abstract در اعلان خود همراه شده باشد , همانند :
public abstract class Parsa{
public abstract void draw(); // abstract method
}
متد های انتزاعی پیاده سازی انجام نمی دهند. هر کلاسی که حاوی هر متد انتزاعی است باید به صورت یک کلاس انتزاعی تعریف شود حتی اگر کلاس حاوی متد های مقید باشد. همچنین هر زیر کلاس مقید از یک سوپر کلاس انتزاعی باید پیاده سازی مقید از متد های انتزاعی سوپر کلاس را فراهم اورد (در مثال بالا زیر کلاسی که از کلاس Parsa ارث بری کرده است الزاما باید متد draw را پیاده سازی کند) . سازنده ها و متد های استاتیک نمی توانند بصورت abstract اعلان شوند. سازنده ها ارث بری ندارند از اینرو هرگز نمیتوان یک سازنده abstract را پیاده سازی کرد. به همین ترتیب زیر کلاس ها نمیتوانند متد های استاتیک را override یا تعریف مجدد کنند و از اینرو نمیتوان یک متد استاتیک abstract را پیاده سازی کرد

احتمالا این سوال برای شما پیش امده که به چه دلیل نمیتوان متد های استاتیک را override کرد...

بدلیل اینکه متد های استاتیک در جاوا به اشیاء ساخته شده از یک کلاس تعلق ندارند و اصطلاحا متد های در سطح کلاس هستند و نمی توان آنها را در کلاس فرزند override کرد و اگر یک متد استاتیک در کلاس فرزند دقیقا با همان امضای متد کلاس پدر وجود داشته باشد خطایی رخ نمی دهد و برنامه بدرستی کامپایل می شود.
در این موارد گفته می شود کد متد فرزند متد پدر را hide کرده است و به این کار override گفته نمی شود چون هنوز متد کلاس پدر در سطح همان کلاس قابل دسترسی است.
@this_java
کلمه کلیدی volatile در جاوا چیست?

این کلمه‌ی کلیدی در مبحث thread مطرح می‌شود. وقتی چند thread با یک متغیر (مثلا یک شی) عادی کار می‌کنند، ممکن است آن را cache کنند. یعنی هر thread ای که این متغیر را cache کند، یک نسخه از آن گرفته و با آن کار می‌کند (تغییرات اعمالی بر روی آن توسط یک thread، به سایر thread ها منعکس نمی‌شود)
اگر آن متغییر با کلمه‌ی کلیدی volatile تعریف شود، تنها یک نسخه از آن متغیر وجود دارد و تغییراتی که یک thread بر روی آن انجام می‌دهد، بلافاصله در thread های دیگر منعکس می‌شود.

نحوه ی تعریف:
کافیست قبل از تعریف شی volatile بنویسید .. مثال:
volatile int thisjava = 20;

طرز کار volatile
عمل خواندن و نوشتن یک متغیر volatile به صورت atomic و در حافظه‌‌ی اصلی (Main Memory) انجام می‌شود. (از کش استفاده نمی‌شود و هر تغییری مستقیماً در حافظه ثبت می‌شود؛ لذا استفاده از یک متغیر volatile، کارایی (Performance) برنامه را نسبت به استفاده از متغیر معمولی کاهش می‌دهد).

عمل atomic

عملی است که قابل تجزیه به اعمال کوچک‌تر نباشد! عمل atomic یا به طور کامل انجام می‌شود یا انجام نمی‌شود و هیچ اتفاقی نمی‌تواند در وسط اجرای یک عمل atomic صورت پذیرد.

عمل خواندن و نوشتن متغیرهای مرجع (reference variable) و بیشتر داده‌های نوع اولیه (به غیر از double و long)، اتمیک به حساب می‌آید.
عمل خواندن و نوشتن متغیرهای از نوع volatile (حتی متغیرهای از نوع double و long)، اتمیک به حساب می‌آید.

متغیرهای double و long از دو نوع داده‌ی کوچکتر (int و float) در سطح JVM استفاده می‌کنند و تغییرات بر روی آن‌ها، در حقیقت تغییر بر روی دو متغیر به حساب می‌آید؛ لذا عمل خواندن و نوشتن نوع داده‌های long و double، اتمیک نخواهد بود؛ مگر اینکه از نوع volatile باشند.

نکته :
این کلید واژه تنها در برنامه هایی که از چند نخ استفاده میکنند کاربرد دارد

یک متغیر نمیتواند همزمان final و volatile باشد
omtimizer
برای بهبود کدها می‌توانند کدها را جابه‌جا کند و در جاهایی روش‌های مقداردهی را نیز تغییر دهد؛ تا کد نهایی بهینه‌تری ایجاد شود. ولی متغیرهایی که از نوع volatile تعریف شوند، توسط optimizer دستکاری نمی‌شوند.
@this_java
کلمه کلیدی strictfp در جاوا به چه معناست؟
توسعه دهنده می تواند با استفاده از کلیدواژه ی strictfp مطمئن شود هر گونه عملیاتی که بر روی مقدار متغیر از نوع ممیز شناور (floating-point) انجام می شود، در تمامی بسترهای اجرا (platform) نتیجه ی یکسان را برمی گرداند. در واقع دقت و تعداد اعداد (precision) در مقادیر خروجی ممیز شناور ممکن است در بسترهای (platform) مختلف متفاوت باشد. جهت رفع این مشکل Java کلیدواژه ی strictfp را ارائه کرده است تا نتایج (خروجی) در تمامی platform ها و محیط های اجرایی یکسان باشد.

روش صحیح استفاده از strictfp و جاهایی که می توان از این کلیدواژه استفاده کرد
کلیدواژه ی strictfp را می توان در تعریف متدها، کلاس ها و حتی interface ها مورد استفاده قرار داد:
strictfp class A{}//strictfp applied on class
strictfp interface M{}//strictfp applied on interface
class A{
strictfp void m(){}//strictfp applied on method
}

@this_java
لایه کردن سیستم های نرم افزاری

چند ریختی نقش ویژه ای در پیاده سازی لایه های مختلف در سیستم های نرم افزاری دارد. برای مثال , در سیستم های عامل, هرنوع, دستگاه فیزیک می تواند بطور کاملا متفاوتی در کنار دستگاه های دیگر بکار بپردازد. حتی دستورات خواندن و نوشتن داده ها از دستگاه ها می توانند بطور کلی با یکدیگر متفاوت باشند. غالبا در برنامه نویسی شی گرا, یک کلاس تکرار شونده (iterator class) تعریف می کنند که می تواند در میان تمام شی های موجود در یک کلکسیون, همانند یک آرایه حرکت کند. برای مثال , برنامه می تواند لیستی از شی های موجود در یک لیست پیوندی را با ایجاد یک شی تکرار شونده به چاپ در آورده و سپس با فراخوانی مجدد تکرار شوند, به عنصر بعدی در لیست دست یابد. معمولا از تکرار شونده ها در برنامه نویسی چند ریختی برای پیمایش یک آرایه یا لیست پیوندی از سطح های مختلف یک سلسه مراتب استفاده می شود. اشاره گر ها در چنین لیستی تماما اشاره گر های سوپرکلاس هستند. برای مثال , لیستی از شی های سوپر کلاس TwoDimensionalShape می تواند , حاوی شی هایی از کلاس های Square, Circle,Triangle و غیره باشد . با استفاده از چند ریختی یک پیغام draw به هر شی در لیست ارسال میشود و ان شی بدرسی بر روی صفحه ترسیم میگردد.

@this_java
متد های final نمی توانند تعریف مجدد (override) شوند

متدی که به صورت final در سوپر کلاس اعلان شده باشد نمی تواند در یک زیر کلاس تعریف مجدد یا override شود . متد های private به صورت ضمنی final هستند چرا که امکان تعریف مجدد انها در یک زیر کلاس غیر ممکن است.
همچنین متد هایی که به صورت static اعلان میشوند نیز final میباشند چراکه متد های static نمیتوانند تعریف مجدد شوند. اعلان یک متد final هرگز نمیتواند تغییر داده شود, از اینرو تمام زیر کلاس ها میتوانند از پیاده سازی یکسان متد استفاده کرده و متد های final را با خیال راحت در زمان اجرا فراخوانی کنند. این حالت static binding نامیده میشود .

@this_java
کلاس های final نمیتوانند سوپر کلاس باشند

کلاسی که بصورت final (که به کلاس های عقیم معروف هستند) اعلان شده است نمیتواند یک سوپر کلاس باشد . تمام متد ها در کلاس final به طور ضمنی final هستند.
کلاس String مثالی از یک کلاس final است . این کلاس نمیتواند ارث بری داشته باشد , از اینرو برنامه نویسان که از رشته ها استفاده می کنند متکی بر قابلیت شی های String هستند که در Java API مشخص شده اند ...همچنین کلاس final از این ممانعت میکند که برنامه نویسان اقدام به ایجاد زیر کلاس هایی کنند که ممکن است امنیت برنامه را دچار اشکال کند.
برای کسب اطلاعات بیشتر به سایت زیر مراجعه کنید... این سایت حاوی مطالبی است که میتواند دیدگاه جدیدی در زمینه استفاده از کلاس های final در افزایش ضریب امنیتی سیستم در اختیارتان قرار دهد:

http://docs.oracle.com/javase/tutorial/java/IandI/final.html

@this_java
تفاوت میان
1)ClassName p;
2)new ClassName();
3)ClassName p = new ClassName();
در چیست؟

در گزینه ی اول هیچگونه مقداری به p تخصیص داده نشده از اینرو تا زمانی که بوسیله ی سازنده ی کلاس مقدار دهی اولیه نشود غیر قابل استفاده خواهد بود (مقدار p برابر با null خواهد بود زیرا هیچ مقداری به ان تخصیص داده نشده است)

در دومین گزینه... یک شی از ClassName ایجاد شده است اما هیچ اشاره ای به ان وجود ندارد .. زمانی که به این روش شی ایجاد کردید...شی بلافاصله واجد شرایط برای جمع اوری زباله توسط زباله روب میشود
(در صورتی که در سازنده ی ان مقداری دریافت شود و سازنده ان مقدار را در جایی ذخیره کند چنین نخواهد بود)

در مورد اخر شما یک شی از NewClass ساخته اید و انرا به p تخصیص داده اید و p یک اشاره گر است به سازنده ی ClassName... مقداردهی اولیه ی p توسط سازنده ی ClassName() انجام میشود...
@this_java
نگاهی به کلکسیون ها

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

1-Collection
2-Set
3-List
4-Map
5-Queue
1-کالکشن واسط ریشه در سلسه مراتب کلکسیون ها که ازن ان واسط های Queue , Set,List مشتق شده اند.
2- کلکسیونی است که حاوی عناصر تکراری نیست
3-لیست یک کلکسیون مرتب شده است که میتواند حاوی عناصر تکراری باشد
4- کلید های وابسته به مقادیر بوده و نمیتواند حاوی کلید تکراری باشد
5- نمونه ای از کلکسیون اولین ورودی-اولین خروجی که یک خط انتظار را مدل سازی میکند, ترتیبات دیگر را میتوان مشخص کرد

@this_java
سربارگذاری متد

جاوا امکان تعریف متد های همنام در یک کلاس را تا مادامیکه این متد ها دارای مجموعه متفاوتی از پارامتر ها باشند, تدارک دیده است. این قابلیت , سربارگذاری متد (method overloading) نامیده میشود. زمانیکه یک متد سربارگذاری شده فراخوانی شود, کامپایلر جاوا با برسی تعداد , نوع و ترتیب ارگومان ها در متد فراخوانی شده , مبادرت به انتخاب متد مناسب میکند. معمولا از سربارگذاری متد برای ایجاد چندین متد همنام که وظایف مشابهی انجام میدهند اما در نوع داده ها باهم اختلاف دارند استفاده میشود. برای مثال , متد های min, abs, max از کلاس Math در چهار نسخه سربارگذاری شده اند:

۱-یکی با دو پارامتر double
۲- یکی با دوپارامتر float
۳- یکی با دوپارامتر int
۴- یکی با دو پارامتر long

@this_java
عمر منطقی بولی & و |

عملگر های منطقی بولی &و| از روش ارزیابی غیر اتصالی استفاده میکنند. عملکرد این عملگر ها همانند &&و || است با یک تفاوت و ان اینکه عملگر های منطقی بولی & ,| همیشه به ارزیابی هردو عملوند خود میپردازند . برای مثال در عبارت:

( gender == 1) & (age >=65)
حتی اگر شرط gender ==1 برقرار نباشد به ارزیابی age>=65 پرداخته میشود. معمولا دلیلی برای استفاده از عملگر های منطقی بولی به جای &&, || وجود ندارد. با این وجود برخی برنامه نویسان زمانیکه یکی از شرط ها تاثیرات جانبی ایجاد کند یا متدی برای فراخوانی داشته باشد از این عملگر ها استفاده میکنند برای مثال در عبارت زیر:

(birthday == true) | (++age>=65)
عملگر | باعث میشود تا شرط شرط دوم حتما ارزیابی شود . از اینرو متغیر age در عبارت قبلی صرفنظر از اینکه کل عبارت true باشد یا false افزایش می یابد

@this_java
کلاس های type-wrapper

هرنوع اصلی یا بنیادین دارای یک کلاس type-wrapper متناظر است (در پکیج java.lang) این کلاس ها عبارتند از Long , Integer, Float, Double,Character,Byte,Boolean,Short هر کلاس پوشاننده به شما امکان میدهد تا مقادیر با نوع های اصلی را بصورت شی دستکاری کنید.
هر یک از کلاس های type-wrapper از کلاس Number مشتق شده اند. همچنین کلاس های type-wrapper از جمله کلاس های final هستند از اینرو نمیتوانید انهارا بسط دهید. نوع های اصلی فاقد متد هستند, بنابر این متد های مرتبط با یک نوع اصلی در کلاس متناظر type-wrapper قرار داده شده است (برای مثال متد parseInt که یک رشته را به یک مقدار صحیح تبدیل میکند در کلاس Integer قرار دارد) . اگر نیاز به دستکاری یک مقدار از نوع اصلی در برنامه داشته باشید , ابتدا به مستندات کلاس های نوع پوشاننده (type-wrapper)مراجعه کنید.
@this_java
مفاهیم بنیادین کاراکتر ها و رشته ها

کاراکتر ها بلوک های اصلی در ساخت برنامه ها در جاوا هستند. هر برنامه ترکیبی متوالی از کاراکتر ها است و هنگامی که با یکدیگر به کار گرفته شوند توسط کامپیوتر به دنباله ای از دستورات تبدیل شده و یک وظیفه خاص را انجام میدهند.
یک برنامه میتواند حاوی کاراکتر های لیترال هم باشد. کاراکتر لیترال یک مقدار صحیح است که بصورت یک کاراکتر در میان نقل قول ارایه میشود . مقدار یک کاراکتر لیترال, مقدار صحیح کاراکتر در مجموعه کاراکتری unicode است. برای کسب اطلاعات کامل در ارتباط با unicode از سایت www.unicode.com بازدید کنید

رشته . دنباله ای از کاراکتر های در کنار هم قرار گرفته است که مانند یک واحد عمل میکنند.. یک رشته ممکن است شامل حروف ارقام و انواع کاراکتر های خاص مانند +, -,*,/,$ و غیره باشد. رشته یک شی از کلاس String بوده و به صورت کاراکتر های متوالی است که در یک جفت علامت نقل قول قرار گرفته اند , نوشته میشود:

"@this_java"
اعلانی به فرم زیر میتواند رشته ای را به مراجعه String تخصیص دهد :
String color = "blue";
در این عبارت رشته blue به مراجعه از نوع رشته بنام color تخصیص میابد
توابع بازگشتی (تابع Recursion)

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

مثال محاسبه ی فاکتوریل با تابع بازگشتی :
public long fact(int n) {
if (n != 0) {
return n * fact (n-1);
}
return 1;
}
@this_java
در جاوا Garbage Collection چه کاری انجام میدهد‌؟
یکی از ویژگی هایی که در زبان های سطح بالا بالاخص Java و C# باعث شده است که کار با این زبان ها ساده تر شود و نگرانی های برنامه نویسان بیشتر روی مسایل سطح بالاتر متمرکز شود اتوماتیک شده مدیریت حافظه توسط هسته خود زبان می باشد که به آن مکانیزم Garbage Collection گفته می شود.
بخاظر وجود همین ویژگی هست که ما در داخل جاوا مشکل dandling reference و space leaks نداریم چون memory management توسط jvm انجام میشه و garbage collection از روی root gc میاد و object های غیر قابل استفاده و بدون reference رو از روی حافظه collect میکنه.
مشکل dandling reference به این معناست که شما مثلا توی یه زبان سطح پایین می یاین و بخشی از حافظه را deallocate می کنین بی خبر از اینکه refrence ی به آن بخش حافظه توسط object دیگر وجود دارد که این مسیله مشکلات و پیامدهای بسیار بدی را در بر دارد.

@this_java