Forwarded from تیکه پاره های جاوا اسکریپت
#موقت
چون این پست به محتوای کانال مربوط نمیشه، پیشاپیش از تمامی دوستان عذرخواهی میکنم.
خواستم دو کلام در خصوص حق ناشر یا تولید کننده نرم افزار ها یا کانتنت های غیررایگان فارسی صحبتی با هم داشته باشیم.
به وفور عزیزانی رو می بینیم که تو گروه های تلگرامی به دنبال دریافت رایگان دوره های آکادمی x یا y هستند و رایجاً سه توجیه برای این موضوع دارند
⭕️ اول اینکه چرا ناشر میاد این دوره رو به صورت نامحدود میفروشه
⭕️ دوم اینکه دوره های فارسی بدرد نمی خوره (درواقع اگه تونستم از این دوره کسب درآمد کنم یعنی بدردم خورده و برمیگردم پولش رو هم میدم)
⭕️ و سوم اینکه این دوره خیلی گرونه!!! اینقدر نمیرزه!
به طور کلی خواستم عرض کنم هر مولف یا ناشر مختاره که برای دوره ای که منتشر می کنه شرایطی را تعیین کنه همانطور که منِ مشتری مختارم که آن شرایط را بپذیرم و دوره را خریداری کنم یا اینکه کلاً منصرف بشوم!
تصورش رو بکنید ناشری دوره اش رو به صورت محدود بفروشه! بعد از مدتی تعداد خرید به سقف میرسه و نیازه که برای اون دوره تصمیم گیری ای صورت بگیره، اگر کلاً فروشش رو متوقف کنیم که بعد از مدتی کانتنت فارسی برای موضوعی خاص رو به انقراض میره یا کیفیت دوره های جدید فوق العاده پایین میاد... یا شایدم نیاز باشه مدرس دوره رو مجدداً ضبط کنه (که اصلا عقلانی نیست) و قطعاً اگر بنده بودم با یه ترفند دوره قبلی رو مجدداً منتشر می کردم تا اینکه بیام دوباره حرفمو تو دوره ضبطی جدید تکرار کنم... اگرم دوره رو رایگان بزاریم، تکلیف کسانی که با قیمت بالا دوره رو تهیه کردند چیه؟؟؟ فرض کنید بعد یک هفته سقف تعیین شده پر شد شما هم تو همین یک هفته دوره رو خریداری کردید و بنده در هفته آینده این دوره خیلی گرون رو رایگان دانلود میکنم دیگه خود حدیث مفصل بخوان از این مجمل.
در مورد اینکه کانتنت فارسی بدرد نمیخوره که باید بگم برادر جان، پس دلیل استفادت از کانتنتی که بدرد نمی خوره چیه؟ میخوای بعد از گذروندن 100 ساعت دوره به خودت اثبات کنی که دیدی بدرد نمی خورده؟!
و در مورد فلسفه آخر عزیزانی که میگن گرونه و اینقدر نمیرزه! و حالا که نمیرزه میرم رایگان پیدا و دانلودش میکنم!!! سوالی پیش میاد، تصورش رو بکنید رفتید یه لپ تاپ بخرید فروشنده میگن 40 میلیون قیمتشه! آیا برمیگردید به خودتون بگید نه بابا این لپتاپ اینقدر نمیرزه بجاش امشب میام میدزدمش؟؟؟ (البته دور از جون همتون)
ببخشید دل پری داشتم خوشحال میشم نظر شما دوستان رو هم در این مورد بدونم
چون این پست به محتوای کانال مربوط نمیشه، پیشاپیش از تمامی دوستان عذرخواهی میکنم.
خواستم دو کلام در خصوص حق ناشر یا تولید کننده نرم افزار ها یا کانتنت های غیررایگان فارسی صحبتی با هم داشته باشیم.
به وفور عزیزانی رو می بینیم که تو گروه های تلگرامی به دنبال دریافت رایگان دوره های آکادمی x یا y هستند و رایجاً سه توجیه برای این موضوع دارند
⭕️ اول اینکه چرا ناشر میاد این دوره رو به صورت نامحدود میفروشه
⭕️ دوم اینکه دوره های فارسی بدرد نمی خوره (درواقع اگه تونستم از این دوره کسب درآمد کنم یعنی بدردم خورده و برمیگردم پولش رو هم میدم)
⭕️ و سوم اینکه این دوره خیلی گرونه!!! اینقدر نمیرزه!
به طور کلی خواستم عرض کنم هر مولف یا ناشر مختاره که برای دوره ای که منتشر می کنه شرایطی را تعیین کنه همانطور که منِ مشتری مختارم که آن شرایط را بپذیرم و دوره را خریداری کنم یا اینکه کلاً منصرف بشوم!
تصورش رو بکنید ناشری دوره اش رو به صورت محدود بفروشه! بعد از مدتی تعداد خرید به سقف میرسه و نیازه که برای اون دوره تصمیم گیری ای صورت بگیره، اگر کلاً فروشش رو متوقف کنیم که بعد از مدتی کانتنت فارسی برای موضوعی خاص رو به انقراض میره یا کیفیت دوره های جدید فوق العاده پایین میاد... یا شایدم نیاز باشه مدرس دوره رو مجدداً ضبط کنه (که اصلا عقلانی نیست) و قطعاً اگر بنده بودم با یه ترفند دوره قبلی رو مجدداً منتشر می کردم تا اینکه بیام دوباره حرفمو تو دوره ضبطی جدید تکرار کنم... اگرم دوره رو رایگان بزاریم، تکلیف کسانی که با قیمت بالا دوره رو تهیه کردند چیه؟؟؟ فرض کنید بعد یک هفته سقف تعیین شده پر شد شما هم تو همین یک هفته دوره رو خریداری کردید و بنده در هفته آینده این دوره خیلی گرون رو رایگان دانلود میکنم دیگه خود حدیث مفصل بخوان از این مجمل.
در مورد اینکه کانتنت فارسی بدرد نمیخوره که باید بگم برادر جان، پس دلیل استفادت از کانتنتی که بدرد نمی خوره چیه؟ میخوای بعد از گذروندن 100 ساعت دوره به خودت اثبات کنی که دیدی بدرد نمی خورده؟!
و در مورد فلسفه آخر عزیزانی که میگن گرونه و اینقدر نمیرزه! و حالا که نمیرزه میرم رایگان پیدا و دانلودش میکنم!!! سوالی پیش میاد، تصورش رو بکنید رفتید یه لپ تاپ بخرید فروشنده میگن 40 میلیون قیمتشه! آیا برمیگردید به خودتون بگید نه بابا این لپتاپ اینقدر نمیرزه بجاش امشب میام میدزدمش؟؟؟ (البته دور از جون همتون)
ببخشید دل پری داشتم خوشحال میشم نظر شما دوستان رو هم در این مورد بدونم
👍12👏2
💎 کلاس های رکورد در جاوا
🔆 در جاوا یک روش ذخیره داده ها، استفاده از رکورد است. رکورد یک نوع خاص کلاس در جاوا است و عموما برای ذخیره داده های ساده کاربرد دارد. برای مثال ذخیره داده های فایل CSV.
🔅رکورد بر خلاف کلاس به نوشتن ستر و گتر احتیاج ندارد و یا به عبارتی دارای کد های بلند و غیر ضروری (بویلرپلت کد) نیست. در واقع زمانی که یک رکورد ایجاد میکنید، کمپایلر بصورت خودکار متد های گتر، هش کد و equals و همینطور toString را برای آن ایجاد میکند.
✒️ قواعد (Syntax)
برای ایجاد رکورد از کلیدواژه record استفاده میکنیم و مقابل کلیدواژه رکورد، اسم رکورد (Person) قرار میگیرد. بعد از نام گذاری، باید فیلد های مورد استفاده در رکورد و همینطور نوع آنها را مشخص کنیم:
📝 نحوه استفاده
دقیقا مشابه کلاس ها، برای رکورد هم میتوانیم به راحتی با کلیدواژه new یک نمونه ایجاد کنیم.
Ali
[email protected]
27
Person[name=Ali, [email protected], age=27]
🟡 نکاتی در رابطه با رکورد ها در جاوا
🔸 رکورد یک کلاس فاینال است. در نتیجه قابل ارث بری نیست.
🔸 داده های رکورد، ایممیوتبل (غیرقابل تغییر) اند. در نتیجه برای داده های رکورد متد های ستر نداریم.
🔸 رکورد میتواند دارای چند کنستراکتور(سازنده) باشد:
🔸 برای رکورد میتوان یک کنستراکتور فشرده (compact constructor) ایجاد کرد. در واقع این نوع کنستراکتور ها هیچ ورودی نمیگیرند و هنگام ایجاد شدن صدا زده خواهند شد:
☕️ @PIECEJAVA
🔆 در جاوا یک روش ذخیره داده ها، استفاده از رکورد است. رکورد یک نوع خاص کلاس در جاوا است و عموما برای ذخیره داده های ساده کاربرد دارد. برای مثال ذخیره داده های فایل CSV.
🔅رکورد بر خلاف کلاس به نوشتن ستر و گتر احتیاج ندارد و یا به عبارتی دارای کد های بلند و غیر ضروری (بویلرپلت کد) نیست. در واقع زمانی که یک رکورد ایجاد میکنید، کمپایلر بصورت خودکار متد های گتر، هش کد و equals و همینطور toString را برای آن ایجاد میکند.
✒️ قواعد (Syntax)
برای ایجاد رکورد از کلیدواژه record استفاده میکنیم و مقابل کلیدواژه رکورد، اسم رکورد (Person) قرار میگیرد. بعد از نام گذاری، باید فیلد های مورد استفاده در رکورد و همینطور نوع آنها را مشخص کنیم:
public record Person(String name,به همین سادگی یک رکورد ایجاد کردیم که اطلاعات یک شخص اعم از نام، ایمیل و سن را در خود ذخیره میکند.
String email,
int age) {}
📝 نحوه استفاده
دقیقا مشابه کلاس ها، برای رکورد هم میتوانیم به راحتی با کلیدواژه new یک نمونه ایجاد کنیم.
Person first = new Person("Ali","[email protected]",42);
از آنجا که کمپایلر بصورت خودکار متد های گتر را برای رکورد قرار داده است، میتوانیم از این متد ها نیز به راحتی استفاده کنیم:public class Main {
public static void main(String[] args){
Person first = new Person("Ali","[email protected]",27);
System.out.println(first.name());
System.out.println(first.email());
System.out.println(first.age());
System.out.println(first);
}
}
OUTPUT:Ali
[email protected]
27
Person[name=Ali, [email protected], age=27]
🟡 نکاتی در رابطه با رکورد ها در جاوا
🔸 رکورد یک کلاس فاینال است. در نتیجه قابل ارث بری نیست.
🔸 داده های رکورد، ایممیوتبل (غیرقابل تغییر) اند. در نتیجه برای داده های رکورد متد های ستر نداریم.
🔸 رکورد میتواند دارای چند کنستراکتور(سازنده) باشد:
public record Person(String name, String email, int age) {
public Person(String name,int age){
this(name,null,age);
}
}
البته به این نکته توجه داشته باشید که برای کنستراکتور جدید، از دیفالت کنستراکتور استفاده کرده ایم. زیرا در غیر اینصورت خطای کمپایل در برخواهد داشت.🔸 برای رکورد میتوان یک کنستراکتور فشرده (compact constructor) ایجاد کرد. در واقع این نوع کنستراکتور ها هیچ ورودی نمیگیرند و هنگام ایجاد شدن صدا زده خواهند شد:
public record Person(String name,String email, int age) {
public Person{
System.out.println("Compact Constructor");
}
}
———☕️ @PIECEJAVA
👍9
تیکه پاره های جاوا
💎 کلاس های رکورد در جاوا 🔆 در جاوا یک روش ذخیره داده ها، استفاده از رکورد است. رکورد یک نوع خاص کلاس در جاوا است و عموما برای ذخیره داده های ساده کاربرد دارد. برای مثال ذخیره داده های فایل CSV. 🔅رکورد بر خلاف کلاس به نوشتن ستر و گتر احتیاج ندارد و یا به…
مثال هایی از کلاس record
☕️ @PIECEJAVA
☕️ @PIECEJAVA
👍9
💎 اینترفیس یا واسط چیست و چرا استفاده میکنیم؟
🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند.
☕️ @PIECEJAVA
🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند.
☕️ @PIECEJAVA
👍7
تیکه پاره های جاوا
💎 اینترفیس یا واسط چیست و چرا استفاده میکنیم؟ 🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند. ☕️ @PIECEJAVA
🔰 برای مثال فرض کنید قرار است انواع گوشی های هوشمند از کلاس موبایل ارث بری کنند که ویژگی های اولیه یک گوشی را پیاده سازی میکنند. مثلا لازم است که تمامی گوشی ها بخش گالری، دوربین و مرورگر و... داشته باشند. حالا هر کلاسی از مجموعه گوشی های هوشمند که واسط موبایل را پیاده سازی کند، موظف است متد های مربوط به موبایل را هم پیدا سازی کند. در نتیجه به کمک اینترفیس میتوان این اطمینان را حاصل کرد که تمامی کلاس های گوشی این ویژگی ها را پیاده سازی میکنند:
💡 از آنجا که متد های ابسترکت باید پیاده سازی شوند، در نتیجه لزومی به نوشتن سطح دسترسی متد ابسترکت نیست.
برای پیاده سازی اینترفیس بعد از اسم کلاس از کلیدواژه implements و سپس اسم اینترفیس مورد نظر استفاده میشود. برای مثال:
💬البته از بعد جاوای 8 متد های دیفالت و استاتیک هم به اینترفیس ها اضافه شده که انشالله در فرصتی دیگر حتما بررسی میشه :)
#interface
———
☕️ @PIECEJAVA
public interface Mobile {
void browser();
void camera();
void gallery();
}
💡 به متد هایی که فقط تعریف شوند و بدنه ای نداشته باشند (پیاده سازی نشده باشند) آبسترکت گفته میشود. یعنی فقط امضای متد method signature نوشته میشود. منظور از امضای متد، ساختار اولیه متد میباشد که نشان دهنده سطح دسترسی، نوع خروجی، اسم متد و ورودی های متد است. برای مثال:void browser();💡 اینترفیس حاوی متد های ابسترکت میباشد.
💡 از آنجا که متد های ابسترکت باید پیاده سازی شوند، در نتیجه لزومی به نوشتن سطح دسترسی متد ابسترکت نیست.
برای پیاده سازی اینترفیس بعد از اسم کلاس از کلیدواژه implements و سپس اسم اینترفیس مورد نظر استفاده میشود. برای مثال:
public class Note8Pro implements Mobile{
@Override
public void browser() { }
@Override
public void camera() { }
@Override
public void gallery() { }
}
حالا برای هر کلاس متد های browser , camera و gallery را پیاده سازی میکنیم. دقت داشته باشید که حذف هر کدام از متد های بالا، خطای کمپایلر را خواهد داشت. زیرا همانطور که گفتیم، کلاس ها موظفند این متد ها را پیاده سازی کنند.💬البته از بعد جاوای 8 متد های دیفالت و استاتیک هم به اینترفیس ها اضافه شده که انشالله در فرصتی دیگر حتما بررسی میشه :)
#interface
———
☕️ @PIECEJAVA
👍11
#مثبت_برنامه_نویس
#پیشنهاد
🟨 داکیومنت های آفلاین با نرم افزار Zeal
- از طریق 🔗 لینک وارد سایت Zeal بشید و برنامه Zeal رو دانلود کنید.
- بعد از دانلود و نصب، از طریق منوی
Tools > Docsets > Available
میتونید داکیومنت مربوط به زبان دلخواهتون رو یکبار برای همیشه دانلود و بصورت آفلاین استفاده کنید.
💬 البته نه فقط جاوا، بلکه داکیومنت هر زبونی که بخواید رو داره و میتونید برای همیشه بصورت آفلاین داشته باشید. (لیست داکیومنت زبان ها از طریق خود سایت قابل دسترسیه) :)
⭕️ اگه احیانا داکیومنت مدنظرتون داخل Docset وجود نداشت (مثلا کاتلین، three.js یا... )، از طریق 🔗آدرس لینک یکی از پکیج های XML یا JSON مربوط به زبان رو کپی کنید و از بخش Docset از طریق گزینه Add Feed آدرس پکیج رو به برنامه بدید تا دانلود رو شروع کنه.
~موفق باشید❤️
☕️@PIECEJAVA
#پیشنهاد
🟨 داکیومنت های آفلاین با نرم افزار Zeal
- از طریق 🔗 لینک وارد سایت Zeal بشید و برنامه Zeal رو دانلود کنید.
- بعد از دانلود و نصب، از طریق منوی
Tools > Docsets > Available
میتونید داکیومنت مربوط به زبان دلخواهتون رو یکبار برای همیشه دانلود و بصورت آفلاین استفاده کنید.
💬 البته نه فقط جاوا، بلکه داکیومنت هر زبونی که بخواید رو داره و میتونید برای همیشه بصورت آفلاین داشته باشید. (لیست داکیومنت زبان ها از طریق خود سایت قابل دسترسیه) :)
⭕️ اگه احیانا داکیومنت مدنظرتون داخل Docset وجود نداشت (مثلا کاتلین، three.js یا... )، از طریق 🔗آدرس لینک یکی از پکیج های XML یا JSON مربوط به زبان رو کپی کنید و از بخش Docset از طریق گزینه Add Feed آدرس پکیج رو به برنامه بدید تا دانلود رو شروع کنه.
~موفق باشید❤️
☕️@PIECEJAVA
👍9
🧊 انواع بلاک ها در جاوا (قسمت اول)
🔆 در جاوا به مجموعه ی خطوط کد که در یک بدنه { } قرار گرفته اند ، بلاک گفته میشود. از بلاک عموما برای دسته بندی خطوط کد (statement) استفاده میشود. برای مثال چهار خط زیر نشان دهنده یک بلاک میباشد. :
🔆 در جاوا به مجموعه ی خطوط کد که در یک بدنه { } قرار گرفته اند ، بلاک گفته میشود. از بلاک عموما برای دسته بندی خطوط کد (statement) استفاده میشود. برای مثال چهار خط زیر نشان دهنده یک بلاک میباشد. :
{
int x = 0;
x++
}
در حالت کلی سه نوع بلاک در جاوا داریم که در این قسمت بلاک محلی را بررسی خواهیم کرد.👍9
💠 بلاک محلی (local block):
🔅 بلاک کدی که داخل بلاک یک متد، کنستراکتور یا حتی داخل بدنه بلاک دیگر(بلاک تو در تو) ساخته شود، به آن بلاک محلی گفته میشود. برای مثال:
❌ در نظر داشته باشید که فقط در محدوده خود بلاک قابل دسترسی هستند. در نتیجه کد زیر خطای کمپایلر به همراه خواهد داشت.
#block
☕️@PIECEJAVA
🔅 بلاک کدی که داخل بلاک یک متد، کنستراکتور یا حتی داخل بدنه بلاک دیگر(بلاک تو در تو) ساخته شود، به آن بلاک محلی گفته میشود. برای مثال:
public class Main {
public static void main(String[] args) {
{//localBlock
int x = 0;
System.out.println("Hello x = "+x);
}
}
}
🔅 این نوع بلاک فقط زمانی اجرا میشود که متد، کنستراکتور یا بلاک در برگیرنده آن اجرا شود.❌ در نظر داشته باشید که فقط در محدوده خود بلاک قابل دسترسی هستند. در نتیجه کد زیر خطای کمپایلر به همراه خواهد داشت.
{
int x = 0;
x++;
}
//x cannot be used outside that block
System.out.println(x);
❌ نمیتوانید دو متغیر همنام، یکی قبل از بلاک و یکی داخل بلاک همزمان داشته باشید. برای مثال بلاک زیر هم خطای کمپایلر خواهد داشت:public class Main {
public static void main(String[] args) {
int num = 20;
{
// Invalid. A compile-time error.
int num = 30;
}
}
}
———#block
☕️@PIECEJAVA
👍10
💠 رفتار عجیب رشته ها در ترکیب با اعداد
تکه کد زیر را در نظر بگیرید:
String s = 1 + 2 + " My String " + 3 + 4 + 5;
System.out.println(s);
———
⚙️ OUTPUT
3 My String 345
——--- -
🔴Question
#چرا 2 عدد اول با هم جمع میشوند ولی سه عدد آخر (مانند رشته ها) به هم وصل میشوند؟
———-- -
🟢Answer
در بحث رشته ها وقتی از داده ای استفاده میشود، داده در نهایت به رشته تبدیل میشود. برای مثال با رشته زیر
"String" + 1
مانند رشته زیر در نهایت رفتار میشود:
"String" + "1"
اما اگر هیچ رشته ای نداشته باشیم، پلاس بعنوان عملگر حسابی در بین داده ها درنظر گرفته میشود و بعد از محاسبات، نتیجه نهایی تبدیل به رشته میشود. در نتیجه خروجی زیر رشته 3 خواهد بود:
String str = 1+2; // "3"
———-- -
🟡Conclusion
رشته ها از چپ به راست خوانده میشوند. پس میتوان رشته بالا را میتوان بصورت زیر دسته بندی کرد:
(((((1 + 2) + " My String ")+ 3) + 4) + 5)
در نتیجه اولین + بعنوان عملگر حسابی در نظر گرفته میشود، زیرا هنوز به رشته ای نرسیده ایم پس دو عدد را با هم جمع میکند و سپس به رشته تبدیل میکند. + دوم رشته 3 و "My String" را به هم وصل میکند. به همین ترتیب + های بعدی رشته های 3، 4 و 5 را به رشته اصلی وصل میکنند.
در نهایت اگر میخواهید + بین 3 و 4 و 5 بعنوان عملگر حسابی در نظر گرفته شود، این سه عدد را درون یک پرانتز قرار دهید:
1 + 2 + "My String " + (3 + 4 + 5)
☕️ @PIECEJAVA
تکه کد زیر را در نظر بگیرید:
String s = 1 + 2 + " My String " + 3 + 4 + 5;
System.out.println(s);
———
⚙️ OUTPUT
3 My String 345
——--- -
🔴Question
#چرا 2 عدد اول با هم جمع میشوند ولی سه عدد آخر (مانند رشته ها) به هم وصل میشوند؟
———-- -
🟢Answer
در بحث رشته ها وقتی از داده ای استفاده میشود، داده در نهایت به رشته تبدیل میشود. برای مثال با رشته زیر
"String" + 1
مانند رشته زیر در نهایت رفتار میشود:
"String" + "1"
اما اگر هیچ رشته ای نداشته باشیم، پلاس بعنوان عملگر حسابی در بین داده ها درنظر گرفته میشود و بعد از محاسبات، نتیجه نهایی تبدیل به رشته میشود. در نتیجه خروجی زیر رشته 3 خواهد بود:
String str = 1+2; // "3"
———-- -
🟡Conclusion
رشته ها از چپ به راست خوانده میشوند. پس میتوان رشته بالا را میتوان بصورت زیر دسته بندی کرد:
(((((1 + 2) + " My String ")+ 3) + 4) + 5)
در نتیجه اولین + بعنوان عملگر حسابی در نظر گرفته میشود، زیرا هنوز به رشته ای نرسیده ایم پس دو عدد را با هم جمع میکند و سپس به رشته تبدیل میکند. + دوم رشته 3 و "My String" را به هم وصل میکند. به همین ترتیب + های بعدی رشته های 3، 4 و 5 را به رشته اصلی وصل میکنند.
در نهایت اگر میخواهید + بین 3 و 4 و 5 بعنوان عملگر حسابی در نظر گرفته شود، این سه عدد را درون یک پرانتز قرار دهید:
1 + 2 + "My String " + (3 + 4 + 5)
☕️ @PIECEJAVA
👍15❤1
👏10❤1👎1
💬 دوستان اگه در رابطه با گیت، توسعه نرم افزار و در کل در رابطه با محدودیت های اینترنت به مسئله خوردین، حتما یبار به آدرس زیر سر بزنید:
🔗 https://github.com/freedomofdevelopers/fod
☕️ @pieceJava
🔗 https://github.com/freedomofdevelopers/fod
☕️ @pieceJava
GitHub
GitHub - freedomofdevelopers/fod: Freedom of Developers
Freedom of Developers. Contribute to freedomofdevelopers/fod development by creating an account on GitHub.
👏7
💠 در جاوا پارامتر ها چگونه به متد ها ارسال میشوند؟
💬 یکی از مهم ترین سوالات خیلی مهم اینه که آیا جاوا Call By Value هست یا Call By Reference ؟
خب اول باید بگم که جاوا call by value هست. اما این اصطلاحات به چه معناست؟
🔶 در جاوا Call By Value یعنی از مقادیر ورودی به متد(پارامتر های ورودی)، یک کپی گرفته میشود و تمامی اعمال بر روی کپی مقادیر ورودی انجام میشود و نه خود مقادیر ورودی. در نتیجه مقادیر ورودی دچار تغییر نمیشوند. برای مثال:
⚙️ OUTPUT
a = 1 b = 2
swap a and b...
a = 1 b = 2
همانطور که میبینید در اصل مقادیر هیچ تغییری ایجاد نشده است.
🔶 در مقابل Call By Reference هم مقادیر ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند. در نتیجه تغییری درون متد اعمال شود، این تغییرات بر روی ورودی تاثیر مستقیم خواهد داشت.( یعنی اگه جاوا call By Reference بود پس متد swap باید برای a و b عمل میکرد )
❓ اما یک ابهام وجود دارد. اینکه چرا در برنامه زیر، مقدار x در آبجکت ذخیره شده به عدد 475 تغییر پیدا میکند؟
⚙️ OUTPUT
t.x = 1
Change X Value...
t.x = 475
در این حالت هم وقتی یک متغیر از نوع مرجع بعنوان ورودی ارسال میشود، در واقع فقط آدرس آبجکت در حافظه بعنوان کپی فرستاده میشود. در نتیجه از آنجا که هم ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند، تغییر اعمال شده مستقیما بر روی داده های خانه مورد نظر در حافظه اثر میگذارند.
💬 پس اگه ورودی و کپی ایجاد شده هر دو آدرسشون به یه خونه اشاره کنن، این تغییر صورت میگیره اما اگر سعی کنیم آدرس یه آبجکت دیگه رو به متغیر پاس بدیم، روی ورودی اصلی هیچ تغییری اعمال نمیشه. مثلا:
⚙️ OUTPUT
t.x = 1
Change Object...
t.x = 1
———
#pass_by_reference #pass_by_value
#call_by_value #call_by_reference
☕️ @PIECEJAVA
💬 یکی از مهم ترین سوالات خیلی مهم اینه که آیا جاوا Call By Value هست یا Call By Reference ؟
خب اول باید بگم که جاوا call by value هست. اما این اصطلاحات به چه معناست؟
🔶 در جاوا Call By Value یعنی از مقادیر ورودی به متد(پارامتر های ورودی)، یک کپی گرفته میشود و تمامی اعمال بر روی کپی مقادیر ورودی انجام میشود و نه خود مقادیر ورودی. در نتیجه مقادیر ورودی دچار تغییر نمیشوند. برای مثال:
class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a = "+a + "\t b = "+b);
swap(a,b);
System.out.println("swap a and b...");
System.out.println("a = "+a + "\t b = "+b);
}
static void swap(int a,int b){
int temp = a;
a = b;
b= temp;
}
}
—————⚙️ OUTPUT
a = 1 b = 2
swap a and b...
a = 1 b = 2
همانطور که میبینید در اصل مقادیر هیچ تغییری ایجاد نشده است.
🔶 در مقابل Call By Reference هم مقادیر ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند. در نتیجه تغییری درون متد اعمال شود، این تغییرات بر روی ورودی تاثیر مستقیم خواهد داشت.( یعنی اگه جاوا call By Reference بود پس متد swap باید برای a و b عمل میکرد )
❓ اما یک ابهام وجود دارد. اینکه چرا در برنامه زیر، مقدار x در آبجکت ذخیره شده به عدد 475 تغییر پیدا میکند؟
class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeX(t);
System.out.println("Change X Value...");
System.out.println("t.x = "+t.x);
}
static void changeX(Test t) {t.x = 475;}
}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————⚙️ OUTPUT
t.x = 1
Change X Value...
t.x = 475
در این حالت هم وقتی یک متغیر از نوع مرجع بعنوان ورودی ارسال میشود، در واقع فقط آدرس آبجکت در حافظه بعنوان کپی فرستاده میشود. در نتیجه از آنجا که هم ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند، تغییر اعمال شده مستقیما بر روی داده های خانه مورد نظر در حافظه اثر میگذارند.
💬 پس اگه ورودی و کپی ایجاد شده هر دو آدرسشون به یه خونه اشاره کنن، این تغییر صورت میگیره اما اگر سعی کنیم آدرس یه آبجکت دیگه رو به متغیر پاس بدیم، روی ورودی اصلی هیچ تغییری اعمال نمیشه. مثلا:
class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeObject(t);
System.out.println("Change Object...");
System.out.println("t.x = "+t.x);
}
static void changeObject(Test t) {
t = new Test(10);
}
}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————⚙️ OUTPUT
t.x = 1
Change Object...
t.x = 1
———
#pass_by_reference #pass_by_value
#call_by_value #call_by_reference
☕️ @PIECEJAVA
👍7
مطالب کانال تا چه حد براتون واضح و مفهومه؟
Anonymous Poll
54%
کاملا واضح
23%
قابل فهم ولی بعضی جملات مبهمه
16%
توی هر پست باید توضیح بیشتری داده بشه و مثال بیشتری زده بشه
7%
توضیحات پستها عموما کافی نیست
❤4
تیکه پاره های جاوا
مطالب کانال تا چه حد براتون واضح و مفهومه؟
راستی تا یادم نرفته اگه نظر / انتقاد یا پیشنهادی هم دارین خوشحال میشم باهام در میون بزارید❤️ ^ ^
~ @MRVJ475
~ @MRVJ475
❤9