کلمه کلیدی 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
توسعه دهنده می تواند با استفاده از کلیدواژه ی 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
چند ریختی نقش ویژه ای در پیاده سازی لایه های مختلف در سیستم های نرم افزاری دارد. برای مثال , در سیستم های عامل, هرنوع, دستگاه فیزیک می تواند بطور کاملا متفاوتی در کنار دستگاه های دیگر بکار بپردازد. حتی دستورات خواندن و نوشتن داده ها از دستگاه ها می توانند بطور کلی با یکدیگر متفاوت باشند. غالبا در برنامه نویسی شی گرا, یک کلاس تکرار شونده (iterator class) تعریف می کنند که می تواند در میان تمام شی های موجود در یک کلکسیون, همانند یک آرایه حرکت کند. برای مثال , برنامه می تواند لیستی از شی های موجود در یک لیست پیوندی را با ایجاد یک شی تکرار شونده به چاپ در آورده و سپس با فراخوانی مجدد تکرار شوند, به عنصر بعدی در لیست دست یابد. معمولا از تکرار شونده ها در برنامه نویسی چند ریختی برای پیمایش یک آرایه یا لیست پیوندی از سطح های مختلف یک سلسه مراتب استفاده می شود. اشاره گر ها در چنین لیستی تماما اشاره گر های سوپرکلاس هستند. برای مثال , لیستی از شی های سوپر کلاس TwoDimensionalShape می تواند , حاوی شی هایی از کلاس های Square, Circle,Triangle و غیره باشد . با استفاده از چند ریختی یک پیغام draw به هر شی در لیست ارسال میشود و ان شی بدرسی بر روی صفحه ترسیم میگردد.
@this_java
متد های final نمی توانند تعریف مجدد (override) شوند
متدی که به صورت final در سوپر کلاس اعلان شده باشد نمی تواند در یک زیر کلاس تعریف مجدد یا override شود . متد های private به صورت ضمنی final هستند چرا که امکان تعریف مجدد انها در یک زیر کلاس غیر ممکن است.
همچنین متد هایی که به صورت static اعلان میشوند نیز final میباشند چراکه متد های static نمیتوانند تعریف مجدد شوند. اعلان یک متد final هرگز نمیتواند تغییر داده شود, از اینرو تمام زیر کلاس ها میتوانند از پیاده سازی یکسان متد استفاده کرده و متد های final را با خیال راحت در زمان اجرا فراخوانی کنند. این حالت
@this_java
متدی که به صورت 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
کلاسی که بصورت final (که به کلاس های عقیم معروف هستند) اعلان شده است نمیتواند یک سوپر کلاس باشد . تمام متد ها در کلاس final به طور ضمنی final هستند.
کلاس String مثالی از یک کلاس final است . این کلاس نمیتواند ارث بری داشته باشد , از اینرو برنامه نویسان که از رشته ها استفاده می کنند متکی بر قابلیت شی های String هستند که در Java API مشخص شده اند ...همچنین کلاس final از این ممانعت میکند که برنامه نویسان اقدام به ایجاد زیر کلاس هایی کنند که ممکن است امنیت برنامه را دچار اشکال کند.
برای کسب اطلاعات بیشتر به سایت زیر مراجعه کنید... این سایت حاوی مطالبی است که میتواند دیدگاه جدیدی در زمینه استفاده از کلاس های final در افزایش ضریب امنیتی سیستم در اختیارتان قرار دهد:
http://docs.oracle.com/javase/tutorial/java/IandI/final.html
@this_java
Oracle
Writing Final Classes and Methods (The Java™ Tutorials >
Learning the Java Language > Interfaces and Inheritance)
Learning the Java Language > Interfaces and Inheritance)
This beginner Java tutorial describes fundamentals of programming in the Java programming language
تفاوت میان
در گزینه ی اول هیچگونه مقداری به
در دومین گزینه... یک شی از
(در صورتی که در سازنده ی ان مقداری دریافت شود و سازنده ان مقدار را در جایی ذخیره کند چنین نخواهد بود)
در مورد اخر شما یک شی از
@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
کلکسیون , یک ساختمان داده است - درواقع یک شی است - که می تواند مراجعه ها یا اشاره گر هایی به سایر شی هارا نگهداری کند. معمولا , کلکسیون ها حاوی مراجعه ها به شی ها هستند که همگی از یک نوع می باشند. واسط های فریمورک کلکسیون ها مبادرت به اعلان عملیات هایی میکنند که کاربرد عمومی بر روی انواع گوناگونی از کلکسیون ها دارند.
برخی از واسط های فریمورک در زیر اورده شده است. در درون فریمورک چندین پیاده سازی از این واسط ها تدارک دیده شده اند البته برنامه نویسان میتوانند پیاده سازی های خاص خود را اعمال کنند
1-Collection
2-Set
3-List
4-Map
5-Queue
1-کالکشن واسط ریشه در سلسه مراتب کلکسیون ها که ازن ان واسط های Queue , Set,List مشتق شده اند.
2- کلکسیونی است که حاوی عناصر تکراری نیست
3-لیست یک کلکسیون مرتب شده است که میتواند حاوی عناصر تکراری باشد
4- کلید های وابسته به مقادیر بوده و نمیتواند حاوی کلید تکراری باشد
5- نمونه ای از کلکسیون اولین ورودی-اولین خروجی که یک خط انتظار را مدل سازی میکند, ترتیبات دیگر را میتوان مشخص کرد
@this_java
سربارگذاری متد
جاوا امکان تعریف متد های همنام در یک کلاس را تا مادامیکه این متد ها دارای مجموعه متفاوتی از پارامتر ها باشند, تدارک دیده است. این قابلیت , سربارگذاری متد (
۱-یکی با دو پارامتر
۲- یکی با دوپارامتر
۳- یکی با دوپارامتر
۴- یکی با دو پارامتر
@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
عملگر های منطقی بولی &و| از روش ارزیابی غیر اتصالی استفاده میکنند. عملکرد این عملگر ها همانند &&و || است با یک تفاوت و ان اینکه عملگر های منطقی بولی & ,| همیشه به ارزیابی هردو عملوند خود میپردازند . برای مثال در عبارت:
( 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
هرنوع اصلی یا بنیادین دارای یک کلاس 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 تخصیص میابد
کاراکتر ها بلوک های اصلی در ساخت برنامه ها در جاوا هستند. هر برنامه ترکیبی متوالی از کاراکتر ها است و هنگامی که با یکدیگر به کار گرفته شوند توسط کامپیوتر به دنباله ای از دستورات تبدیل شده و یک وظیفه خاص را انجام میدهند.
یک برنامه میتواند حاوی کاراکتر های لیترال هم باشد. کاراکتر لیترال یک مقدار صحیح است که بصورت یک کاراکتر در میان نقل قول ارایه میشود . مقدار یک کاراکتر لیترال, مقدار صحیح کاراکتر در مجموعه کاراکتری 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
الگوریتم بازگشتی زمانی اتفاق می افتد که یک متد خود را به کرات صدا بزند. به متدی که خود را فراخوانی می کند، در اصطلاح تابع 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
یکی از ویژگی هایی که در زبان های سطح بالا بالاخص 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
استریم ها
معمولا ورودی و خروجی توسط استریم ها انجام میشوند, که توالی از بایت ها هستند. در عملیات ورودی , بایت ها از یک دستگاه(مثل صفحه کلید) به سمت حافظه اصلی جریان دارند. در عملیات خروجی , بایت ها از حافظه اصلی به سمت یک دستگاه (همانند صفحه نمایش) حریان دارند.
زمانیکه برنامه شروع به اجرا میکند سه استریم بصورت اتوماتیک به برنامه متصل میشوند.
معمولا استریم ورودی استاندارد به صفحه کلید و استریم خروجی استاندارد به صفحه نمایش متصل میشوند. استریم سوم..استریم خطای استاندارد (System.err) عموما به صفحه نمایش متصل شده و برای چاپ پیغام های خطا در دستگاه بکار گرفته میشود
@this_java
معمولا ورودی و خروجی توسط استریم ها انجام میشوند, که توالی از بایت ها هستند. در عملیات ورودی , بایت ها از یک دستگاه(مثل صفحه کلید) به سمت حافظه اصلی جریان دارند. در عملیات خروجی , بایت ها از حافظه اصلی به سمت یک دستگاه (همانند صفحه نمایش) حریان دارند.
زمانیکه برنامه شروع به اجرا میکند سه استریم بصورت اتوماتیک به برنامه متصل میشوند.
معمولا استریم ورودی استاندارد به صفحه کلید و استریم خروجی استاندارد به صفحه نمایش متصل میشوند. استریم سوم..استریم خطای استاندارد (System.err) عموما به صفحه نمایش متصل شده و برای چاپ پیغام های خطا در دستگاه بکار گرفته میشود
@this_java
PostFix.zip
3.2 KB
تبدیل عبارت پستفیکس به اینفیکس و برعکس
حل عبارت پستفیکس و اینفیکس
(به همراه پیاده سازی کلاس Stack جاوا)
@this_java
حل عبارت پستفیکس و اینفیکس
(به همراه پیاده سازی کلاس Stack جاوا)
@this_java
کلاس StringBuilder
کلاس StringBuilder برای ایجاد دستکاری کردن دینامیکی اطلاعات رشته(رشته های قابل تغییر) استفاده میشود
هر کلاس StringBuilder میتواند تعداد مشخصی از کاراکتر هارا با توجه به ظرفیت خود ذخیره سازد. در صورت تجاوز از ظرفیت یک StringBuilder ظرفیت ان با توجه به کاراکتر های اضافی افزایش می یابد.
@this_java
کلاس StringBuilder برای ایجاد دستکاری کردن دینامیکی اطلاعات رشته(رشته های قابل تغییر) استفاده میشود
هر کلاس StringBuilder میتواند تعداد مشخصی از کاراکتر هارا با توجه به ظرفیت خود ذخیره سازد. در صورت تجاوز از ظرفیت یک StringBuilder ظرفیت ان با توجه به کاراکتر های اضافی افزایش می یابد.
@this_java
تفاوت میان دو متد toString و valueOf
هر شی در جاوا دارای یک متد toString است که به برنامه امکان می دهد تا رشته معرفی کننده ان شی را بدست اورد. متاسفانه این تکنینک نمیتواند همراه با نوع های بنیادین (flot,int.long,double,char,byte,short,)به کار گرفته شود چرا که انها متدی ندارند...
البته میتوان از کلاس های type-wrapper استفاده نمود اما تنها زمانی از این کلاس ها استفاده میشود که نیاز به دستکاری مقادیر با نوع های اصلی به صورت شی را داشته باشید.
کلاس String متد استاتیکی در نظر گرفته است که یک ارگومان از هر نوع دریافت کرده و آنرا به یک شی رشته تبدیل میکند.
یاداوری کلاس های type-wrapper:
type-wrapper (https://t.me/this_java/581)
@this_java
هر شی در جاوا دارای یک متد toString است که به برنامه امکان می دهد تا رشته معرفی کننده ان شی را بدست اورد. متاسفانه این تکنینک نمیتواند همراه با نوع های بنیادین (flot,int.long,double,char,byte,short,)به کار گرفته شود چرا که انها متدی ندارند...
البته میتوان از کلاس های type-wrapper استفاده نمود اما تنها زمانی از این کلاس ها استفاده میشود که نیاز به دستکاری مقادیر با نوع های اصلی به صورت شی را داشته باشید.
کلاس String متد استاتیکی در نظر گرفته است که یک ارگومان از هر نوع دریافت کرده و آنرا به یک شی رشته تبدیل میکند.
یاداوری کلاس های type-wrapper:
type-wrapper (https://t.me/this_java/581)
@this_java
Telegram
Learn Java
کلاس های type-wrapper
هرنوع اصلی یا بنیادین دارای یک کلاس type-wrapper متناظر است (در پکیج java.lang) این کلاس ها عبارتند از Long , Integer, Float, Double,Character,Byte,Boolean,Short هر کلاس پوشاننده به شما امکان میدهد تا مقادیر با نوع های اصلی را بصورت…
هرنوع اصلی یا بنیادین دارای یک کلاس type-wrapper متناظر است (در پکیج java.lang) این کلاس ها عبارتند از Long , Integer, Float, Double,Character,Byte,Boolean,Short هر کلاس پوشاننده به شما امکان میدهد تا مقادیر با نوع های اصلی را بصورت…
خطای کامپایل incompatiable types (نوع های ناسازگار) در چه صورت رخ میدهد؟
این خطا بر این نکته دلالت دارد که مبادرت به تخصیص مراجعه شی سوپر کلاس به متغیر زیر کلاس انجام شده است که اجازه اینکار وجود ندارد و کامپایلر از این تخصیص ممانعت میکند چرا که رابطه ی is-a تنها میان زیر کلاس و سوپر کلاس برقرار است نه میان سوپر کلاس و زیر کلاس!
@this_java
این خطا بر این نکته دلالت دارد که مبادرت به تخصیص مراجعه شی سوپر کلاس به متغیر زیر کلاس انجام شده است که اجازه اینکار وجود ندارد و کامپایلر از این تخصیص ممانعت میکند چرا که رابطه ی is-a تنها میان زیر کلاس و سوپر کلاس برقرار است نه میان سوپر کلاس و زیر کلاس!
@this_java
اجتناب از خطای کامپایل تبدیل نوع
درقسمت قبل گفتیم در صورتی که یک سوپر کلاس را به طور مستقیم به یک زیر کلاس تخصیص دهید خطای کامپایل نوع های ناسازگار رخ میدهد... اما چاره چیست؟
میتوان از روش تبدیل نوع (downcasting) استفاده کرد :
Circle c = (Circle) new Shape()
(در مثال بالا فرض بر این است که Circle از کلاس Shape ارث بری داشته است)
@this_java
درقسمت قبل گفتیم در صورتی که یک سوپر کلاس را به طور مستقیم به یک زیر کلاس تخصیص دهید خطای کامپایل نوع های ناسازگار رخ میدهد... اما چاره چیست؟
میتوان از روش تبدیل نوع (downcasting) استفاده کرد :
Circle c = (Circle) new Shape()
(در مثال بالا فرض بر این است که Circle از کلاس Shape ارث بری داشته است)
@this_java
واسط های تابعی
در جاوا SE 8 هر واسطی که فقط حاوی یک متد abstract باشد بعنوان یک واسط تابعی شناخته میشود.
مثال : اینترفیس Runnable
واسط های تابعی کاربرد گسترده ای در قابلیت های جدید lambda در جاوا SE 8 دارند
@this_java
در جاوا SE 8 هر واسطی که فقط حاوی یک متد abstract باشد بعنوان یک واسط تابعی شناخته میشود.
مثال : اینترفیس Runnable
واسط های تابعی کاربرد گسترده ای در قابلیت های جدید lambda در جاوا SE 8 دارند
@this_java
فایل ها و استریم ها
نگاه جاوا به هر فایل بفرم یک استریم (stream) متوالی از بایت ها است. انتهای هر فایل با یک نماد پایان فایل (eof) یا به تعداد بایت های مشخص شده که در سیستم مدیریت نگهداری ساختار به ثبت رسیده , تعیین میشود. یک برنامه پردازش استریمی از بایت ها در جاوا , به هنگام رسیدن برنامه به انتهای استریم , یک مشخصه از سیستم عامل دریافت میکند-برنامه نیازی ندارد که از نحوه عرضه فایل یا استریم در لایه های زیرین پلتفرم چچیزی بداند. در برخی از موارد , مشخصه انتهای فایل بصورت یک استثنا رخ میدهد. در سایر موارد , مشخصه انتهای فایل , بصورت یک مقدار برگشتی از سوی یک متد معلوم میگردد
@this_java
نگاه جاوا به هر فایل بفرم یک استریم (stream) متوالی از بایت ها است. انتهای هر فایل با یک نماد پایان فایل (eof) یا به تعداد بایت های مشخص شده که در سیستم مدیریت نگهداری ساختار به ثبت رسیده , تعیین میشود. یک برنامه پردازش استریمی از بایت ها در جاوا , به هنگام رسیدن برنامه به انتهای استریم , یک مشخصه از سیستم عامل دریافت میکند-برنامه نیازی ندارد که از نحوه عرضه فایل یا استریم در لایه های زیرین پلتفرم چچیزی بداند. در برخی از موارد , مشخصه انتهای فایل بصورت یک استثنا رخ میدهد. در سایر موارد , مشخصه انتهای فایل , بصورت یک مقدار برگشتی از سوی یک متد معلوم میگردد
@this_java