منظور از اشیاء POJO در جاوا چیست؟
کلاس های معمولی و بسیار ساده که از کلاس دیگری ارث نبرده اند و جزء فریم ورک و بین نیستند و صرفا برای معرفی و کار با فیلد ها و خاصیت های شی گرفته شده از کلاس می باشند ، یکی از کاربردهای این کلاسها برای معرفی موجودیت های متصل به دیتابیس در Hibernate و Jpa می باشد که کلاس و یا اشیا را به دیتابیس یا فایل Map برقرار میکند.
نمونه کلاس POJO
public class Jdluser implements java.io.Serializable {
private Integer id;
private String name;
private String lastName;
private String email;
public Jdluser() {
}
public Jdluser(String name, String lastName, String email) {
this.name = name;
this.lastName = lastName;
this.email = email;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
@this_java
کلاس های معمولی و بسیار ساده که از کلاس دیگری ارث نبرده اند و جزء فریم ورک و بین نیستند و صرفا برای معرفی و کار با فیلد ها و خاصیت های شی گرفته شده از کلاس می باشند ، یکی از کاربردهای این کلاسها برای معرفی موجودیت های متصل به دیتابیس در Hibernate و Jpa می باشد که کلاس و یا اشیا را به دیتابیس یا فایل Map برقرار میکند.
نمونه کلاس POJO
public class Jdluser implements java.io.Serializable {
private Integer id;
private String name;
private String lastName;
private String email;
public Jdluser() {
}
public Jdluser(String name, String lastName, String email) {
this.name = name;
this.lastName = lastName;
this.email = email;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
@this_java
اینترفیس ها در جاوا از کلاس Object ارث بری نکرده اند اما چرا برخی از متد ها آن را می توان در اینترفیس override کرد؟
در زبان برنامه نویسی جاوا فقط کلاس ها فرزند کلاس Object هستند. برای توجیح مورد فوق نیز بر اساس بند 9.2 در Java language Specification اگر یک interface بصورت مستقیم فرزند هیچ interface دیگری نباشد، به ازای تمامی متد های public کلاس Object یک متد ضمنی (implicit) که abstract و public است در آن interface تعریف می شود.
https://stackoverflow.com/questions/6056124/do-interfaces-inherit-from-object-class-in-java
@this_java
در زبان برنامه نویسی جاوا فقط کلاس ها فرزند کلاس Object هستند. برای توجیح مورد فوق نیز بر اساس بند 9.2 در Java language Specification اگر یک interface بصورت مستقیم فرزند هیچ interface دیگری نباشد، به ازای تمامی متد های public کلاس Object یک متد ضمنی (implicit) که abstract و public است در آن interface تعریف می شود.
https://stackoverflow.com/questions/6056124/do-interfaces-inherit-from-object-class-in-java
@this_java
Stack Overflow
Do interfaces inherit from Object class in java
Do interfaces inherit from Object class in Java?
If no then how we are able to call the method of object class on interface instance
public class Test {
public static void main(String[] args)...
If no then how we are able to call the method of object class on interface instance
public class Test {
public static void main(String[] args)...
👍2
تغییر دادن رنگ کاراکتر که میخواید توی خروجی چاپش کنید:
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
بعد میتونید اینطوری استفاده کنید :
System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);
@this_java
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
بعد میتونید اینطوری استفاده کنید :
System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);
@this_java
MolToAll.rar
2.8 MB
سورس کد برنامه ی شیمی:
موازنه انجام میده و تبدیلات مولی و خیلی چیز های دیگه ی مربوط به شیمی
java fx
واقعا زیاد براش زحمت کشیدم امیدوارم بدردتون بخوره
@this_java
موازنه انجام میده و تبدیلات مولی و خیلی چیز های دیگه ی مربوط به شیمی
java fx
واقعا زیاد براش زحمت کشیدم امیدوارم بدردتون بخوره
@this_java
VideoPlayer.rar
17 KB
سورس کد برنامه ی مدیا پلیر... موسیقی و فیلم
با کلید های میانبر : برای فول اسکرین و کاهش و افزایش صدا و...
java FX
@this_java
با کلید های میانبر : برای فول اسکرین و کاهش و افزایش صدا و...
java FX
@this_java
تعریف کلان داده (گارتنر)
بیگ دیتا (Big Data) به معنای داراییهای اطلاعاتی [یک مجموعه یا سازمان] است که:
حجم بالا دارن
با سرعت زیاد تولید میشوند و / یا تنوع گسترده دارد
کاربردهای کلان داده چیست؟
وقتی از بیگ دیتا صحبت میکنیم، بیشتر از یک وضعیت حرف میزنیم؛ وضعیتی که در آن حجم زیادی از دادهها، با سرعت زیاد و تنوع گسترده تولید میشوند.
اما اینکه از چنین وضعیتی چگونه میتوان استفاده کرد، نیازمند دانشهای دیگری است. دانشمندان علوم دادهها (Data Scientists)، متخصصان هوش مصنوعی (Artificial Intelligence) و فعالان داده کاوی (Data-mining) از جمله کسانی هستند که میتوانند کاربردهای Big Data را در حوزههای مختلف بیابند و توسعه دهند.
@this_java
بیگ دیتا (Big Data) به معنای داراییهای اطلاعاتی [یک مجموعه یا سازمان] است که:
حجم بالا دارن
با سرعت زیاد تولید میشوند و / یا تنوع گسترده دارد
کاربردهای کلان داده چیست؟
وقتی از بیگ دیتا صحبت میکنیم، بیشتر از یک وضعیت حرف میزنیم؛ وضعیتی که در آن حجم زیادی از دادهها، با سرعت زیاد و تنوع گسترده تولید میشوند.
اما اینکه از چنین وضعیتی چگونه میتوان استفاده کرد، نیازمند دانشهای دیگری است. دانشمندان علوم دادهها (Data Scientists)، متخصصان هوش مصنوعی (Artificial Intelligence) و فعالان داده کاوی (Data-mining) از جمله کسانی هستند که میتوانند کاربردهای Big Data را در حوزههای مختلف بیابند و توسعه دهند.
@this_java
Main.java
16.1 KB
سورس کد بازی بتل شیپ:
مشابه سایت زیر :
https://learnteachcode.org/Battleship-JavaScript/
لینک گیت هاب :
https://github.com/parsakav/Battleship
@this_java
مشابه سایت زیر :
https://learnteachcode.org/Battleship-JavaScript/
لینک گیت هاب :
https://github.com/parsakav/Battleship
@this_java
لازم به ذکر است برای کسانی که که بی اطلاع هستند بگوییم که رتبه بندی pypl از داده های خام موجود در Google Trends برای محاسبه رتبه بندی استفاده می کند و بر اساس بیشترین جستجو برای یک آموزش زبان برنامه نویسی، محبوب ترین را شناسایی میکند.
@this_java
@this_java
رتبه بندی زبان های برنامه نویسی
رتبه بندی TIOBE بر اساس تعداد جستجو نام زبان برنامه نویسی به عنوان یک کلمه کلیدی در موتور جستجو محاسبه می شود
منبع :
https://www.tiobe.com/tiobe-index/
@this_java
رتبه بندی TIOBE بر اساس تعداد جستجو نام زبان برنامه نویسی به عنوان یک کلمه کلیدی در موتور جستجو محاسبه می شود
منبع :
https://www.tiobe.com/tiobe-index/
@this_java
کدام زبان برنامه نویسی برای یادگیری #اندروید بهتر است؟؟
👈برای افرادی که #تازه_کار هستند و سوالاتی در مورد بهترین زبان برای یادگیری و کار با اندروید دارند، پیشنهاد می کنم مطالب زیر را مطالعه بفرمایند و برای دیگران هم که دچار این ابهام هستند، این مطلب را فوروارد کنند.
زبان رسمی برای توسعه اندروید، #جاوا می باشد.بخش های بزرگی از اندروید به زبان جاوا نوشته شده اند و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
👈برای افرادی که #تازه_کار هستند و سوالاتی در مورد بهترین زبان برای یادگیری و کار با اندروید دارند، پیشنهاد می کنم مطالب زیر را مطالعه بفرمایند و برای دیگران هم که دچار این ابهام هستند، این مطلب را فوروارد کنند.
زبان رسمی برای توسعه اندروید، #جاوا می باشد.بخش های بزرگی از اندروید به زبان جاوا نوشته شده اند و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
Stack Overflow
Which programming languages can be used to develop in Android?
Possible Duplicate:
Which programming languages can I use on Android Dalvik?
Mostly, Android applications are written in Java. But i heard that its also possible to use Scala or some other lan...
Which programming languages can I use on Android Dalvik?
Mostly, Android applications are written in Java. But i heard that its also possible to use Scala or some other lan...
اساسی ترین کار در علم کامپیوتر انتخاب مناسب الگوی معماری (Architecture Pattern) پروژه است. تنها راهی است که میتوان پروژه را براساس آن تمیز (clean)، گسترش پذیر (expansible) و قابل تست (testable) نگهداری کرد. الگوها روش های شناخته شده ای هستند که در طول سال های برنامه نویسی بوجود آمده اند، تست شده اند، بهینه شده اند و امروزه بعنوان استاندارد شناخته میشوند. آنها بطور مدارم درحال متحول شدن هستند. بعنوان نمونه در اندروید الگوی معتبر (Model-View-Controller (MVC به الگوی (Model-View-Presenter (MVP تغییر کرده است.
منبع:kamalan.ir
@this_java
منبع: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
✅ کتابخانه 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
فرگمنت . (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
همیشه کامپایلر جاوا یک 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
درواقع مقادیر تصادفی تولید شده در جاوا (مثلا با استفاده از کلاس 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
هنگامی که در مورد نوع یک کلاس فکر می کنیم , فرض ما بر این است که برنامه ها اقدام به ایجاد شی ها از نوع تعیین شده خواهند کرد. با این همه , گاهی اوقات فقط کلاس ها تعریف میشوند و برنامه نویسان هرگز قصد ندارند هیچ شی را نمونه سازی کنند. چنین کلاس هایی, کلاس های انتزاعی نامیده میشود. چرا که چنین کلاس هایی معمولا بعنوان سوپرکلاس ها در سلسه مراتب توارث بکار گرفته میشوند, از اینرو معمولا با عنوان سوپر کلاس های انتزاعی شناخته می شوند.
هدف از کلاس های انتزاعی
هدف از یک کلاس انتزاعی فراهم اوردن یک سوپر کلاس مناسب از سایر کلاس ها است که ممکن است به ارث برسند و طرح مشترکی را به اشتراک بگذارند. کلاس هایی که میتوانند در نمونه سازی شی ها بکار گرفته شوند , کلاس های مقید (غیر انتزاعی) نام دارند
چنین کلاس هایی تدارک بیننده پیاده سازی هر متد هستند که اعلان می کنند (برخی از پیاده سازی ها را می توان به ارث برد).
برای مثال میتوانیم یک سوپر کلاس انتزاعی بنام 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
این کلمهی کلیدی در مبحث 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