با توجه به اینکه اینترفیس ها از نسخه ی Jdk 8 به بعد میتوانند متد هایی با پیاده سازی داشته باشند (default method) چه زمانی از abstract class و چه زمانی از interface استفاده کنیم ؟
تفاوت بنیادین اینترفیس و کلاس abstract در این است که اولا کلاس آبسترکت میتواند constructor (سازنده) داشته باشد و این بدین معناست که میتواند مقادیری درون خود نگه دارد و بعد ها بنا به دلایلی از آن استفاده کند.. همچنین اعلام میدارد یک شی نمیتواند بوجود آید مگر با فلان مقادیر : مثلا فرض کنید Human نیاز به جنسیت دارد .. پر واضح است که یک انسان وجود ندارد مگر اینکه جنسیت آن مشخص باشد .انسانی بدنیا نمی آید که فاقد جنسیت باشد
بنابراین در abstract class ما یک سازنده میذاریم و جنسیت رو از کلاس فرزند میگیریم (فرضا فرزند میتونه کلاس مونث و مذکر باشد)
اما اگر Human را اینترفیس تعریف میکردیم درواقع چنین مفهومی را نقض میکردیم چرا که اینترفیس ها فاقد سازنده هستند.
به بیان ساده یک ابسترکت کلاس میگوید آن آبجکت دقیقا کی(چی) است
اما اینترفیس میگوید آن آبجکت دقیقا چه میتواند بکند
مثلا ما میتونیم ابسترکت کلاسی برای پرنده ها تعریف کنیم
اما همه ی پرنده ها پرواز نمیکنن
و یک اینترفیس Flyable تعریف کنیم فقط آنهایی که قابلیت پرواز دارند آن را پیاده سازی کنند .
به این جمله ی کلیدی توجه کنید :
اینترفیس نمیتواند توضیح دهد که دوبرمن نوعی سگ است .. تنها میتواند توضیح دهد که دوبرمن میتواند راه رود (یا مثلا هنگام مواجه با دشمن ,او را گاز گیرد )
برای اینکه بگوییم دوبرمن نوعی سگ است ناچار به تعریف کلاس پدر برای آن هستیم
@this_java
تفاوت بنیادین اینترفیس و کلاس abstract در این است که اولا کلاس آبسترکت میتواند constructor (سازنده) داشته باشد و این بدین معناست که میتواند مقادیری درون خود نگه دارد و بعد ها بنا به دلایلی از آن استفاده کند.. همچنین اعلام میدارد یک شی نمیتواند بوجود آید مگر با فلان مقادیر : مثلا فرض کنید Human نیاز به جنسیت دارد .. پر واضح است که یک انسان وجود ندارد مگر اینکه جنسیت آن مشخص باشد .انسانی بدنیا نمی آید که فاقد جنسیت باشد
بنابراین در abstract class ما یک سازنده میذاریم و جنسیت رو از کلاس فرزند میگیریم (فرضا فرزند میتونه کلاس مونث و مذکر باشد)
اما اگر Human را اینترفیس تعریف میکردیم درواقع چنین مفهومی را نقض میکردیم چرا که اینترفیس ها فاقد سازنده هستند.
به بیان ساده یک ابسترکت کلاس میگوید آن آبجکت دقیقا کی(چی) است
اما اینترفیس میگوید آن آبجکت دقیقا چه میتواند بکند
مثلا ما میتونیم ابسترکت کلاسی برای پرنده ها تعریف کنیم
اما همه ی پرنده ها پرواز نمیکنن
و یک اینترفیس Flyable تعریف کنیم فقط آنهایی که قابلیت پرواز دارند آن را پیاده سازی کنند .
به این جمله ی کلیدی توجه کنید :
اینترفیس نمیتواند توضیح دهد که دوبرمن نوعی سگ است .. تنها میتواند توضیح دهد که دوبرمن میتواند راه رود (یا مثلا هنگام مواجه با دشمن ,او را گاز گیرد )
برای اینکه بگوییم دوبرمن نوعی سگ است ناچار به تعریف کلاس پدر برای آن هستیم
@this_java
👍3
demo1 2.zip
37.2 KB
یه پروژه ی ساده ی جاوا اف ایکسی
استفاده از jdbc و پیاده سازی روابط بین تیبل ها در آن(دیتابیس H2)
این برنامه قراره دوره های یک موسسه ی آموزشی رو مدیریت کنه...مدیر استاد ادد میکنه استاد هم کورس و بقیه هم میتونن ثبت نام کنن
@this_java
استفاده از jdbc و پیاده سازی روابط بین تیبل ها در آن(دیتابیس H2)
این برنامه قراره دوره های یک موسسه ی آموزشی رو مدیریت کنه...مدیر استاد ادد میکنه استاد هم کورس و بقیه هم میتونن ثبت نام کنن
@this_java
Learn Java via @like
خروجی کد بالا چیست ؟ 1: 100 2: -100 3: Error cannot assign an int to a byte value 4: هیچکدام @this_java
پاسخ صحیح گزینه ی سه
فرض کنید داشته باشیم
byte b =50;
byte c = 100;
byte a =40;
int d= a*b/c;
واضح است که محدوده ی محاسبات از محدوده ی بایت فراتر میرود راه حل جاوا برای جلوگیری از این مسئله این است که به هنگام محاسبات ریاضی داده هایbyte,short, character به صورت خودکار به int ارتقا داده میشوند بنابراین a*b بصورت integer محاسبه میگردد و نه byte. بنابراین نتیجه ی عبارت ۲۰۰۰ است و عملیات۵۰×۴۰ با توجه به اینکه هردو از نوع byteهستند به درستی انجام میپذیرد.
علی رغم مزایای ارتقای خودکار نوع در هنگام محاسبات ریاضی ، میتواند منجر به چنین خطاهای گیج کننده ای در زمان کامپایل شود.
در مثال بالا ۵۰×۲ به int تبدیل میشود بنابراین بدون casting نمیتواند درون byte قرار گیرد
@this_java
فرض کنید داشته باشیم
byte b =50;
byte c = 100;
byte a =40;
int d= a*b/c;
واضح است که محدوده ی محاسبات از محدوده ی بایت فراتر میرود راه حل جاوا برای جلوگیری از این مسئله این است که به هنگام محاسبات ریاضی داده هایbyte,short, character به صورت خودکار به int ارتقا داده میشوند بنابراین a*b بصورت integer محاسبه میگردد و نه byte. بنابراین نتیجه ی عبارت ۲۰۰۰ است و عملیات۵۰×۴۰ با توجه به اینکه هردو از نوع byteهستند به درستی انجام میپذیرد.
علی رغم مزایای ارتقای خودکار نوع در هنگام محاسبات ریاضی ، میتواند منجر به چنین خطاهای گیج کننده ای در زمان کامپایل شود.
در مثال بالا ۵۰×۲ به int تبدیل میشود بنابراین بدون casting نمیتواند درون byte قرار گیرد
@this_java
👍3
تفاوت کلید واژه ی super و extends در generics چیست؟
راس C2 از درخت فوق را مد نظر بگیرید
فرض کنید میخواهیم لیستی داشته باشیم که فقط بتواند مقادیری از نوع راس C2 فرزندان آن (کلاس هایی که از C2 مشتق شده اند به آن فلش وارد کرده اند برای مثال منظور از مقادیری از نوع C2 خود C2 و D1 و E2 و... میباشد)
در این صورت از extends استفاده میکنیم:
List<? extends C2> list;
بدین شکل میتوانیم مقادیری از نوع c2 و زیر کلاس های آن را در این لیست ذخیره کنیم
حال فرض کنید میخواهیم مقادیری از نوع C2 و سوپر کلاس های آنرا ذخیره کنیم(مانند B3 و B2 و A4 و...)
در این صورت از super استفاده میکنیم:
List<? super C2> list;
درواقع هر کلاسی که میخواهیم به این لیست اضافه کنیم یا باید از جنس C2 باشد یا از جنس پدران C2
کاربرد این دو کجاست؟
برای مثال متد copy از کلاس Collections را بررسی میکنیم:
راس C2 از درخت فوق را مد نظر بگیرید
فرض کنید میخواهیم لیستی داشته باشیم که فقط بتواند مقادیری از نوع راس C2 فرزندان آن (کلاس هایی که از C2 مشتق شده اند به آن فلش وارد کرده اند برای مثال منظور از مقادیری از نوع C2 خود C2 و D1 و E2 و... میباشد)
در این صورت از extends استفاده میکنیم:
List<? extends C2> list;
بدین شکل میتوانیم مقادیری از نوع c2 و زیر کلاس های آن را در این لیست ذخیره کنیم
حال فرض کنید میخواهیم مقادیری از نوع C2 و سوپر کلاس های آنرا ذخیره کنیم(مانند B3 و B2 و A4 و...)
در این صورت از super استفاده میکنیم:
List<? super C2> list;
درواقع هر کلاسی که میخواهیم به این لیست اضافه کنیم یا باید از جنس C2 باشد یا از جنس پدران C2
کاربرد این دو کجاست؟
برای مثال متد copy از کلاس Collections را بررسی میکنیم:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
@this_java👍4👎1
Learn Java
تفاوت کلید واژه ی super و extends در generics چیست؟ راس C2 از درخت فوق را مد نظر بگیرید فرض کنید میخواهیم لیستی داشته باشیم که فقط بتواند مقادیری از نوع راس C2 فرزندان آن (کلاس هایی که از C2 مشتق شده اند به آن فلش وارد کرده اند برای مثال منظور از مقادیری…
پر واضح است که لیست مبدا میتواند T و همچنین زیر کلاس های آنرا داشته باشد (لیست مبدا نوعی از ان باشد) اما لیست مقصد فقط میتواند نوع T و سوپر کلاس های آنرا داشته باشد (لیست مقصد میتواند از نوع T یا سوپر کلاس آن باشد)
چراکه بر طبق قواعد شی گرایی جاوا یک کلاس میتواند در متغیری از همان نوع و یا نوع کلاس پدر نگهداری شود(اگر لیست مقصد هم extends داشت باید عملیات کست انجام میشد تا داده های مبدا بتوانند به پدران خود تبدیل شوند)
@this_java
چراکه بر طبق قواعد شی گرایی جاوا یک کلاس میتواند در متغیری از همان نوع و یا نوع کلاس پدر نگهداری شود(اگر لیست مقصد هم extends داشت باید عملیات کست انجام میشد تا داده های مبدا بتوانند به پدران خود تبدیل شوند)
@this_java
👍4
There are only two hard things in Computer Science: cache invalidation and naming things.
– Phil Karlton
Java code conventions can be found here:
https://www.oracle.com/technetwork/java/codeconventions-150003.pdf
https://google.github.io/styleguide/javaguide.html
– Phil Karlton
Java code conventions can be found here:
https://www.oracle.com/technetwork/java/codeconventions-150003.pdf
https://google.github.io/styleguide/javaguide.html
Java Best Practice.pdf
12.7 MB
یک کتاب عالی برای فهمیدن Best Practice ها در جاوا
برشی از کتاب Clean code عمو باب
برشی از کتاب Clean code عمو باب
👍2