💎 کلیدواژه final
🔆کلیدواژه فاینال برای محدود کردن کاربرد یک متغیر، متود یا یک کلاس به کار میرود که البته در هر کدام از این موارد، کاربرد متفاوت است.
⭕️ اگر یک متغیر را فاینال تعریف کنیم، به این معناست که پس از مقدار دهی اولیه، مقدار متغیر دچار تغییرات نخواهد شد و مقدار دهی دوباره آن، خطای کمپایلر را به همراه خواهد داشت:
#final #keywords
@pieceJava
🔆کلیدواژه فاینال برای محدود کردن کاربرد یک متغیر، متود یا یک کلاس به کار میرود که البته در هر کدام از این موارد، کاربرد متفاوت است.
⭕️ اگر یک متغیر را فاینال تعریف کنیم، به این معناست که پس از مقدار دهی اولیه، مقدار متغیر دچار تغییرات نخواهد شد و مقدار دهی دوباره آن، خطای کمپایلر را به همراه خواهد داشت:
final int length = 5;⭕️ اگر یک کلاس را فاینال تعریف کنیم، توسط هیچ کلاسی قابل ارث بری نخواهد بود (فاینال تعریف کردن یک کلاس به معنی Immutable کردن این کلاس نیست. زیرا فقط از ارث بری شدن جلوگیری میکند.)
final class Test{ }
⭕️ اگر یک متد را فاینال تعریف کنیم، توسط هیچ زیرکلاسی قابل اورراید کردن نخواهد بود. یا به عبارتی بدنه متد تحت هیچ شرایطی در زیرکلاس ها تغییر نخواهد کرد.final void method(){ }
⭕️ اگر یک آرگومان را فاینال تعریف کنیم، این به این معناست که مقدار آن در بدنه متد قابل تغییر نمیباشد.public void methodWithFinalArguments(final int x) {
x=1;
}
برای مثال، تکه کد بالا خطای کمپایلر را خواهد داشت.#final #keywords
@pieceJava
👍3
💎 کلیدواژه static
🔆 یکی از 57 کلیدواژه رزرو شده در جاوا، کلیدواژه استاتیک static میباشد.
💡 از کلیدواژه های رزرو شده برای اسامی متغیر ها و... نمیتوان استفاده کرد.
در اصل کلیدواژه استاتیک برای مدیریت حافظه به کار میرود. در جاوا متغیر ها ، متد ها، بلاک ها ( {} ) و کلاس های تو در تو میتوانند بعنوان استاتیک در نظر گرفته شوند. هرگاه یک متغیر یا یک متد استاتیک در نظر گرفته شود، در واقع فقط یک نمونه از آن میان نمونه (ابجکت) های آن کلاس مشترک میباشد.
🔅 بلاک استاتیک (static block)
معمولا از این نوع بلاک برای مقدار دهی اولیه داده های استاتیک استفاده میشود. در واقع هر زمانی که کلاس داخل حافظه بارگذاری شد، خطوط داخل بلاک هم اجرا میشوند نکته حائز اهمیت آن است که بلاک های استاتیک پیش از سازنده ها (کنستراکتور) اجرا میشوند:
(برای خوانایی بهتر کد ها، گوشی خود را در حالت افقی قرار دهید و یا در ادامه از تصاویر زیر پست استفاده کنید)
زمانی که یک متغیر استاتیک ایجاد میکنید، فقط یک کپی از آن ایجاد و میان باقی نمونه(ابجکت، شی، اشیا) های کلاس به اشتراک گذاشته میشود. با توجه به این تعریف، به این نوع متغیر ها متغیر های سراسری (global variables) نیز گفته میشود. زیرا میان نمونه ها مشترک هستند. متغیر های استاتیک فقط در سطح کلاس میتوانند تعریف شوند.
🔰 برای مثال:
🔅 متد استاتیک
این متد ها چند ویژگی خاص دارند:
⭕️ متد های استاتیک وابسته به نمونه های ایجاد شده از کلاس نیستند. در واقع متعلق به خود کلاس هستند. این یعنی بدون ایجاد نمونه از کلاس میتوانید از آنها استفاده کنید.
⭕️ متد های استاتیک فقط میتوانند به داده های استاتیک و دیگر متد های استاتیک دسترسی داشته باشند.
👈 بهمین خاطر معمولا متد هایی که پیش از متد main برای استفاده در این متد تعریف میکنید حتما باید استاتیک تعریف شوند. زیرا در غیر این صورت باید یک نمونه از خود کلاس در متد main تعریف کنید.
مثال:
#static #keywords
از اینجا بخوانید:
👈 کلیدواژه final
👈 تفاوت Constructor و Static Factory Method
@pieceJava
🔆 یکی از 57 کلیدواژه رزرو شده در جاوا، کلیدواژه استاتیک static میباشد.
💡 از کلیدواژه های رزرو شده برای اسامی متغیر ها و... نمیتوان استفاده کرد.
در اصل کلیدواژه استاتیک برای مدیریت حافظه به کار میرود. در جاوا متغیر ها ، متد ها، بلاک ها ( {} ) و کلاس های تو در تو میتوانند بعنوان استاتیک در نظر گرفته شوند. هرگاه یک متغیر یا یک متد استاتیک در نظر گرفته شود، در واقع فقط یک نمونه از آن میان نمونه (ابجکت) های آن کلاس مشترک میباشد.
🔅 بلاک استاتیک (static block)
معمولا از این نوع بلاک برای مقدار دهی اولیه داده های استاتیک استفاده میشود. در واقع هر زمانی که کلاس داخل حافظه بارگذاری شد، خطوط داخل بلاک هم اجرا میشوند نکته حائز اهمیت آن است که بلاک های استاتیک پیش از سازنده ها (کنستراکتور) اجرا میشوند:
(برای خوانایی بهتر کد ها، گوشی خود را در حالت افقی قرار دهید و یا در ادامه از تصاویر زیر پست استفاده کنید)
public class PieceJava {
//Telegram: @PieceJava
public static void main(String[] args) {
new staticSample();
// OUTPUT: Inside static block
// Inside constructor
}
}
class staticSample{
static int x;
static {
System.out.println("Inside static block");
x=x*6;
}
public staticSample(){
System.out.println("Inside constructor");
}
}
🔅 متغیر استاتیکزمانی که یک متغیر استاتیک ایجاد میکنید، فقط یک کپی از آن ایجاد و میان باقی نمونه(ابجکت، شی، اشیا) های کلاس به اشتراک گذاشته میشود. با توجه به این تعریف، به این نوع متغیر ها متغیر های سراسری (global variables) نیز گفته میشود. زیرا میان نمونه ها مشترک هستند. متغیر های استاتیک فقط در سطح کلاس میتوانند تعریف شوند.
🔰 برای مثال:
public class PieceJava {
public static void main(String[] args) {
staticSample sample = new staticSample();
staticSample sample2 = new staticSample();
sample.setNumber(4);
System.out.println(sample2.getNumber()); // prints 4
}
}
class staticSample{
private static int number;
public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return number;
}
}
در این مورد مقدار متغیر را در ابجکت sample مقدار دهی کردیم و در ادامه مقدار ذخیره شده را از ابجکت sample2 چاپ کردیم. این به این معناست که مقدار متغیر میان نمونه های ایجاد شده، ثابت میباشد.🔅 متد استاتیک
این متد ها چند ویژگی خاص دارند:
⭕️ متد های استاتیک وابسته به نمونه های ایجاد شده از کلاس نیستند. در واقع متعلق به خود کلاس هستند. این یعنی بدون ایجاد نمونه از کلاس میتوانید از آنها استفاده کنید.
⭕️ متد های استاتیک فقط میتوانند به داده های استاتیک و دیگر متد های استاتیک دسترسی داشته باشند.
👈 بهمین خاطر معمولا متد هایی که پیش از متد main برای استفاده در این متد تعریف میکنید حتما باید استاتیک تعریف شوند. زیرا در غیر این صورت باید یک نمونه از خود کلاس در متد main تعریف کنید.
مثال:
public class PieceJava {
//Telegram: @PieceJava
public static void main(String[] args) {
staticSample.print();
//OUTPUT: Inside static method
}
}
class staticSample{
public static void print(){
System.out.println("Inside static method");
}
}
——#static #keywords
از اینجا بخوانید:
👈 کلیدواژه final
👈 تفاوت Constructor و Static Factory Method
@pieceJava
Telegram
کانال تیکه پاره های جاوا
💎 کلیدواژه final
🔆کلیدواژه فاینال برای محدود کردن کاربرد یک متغیر، متود یا یک کلاس به کار میرود که البته در هر کدام از این موارد، کاربرد متفاوت است.
⭕️ اگر یک متغیر را فاینال تعریف کنیم، به این معناست که پس از مقدار دهی اولیه، مقدار متغیر دچار تغییرات…
🔆کلیدواژه فاینال برای محدود کردن کاربرد یک متغیر، متود یا یک کلاس به کار میرود که البته در هر کدام از این موارد، کاربرد متفاوت است.
⭕️ اگر یک متغیر را فاینال تعریف کنیم، به این معناست که پس از مقدار دهی اولیه، مقدار متغیر دچار تغییرات…
👍5❤1
💎 کلیدواژه new و مراحل ایجاد یک شی
🔸 در جاوا کلیدواژه new برای ایجاد شی بکار میرود. همچنین بعد از کلیدواژه new متد سازنده (constructor) نیز فراخوانی و اجرا میشود.
=========
🟨 ایجاد هر شی سه مرحله دارد:
Object myObj = new Object();
1️⃣ Object myObj 2️⃣new 3️⃣Object();
1️⃣ بخش اعلام یا تعریف شی(Declaration). اینکار برای کمپایلر مشخص میکند که myObj برای مراجعه به یک داده از نوع Object میباشد. لزوما نباید هنگام ایجاد شی، آن را مقدار دهی کرد. میتوانید این کار را درخطوط بعدی انجام دهید. در نتیجه خط کد زیر هیچ خطایی نخواهد داشت و صرفا نوع داده مشخص شده است:
Object myObj;
2️⃣ بخش نمونه سازی که شی را بعد از تعریف، ایجاد میکند. یعنی در حافظه یک مقدار به آن اختصاص میدهد. (Instantiation) در این بخش کلیدواژه نیو اضافه میشود.
3️⃣ بخش مقدار دهی اولیه که بعد از کلیدواژه نیو، بوسیله سازنده انجام میشود (Initialization)
Object myObj = new Object();
#new #keywords #Objects #delecaration #decelare #init #initialize #instantiation
———
☕️@pieceJava
🔸 در جاوا کلیدواژه new برای ایجاد شی بکار میرود. همچنین بعد از کلیدواژه new متد سازنده (constructor) نیز فراخوانی و اجرا میشود.
=========
🟨 ایجاد هر شی سه مرحله دارد:
Object myObj = new Object();
1️⃣ Object myObj 2️⃣new 3️⃣Object();
1️⃣ بخش اعلام یا تعریف شی(Declaration). اینکار برای کمپایلر مشخص میکند که myObj برای مراجعه به یک داده از نوع Object میباشد. لزوما نباید هنگام ایجاد شی، آن را مقدار دهی کرد. میتوانید این کار را درخطوط بعدی انجام دهید. در نتیجه خط کد زیر هیچ خطایی نخواهد داشت و صرفا نوع داده مشخص شده است:
Object myObj;
2️⃣ بخش نمونه سازی که شی را بعد از تعریف، ایجاد میکند. یعنی در حافظه یک مقدار به آن اختصاص میدهد. (Instantiation) در این بخش کلیدواژه نیو اضافه میشود.
3️⃣ بخش مقدار دهی اولیه که بعد از کلیدواژه نیو، بوسیله سازنده انجام میشود (Initialization)
Object myObj = new Object();
#new #keywords #Objects #delecaration #decelare #init #initialize #instantiation
———
☕️@pieceJava
👍3❤2
💎 کلیدواژه NaN
🔆 کلید واژه نان (یا کلا هرجور که میخونیدش😁) مخفف Not a Number میباشد که نشاندهنده مقادیر تعریف نشده در عملیات های اعشاری ریاضی است.
🔰 برای مثال تمامی حالات زیر نتیجه NaN را در بردارد:
👈 تقسیم صفر بر صفر 0.0/0.0
👈 رادیکال یک عدد منفی با فرجه زوج Math.sqrt(-1)
👈 عملیات های مابین بینهایت (بینهایت - بینهایت/بینهایت * صفر)، ∞-∞ / ∞*0
👈 لگاریتم -1 و ... Math.log(-1)
⭕️ جاوا یکسری ثابت NaN برای هر دو نوع داده float و double تعریف کرده است که از طریق Float.NaN و Double.NaN قابل دستیابی هستند.
⚙️ مقایسه NaN ها:
💬 موقع نوشتن متد ها سعی کنید ورودی هارو کنترل کنید و از اونجا که NaN یک مقدار نامعتبره، بهتره چک بشه که مقدار داده ورودی NaN نباشه. ولی مورد اصلی اینجاست که NaN با هیچ مقدار دیگه ای قابل مقایسه نیست و هر مقایسه ای با NaN (حتی NaN== NaN) نتیجه فالس داره. البته بجز مقایسه != که مقدار ترو داره:
NaN == 1 = false
NaN > 1 = false
NaN < 1 = false
NaN != 1 = true
NaN == NaN = false
NaN > NaN = false
NaN < NaN = false
NaN != NaN = true
———
💡 در نتیجه از اونجا که نمیشه هیچ مقداری رو با NaN بوسیله == یا != مقایسه کرد، بهتره NaN رو بوسیله != فقط با خودش مقایسه کنیم! شاید کمی عجیب بنظر برسه ولی جواب میده:
Run! Its NaN
Everything is Fine :)
💡 در واقع x != x (با فرض اینکه x یه داده اعشاری باشه) فقط برای NaN مقدار ترو داره.
💡البته لزومی به تعریف یک تابع جداگانه برای بررسی NaN نیست. بطور مستقیم میتوان از متد های Double.isNaN() و ()Float.isNaN هم استفاده کرد:
خروجی True خواهد داشت.
#NaN #keywords
———
☕️@pieceJava
🔆 کلید واژه نان (یا کلا هرجور که میخونیدش😁) مخفف Not a Number میباشد که نشاندهنده مقادیر تعریف نشده در عملیات های اعشاری ریاضی است.
🔰 برای مثال تمامی حالات زیر نتیجه NaN را در بردارد:
👈 تقسیم صفر بر صفر 0.0/0.0
👈 رادیکال یک عدد منفی با فرجه زوج Math.sqrt(-1)
👈 عملیات های مابین بینهایت (بینهایت - بینهایت/بینهایت * صفر)، ∞-∞ / ∞*0
👈 لگاریتم -1 و ... Math.log(-1)
⭕️ جاوا یکسری ثابت NaN برای هر دو نوع داده float و double تعریف کرده است که از طریق Float.NaN و Double.NaN قابل دستیابی هستند.
⚙️ مقایسه NaN ها:
💬 موقع نوشتن متد ها سعی کنید ورودی هارو کنترل کنید و از اونجا که NaN یک مقدار نامعتبره، بهتره چک بشه که مقدار داده ورودی NaN نباشه. ولی مورد اصلی اینجاست که NaN با هیچ مقدار دیگه ای قابل مقایسه نیست و هر مقایسه ای با NaN (حتی NaN== NaN) نتیجه فالس داره. البته بجز مقایسه != که مقدار ترو داره:
System.out.println("NaN == 1 = " + (NAN == 1));
System.out.println("NaN > 1 = " + (NAN > 1));
System.out.println("NaN < 1 = " + (NAN < 1));
System.out.println("NaN != 1 = " + (NAN != 1));
System.out.println("NaN == NaN = " + (NAN == NAN));
System.out.println("NaN > NaN = " + (NAN > NAN));
System.out.println("NaN < NaN = " + (NAN < NAN));
System.out.println("NaN != NaN = " + (NAN != NAN));
——OUTPUT:NaN == 1 = false
NaN > 1 = false
NaN < 1 = false
NaN != 1 = true
NaN == NaN = false
NaN > NaN = false
NaN < NaN = false
NaN != NaN = true
———
💡 در نتیجه از اونجا که نمیشه هیچ مقداری رو با NaN بوسیله == یا != مقایسه کرد، بهتره NaN رو بوسیله != فقط با خودش مقایسه کنیم! شاید کمی عجیب بنظر برسه ولی جواب میده:
public class Ithooloo {
//Telegram: @pieceJava
public static void main(String[] args) {
checkNaN(Double.NaN);
checkNaN(1.1);
}
public static void checkNaN(double input){
if(input!=input)
System.out.println("Run! Its NaN");
else
System.out.println("Everything is Fine :)");
}
}
—OUTPUT—Run! Its NaN
Everything is Fine :)
💡 در واقع x != x (با فرض اینکه x یه داده اعشاری باشه) فقط برای NaN مقدار ترو داره.
💡البته لزومی به تعریف یک تابع جداگانه برای بررسی NaN نیست. بطور مستقیم میتوان از متد های Double.isNaN() و ()Float.isNaN هم استفاده کرد:
System.out.println(Double.isNaN(0.0/0.0));خروجی True خواهد داشت.
#NaN #keywords
———
☕️@pieceJava
👍5
💎 کلیدواژه throws
🔆 کلیدواژه throws یک مفهوم از مدیریت استثنا در جاوا میباشد. در واقع از این کلیدواژه زمانی استفاده میشود که مشخص کنیم کدام استثنا در رابطه با یک اجرا شدن یک متد ایجاد خواهد شد.
🔅 کلیدواژه throws دقیقا قبل از باز کردن بدنه متد نوشته میشود:
void func() throws Exception { }
🔰 مثال:
💡 معمولا کلید واژه throws در رابطه با استثنا های تیک خورده (Checked Exceptions) به کار برده میشود. استثنا های تیک خورده در جاوا استثنا هایی هستند که حتما باید مدیریت شوند. در کل استفاده از throws برای استثنا های عادی بی معنی خواهد بود. نمونه ای از استثنا های تیک خورده:
1. IOException
2. ClassNotFoundException
3. InterruptedException
4. FileNotFoundEception
5. InstantiationException
6. SQLException
برای مطالعه درباره باقی کلیدواژه ها، بروی هشتگ #keywords کلیک کنید.
#throws #keywords
———
☕️@peceJava
🔆 کلیدواژه throws یک مفهوم از مدیریت استثنا در جاوا میباشد. در واقع از این کلیدواژه زمانی استفاده میشود که مشخص کنیم کدام استثنا در رابطه با یک اجرا شدن یک متد ایجاد خواهد شد.
🔅 کلیدواژه throws دقیقا قبل از باز کردن بدنه متد نوشته میشود:
void func() throws Exception { }
🔰 مثال:
public void createFile(String path, String text) throws IOException {
FileWriter writer = new FileWriter(path);
writer.write(text);
writer.close();
}
برای مثال این متد استثنای IOException را پرتاب میکند. این استثنا زمانی ایجاد خواهد شد که یک شی از کلاس FileWriter ایجاد شود. البته به یاد داشته باشید که خود متد عملی در زمینه مدیریت استثنا انجام نخواهد داد و این مدیریت باید در صورت استفاده از متد انجام شود (این مدیریت یا باید بوسیله ترای کچ و یا پرتاب دوباره استثنا توسط متد صورت گیرد. هر دو مورد را میتوانید در تصویر مشاهده کنید).💡 معمولا کلید واژه throws در رابطه با استثنا های تیک خورده (Checked Exceptions) به کار برده میشود. استثنا های تیک خورده در جاوا استثنا هایی هستند که حتما باید مدیریت شوند. در کل استفاده از throws برای استثنا های عادی بی معنی خواهد بود. نمونه ای از استثنا های تیک خورده:
1. IOException
2. ClassNotFoundException
3. InterruptedException
4. FileNotFoundEception
5. InstantiationException
6. SQLException
برای مطالعه درباره باقی کلیدواژه ها، بروی هشتگ #keywords کلیک کنید.
#throws #keywords
———
☕️@peceJava
👍10
💠 کلیدواژه var در جاوا
🔆 از بعد جاوای 10 میتوان بجای نوشتن مستقیم نوع داده ها، از کلیدواژه var استفاده کرد.
در نتیجه در خط کد زیر، میتوانید نوع داده یعنی String را
⁉️ آیا var در جاوا مشابه var در جاوا اسکریپت است؟
جاوا یک زبان statically typed است. یعنی نوع داده ها از همان ابتدا که مشخص میشود، تا آخر برنامه ثابت میماند. در نتیجه var در جاوا کاملا متفاوت از var در جاوا اسکریپت میباشد. در جاوا اسکریپت هر زمان که بخواهید میتوانید نوع داده را تغییر دهید. اما همینکار در جاوا خطای کمپایل خواهد داشت:
1️⃣
⚠️ در حالت های زیر نمیتوانید از var استفاده کنید. در صورت استفاده خطای کمپایل خواهید داشت:
❌ هر کجا که نوع داده برای کمپایلر مبهم باشد:
——————-
تیکه پاره های جاوا
@PieceJava
🔆 از بعد جاوای 10 میتوان بجای نوشتن مستقیم نوع داده ها، از کلیدواژه var استفاده کرد.
در نتیجه در خط کد زیر، میتوانید نوع داده یعنی String را
String name = "Mohammad Reza";با کلید واژه var جایگزین کنید:
var name = "Mohammad Reza";در این حالت خود کمپایلر نوع داده را تشخیص میدهد.
⁉️ آیا var در جاوا مشابه var در جاوا اسکریپت است؟
جاوا یک زبان statically typed است. یعنی نوع داده ها از همان ابتدا که مشخص میشود، تا آخر برنامه ثابت میماند. در نتیجه var در جاوا کاملا متفاوت از var در جاوا اسکریپت میباشد. در جاوا اسکریپت هر زمان که بخواهید میتوانید نوع داده را تغییر دهید. اما همینکار در جاوا خطای کمپایل خواهد داشت:
var text = "Hello World";چند مثال استفاده از var:
text = 23; // Incompatible types
1️⃣
Person person = new Person();2️⃣
var person = new Person();
ArrayList<Integer> numbers = new ArrayList<>();3️⃣
var numbers = new ArrayList<Integer>();
int[] x = {1,2,3,4,5};
int[] y = new int[10];
var x = new int[]{1,2,3,4,5};
var y = new int[10];
🟡 متغیر از نوع var میتواند فاینال تعریف شود تا از مقداردهی دوباره آن جلوگیری شود:final var text = "Hello World"(بر خلاف کاتلین که val برای مقادیر ثابت بود، اینجا چیزی به نام val نداریم و باید از فاینال استفاده کنیم)
⚠️ در حالت های زیر نمیتوانید از var استفاده کنید. در صورت استفاده خطای کمپایل خواهید داشت:
❌ هر کجا که نوع داده برای کمپایلر مبهم باشد:
var a;❌ متغیر از نوع var بعنوان یک متغیر گلوبال به کار برود.
var nothing = null;
var lambda = () -> System.out.println("Pity!");
var method = this::someMethod;
class Person{
var name;
var adress;
var age;
}
❌ کلیدواژه var تعیین کننده خروجی متد یا نوع ورودی متد باشد. var myMethod(){
}
void myMethod(var x){
}
#var #keywords——————-
تیکه پاره های جاوا
@PieceJava
👍12❤2