Polymorphism in Java
پولیمورفیزم در جاوا در واقع انجام یک کار با استفاده از روش های مختلف هست.
دو نوع polymorphism در جاوا وجود داره:
1- compile time polymorphism
2- runtime polymorphism
که می تونیم با استفاده از method overloading و method overriding پیاده سازی ش کنیم.
اگر ما از یه متود استاتیک رو overload کنیم، یعنی داریم compile time polymorphism رو پیاده سازی میکنیم.
در اینجا میخوایم runtime polymorphism رو توضیح بدیم.
Runtime Polymorphism in Java
در واقع اجرا شدن متود override شده در زمان runtime رو میگن runtime polymorphism.
تو این حالت متود override شده از طریق reference variable (متغیری که اشاره به object داره) کلاس پدر (superclass)، صدا زده میشه.
بهتره قبل از runtime polymorphism، مفهوم upcasting رو متوجه بشیم.
@javadp_me
@java_me
Upcasting
وقتی reference variable کلاس پدر، به object کلاس بچه، اشاره میکنه بهش upcasting میگیم
class A{}
class B extends A{}A a=new B();//upcasting
@javadp_me
@java_me
Polymorphism in Java
Example:
در این مثال👇ما دوتا کلاس Bike و Splendar داریم. کلاس Splendar، کلاس Bike رو extend و متود run رو override میکنه. سپس از طریق reference variable کلاس پدر متود run رو صدا میزنیم و چون reference variable به آبجکت subclass و متود subclass ی که override کرده متود کلاس پدر رو، اشاره میکنه، بخاطر همین متود subclass در زمان runtime صدا زده میشه. و بخاطر همین هم بهش میگن runtime polymorphism.
class Bike{
void run(){System.out.println("running");}
}
class Splender extends Bike{
void run(){
System.out.println("running safely with 60km");
}
public static void main(String args[]){
Bike b = new Splender();//upcasting
b.run();
}
}
--------------------------------------------
Output:
running safely with 60km@javadp_me
@java_me
Polymorphism in Java
Example:
در این مثال👇کلاس Bank یه متود به اسم getRateOfInterest (نرخ بهره) داره. اما ممکنه این نرخ در هر بانکی متفاوت هست.
class Bank{
float getRateOfInterest(){
return 0;
}
}
class SBI extends Bank{
float getRateOfInterest(){
return 8.4f;
}
}
class ICICI extends Bank{
float getRateOfInterest(){
return 7.3f;
}
}
class AXIS extends Bank{
float getRateOfInterest(){
return 9.7f;
}
}
class TestPolymorphism{
public static void main(String args[]){
Bank b;
b=new SBI();
System.out.println("SBI Rate of Interest: "+b.getRateOfInterest());
b=new ICICI();
System.out.println("ICICI Rate of Interest: "+b.getRateOfInterest());
b=new AXIS();
System.out.println("AXIS Rate of Interest: "+b.getRateOfInterest());
}
}
--------------------------------------------
Output:
SBI Rate of Interest: 8.4
ICICI Rate of Interest: 7.3
AXIS Rate of Interest: 9.7توجه کنید در مثال👇قبلی
https://t.me/java_me/164
فقط از متود overriding استفاده کردیم، بدون استفاده از upcasting. ولی اینجا از هر دوتا استفاده کردیم
@javadp_me
@java_me
Polymorphism in Java
Java Runtime Polymorphism with Data Member
رانتایم polymorphism فقط براساس متود هست و قابل پیاده سازی با data member ها نیست.
در این مثال👇هر دو کلاس یه عضو به اسم speedlimit دارن. درسته ما میتونیم از طریق reference variable به datamember دسترسی داشته باشیم ولی چون datamember قابل override شدن نیست، پس همیشه به datamember کلاس پدر دسترسی پیدا میکنیم.
class Bike{
int speedlimit=90;
}
class Honda3 extends Bike{
int speedlimit=150;
public static void main(String args[]){
Bike obj=new Honda3();
System.out.println(obj.speedlimit);//90
}
}
--------------------------------------------
Output:
90Java Runtime Polymorphism with Multilevel Inheritance
class Animal{
void eat(){
System.out.println("animal is eating...");
}
}
class Dog extends Animal{
void eat(){
System.out.println("dog is eating...");
}
}
class BabyDog1 extends Dog{
public static void main(String args[]){
Animal a=new BabyDog1();
a.eat();
}
}
--------------------------------------------
Output:
dog is eating...در مثال بالا☝️چون کلاس BabyDog متود eat رو override نکرده، بخاطر همین متود eat کلاس Dog صدا زده میشه.
@javadp_me
@java_me
It's official! Java EE moves to the @EclipseFdn ! https://hubs.ly/H08C-080 #JavaEE #Eclipse #Java #opensource
Oracle
Opening Up Java EE - An Update
In a previous post, we announced
that Oracle was beginning to explore moving Java EE technologies to
an open source foundation in order to make the process of...
that Oracle was beginning to explore moving Java EE technologies to
an open source foundation in order to make the process of...
Renaming Java EE!
Have a good idea? Share it here. https://groups.google.com/forum/#!msg/javaee-guardians/RA4jEvFfmAs/9klqLAy-AAAJ … …
A community initiative #javaee #java
Have a good idea? Share it here. https://groups.google.com/forum/#!msg/javaee-guardians/RA4jEvFfmAs/9klqLAy-AAAJ … …
A community initiative #javaee #java
Java instanceof
کلمه instanceof در جاوا برای فهمیدن اینکه آیا یک object، اینستنسی از یک نوع خاص (کلاس یا subclass یا اینترفیس) هست یا نه، استقاده میشه.
دقت کنید که استفاده از instanceof با یک متغیر null، مقدار false رو برمی گردونه.
Simple example of java instanceof
class Simple1{
public static void main(String args[]){
Simple1 s=new Simple1();
System.out.println(s instanceof Simple1);//true
}
}
--------------------------------------------
Output:
trueدر این مثال☝️ما current class رو چک میکنیم.
Subclass example of java instanceof
class Animal{
}
class Dog1 extends Animal{//Dog inherits Animal
public static void main(String args[]){
Dog1 d=new Dog1();
System.out.println(d instanceof Animal);
}
}
--------------------------------------------
Output:
trueنوع یک object از subclass، از نوع کلاس پدر هم هست. در این مثال☝️چون کلاس Dog، کلاس Animal رو extend کرده، پس object کلاس Dog هم میتونه به کلاس Dog اشاره کنه و هم کلاس Animal.
instanceof in java with a variable that have null value
class Dog2{
public static void main(String args[]){
Dog2 d=null;
System.out.println(d instanceof Dog2);//false
}
}
--------------------------------------------
Output:
falseدر این مثال☝️object مون null هست.
Downcasting with java instanceof
وقتی نوع Subclass به یه آبجکت از کلاس Parent اشاره کنه بهش میگیم downcasting میگیم.
اگر ما مستقیم اینکارو انجام بدیم، کامپایلر ارور میده.
Dog d=new Animal();//Compilation error
اگر از typecasting استفاده کنیم، ClassCastException در ران تایم throw میشه.
Dog d=(Dog)new Animal();
//Compiles successfully but ClassCastException is thrown at runtime
ولی اگه از instanceof استفاده کنیم، اینکار به راحتی انجام میشه.
Possibility of downcasting with instanceof
به مثال زیر👇توجه کنید.
class Animal { }
class Dog3 extends Animal {
static void method(Animal a) {
if(a instanceof Dog3){
Dog3 d=(Dog3)a;//downcasting
System.out.println("ok downcasting performed");
}
}
public static void main (String [] args) {
Animal a=new Dog3();
Dog3.method(a);
}
}
--------------------------------------------
Output:
ok downcasting performedDowncasting without the use of java instanceof
داون کستینگ میتونه بدونه instanceof انجام بشه،
class Animal { }
class Dog4 extends Animal {
static void method(Animal a) {
Dog4 d=(Dog4)a;//downcasting
System.out.println("ok downcasting performed");
}
public static void main (String [] args) {
Animal a=new Dog4();
Dog4.method(a);
}
}
--------------------------------------------
Output:
ok downcasting performedدر این مثال☝️آبجکتی که a بهش اشاره میکنه، یه آبجکت از کلاس Dog هست. بخاطر همین downcast به راحتی انجام میشه. اما اگر a به Animal اشاره کنه:
Animal a=new Animal();
Dog.method(a);
//Now ClassCastException but not in case of instanceof operator
Understanding Real use of instanceof in java
یه مثال کامل از instanceof👇
interface Printable{}
class A implements Printable{
public void a(){
System.out.println("a method");
}
}
class B implements Printable{
public void b(){
System.out.println("b method");}
}
class Call{
void invoke(Printable p){//upcasting
if(p instanceof A){
A a=(A)p;//Downcasting
a.a();
}
if(p instanceof B){
B b=(B)p;//Downcasting
b.b();
}
}
}//end of Call class
class Test4{
public static void main(String args[]){
Printable p=new B();
Call c=new Call();
c.invoke(p);
}
}
--------------------------------------------
Output:
b method@javach_me
@javadp_me
@java_me
Abstraction in Java
در جاوا Abstraction (به معنی چکیده) به پروسه ای برای مخفی کردن جزئیات پیاده سازی شده و نشون دادن فقط عملکرد اون گفته میشه.
در واقع فقط چیزهای مهم رو نشون میده و کاری با جزئیات داخلی نداره. مثلا ارسال sms، شما فقط متن رو مینویسید و ارسال ش میکنید. و هیچ اطلاعاتی از چگونگی ارسال و دریافت اون خبر ندارید.
میشه گفت Abstraction باعث میشه تا فقط به کاری که object مون انجام میده توجه کنیم نه چگونگی انجام اون کار.
Ways to achieve Abstraction
دوتا راه برای رسیدن به abstraction در جاوا وجود داره
۱- ابسترکت کلاس ۰ تا ۱۰۰٪ abstract class
۲- اینترفیس ۱۰۰٪
Abstract class in Java
کلاس ابسترکت رو میتونیم با استفاده از کلمه abstract در کنار class داشته باشیم. این کلاس باید extend بشه و متودهاش پیاده سازی بشه. و نمی تونیم ازش instance بسازیم.
abstract class A{}abstract method
متودی که به عنوان abstract تعریف میشه و هیچ پیازه سازی ازش نیست.
abstract void printStatus();//no body and abstract
Example of abstract class that has abstract method
abstract class Bike{
abstract void run();
}
class Honda4 extends Bike{
void run(){
System.out.println("running safely..");
}
public static void main(String args[]){
Bike obj = new Honda4();
obj.run();
}
}
--------------------------------------------
Output:
running safely..در این مثال☝️کلاس Bike یه abstract class هست که یه متود abstract داره و توسط کلاس Honda4 پیاده سازی شده.
Understanding the real scenario of abstract class
در این مثال👇Shape یه abstract کلاس هست و توسط کلاس های Rectangle و Circle پیاده سازی شده.
در این مثال اگر ما یه instance از کلاس Rectangle ایجاد کنیم، متود draw از کلاس Rectangle صدا زده میشه.
File: TestAbstraction1.java
abstract class Shape{
abstract void draw();
}
class Rectangle extends Shape{
void draw(){
System.out.println("drawing rectangle");
}
}
class Circle1 extends Shape{
void draw(){
System.out.println("drawing circle");
}
}
class TestAbstraction1{
public static void main(String args[]){
Shape s=new Circle1();
s.draw();
}
}
--------------------------------------------
Output:
drawing circleAnother example of abstract class in java
File: TestBank.java
abstract class Bank{
abstract int getRateOfInterest();
}
class SBI extends Bank{
int getRateOfInterest(){return 7;}
}
class PNB extends Bank{
int getRateOfInterest(){return 8;}
}
class TestBank{
public static void main(String args[]){
Bank b;
b=new SBI();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
b=new PNB();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
}
}
--------------------------------------------
Output:
Rate of Interest is: 7 %
Rate of Interest is: 8 %Abstract class having constructor, data member, methods etc.
یک abstract class میتونه، data member یا abstract method یا method body یا constructor و یا حتی main متود داشته باشه.
به مثال زیر👇توجه کنید.
File: TestAbstraction2.java
abstract class Bike{
Bike(){
System.out.println("bike is created");
}
abstract void run();
void changeGear(){
System.out.println("gear changed");
}
}
class Honda extends Bike{
void run(){System.out.println("running safely..");}
}
class TestAbstraction2{
public static void main(String args[]){
Bike obj = new Honda();
obj.run();
obj.changeGear();
}
}
--------------------------------------------
Output:
bike is created
running safely..
gear changedنکته: اگر یه متود abstract توی یه کلاس باشه، اون کلاس باید abstract باشه. به مثال زیر👇توجه کنید.
class Bike12{
abstract void run();
}
--------------------------------------------
Output:
compile time errorنکته: اگر یه کلاس abstract داشته باشیم که یه متود abstract داشته باشه، وقتی extend ش کنیم، یا باید اون متود رو پیاده سازی کنیم و یا اون کلاس رو هم abstract کنیم.
@java_me
@javach_me
@javadp_me
Interface in Java
یک interface در جاوا، یه طرحی از یه کلاس هست که شامل static constants و abstract method هستش.
در واقع یه راه برای رسیدن به abstraction و همچنین پیاده سازی کردن multiple inheritance در جاوا، اینترفیس هست.
اینترفیس یک رابطه ی IS-A رو نشون میده. و همچنین مثل abstract class نمیشه ازش instance ساخت.
نکته: از جاوا ۸ به بعد، اینترفیس میتونه متود default و static داشته باشه.
نکته: جاوا کامپایلر دو کلمه public و abstract رو قبل از متود در اینترفیس اضافه میکنه. همچنین ۳ کلمه public, static و final هم قبل از data member ها اضافه میشه.
@java_me
@javach_me
@javadp_me
فیلدها در interface به طور پیشفرض public, static و final هستن و متودها هم public و abstract.
@java_me
@javach_me
@javadp_me
@java_me
@javach_me
@javadp_me
Interface in JavaJava Interface Example
در این مثال👇اینترفیس Printable یه متود داره که توسط کلاس A پیاده سازی میشه.
interface printable{
void print();
}
class A6 implements printable{
public void print(){
System.out.println("Hello");
}
public static void main(String args[]){
A6 obj = new A6();
obj.print();
}
}
--------------------------------------------
Output:
HelloJava Interface Example: Drawable
در این مثال 👇اینترفیس Drawable فقط یه متود داره که توسط کلاس های Rectangle و Circle پیاده سازی شده.
در یک سناریو واقعی یه اینترفیس توسط یه نفر نوشته میشه و توسط دیگران به شکل های مختلفی پیاده سازی میشه.
File: TestInterface1.java
//Interface declaration: by first user
interface Drawable{
void draw();
}
//Implementation: by second user
class Rectangle implements Drawable{
public void draw(){
System.out.println("drawing rectangle");
}
}
class Circle implements Drawable{
public void draw(){
System.out.println("drawing circle");
}
}
//Using interface: by third user
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();
d.draw();
}
}
--------------------------------------------
Output:
drawing circle
Multiple inheritance in Java by interface
اگر یک کلاس چندتا interface رو پیاده سازی کنه یا یه interface چندتا interface دیگه رو extend کنه بهش میگیم multiple inheritance.
@java_me
@javach_me
@javadp_me
Forwarded from عبدالرحیم شریفی
Multithreading in Java
ترد کوچکترین واحد پردازش و مالتی تردین یک پروسه هست برای اجرای چندین ترد به صورت هم زمان هست.
از ویژگی های multithreading میشه به share بودن memory بین اونها اشاره کرد. تردها memory جداگونه ای نمیگیرن و زمان اجراشون خیلی سریع هست.
Advantages of Java Multithreading
۱- کاربر رو block یا معطل نمیگذاره.
۲- میتونیم چندین عملیات رو باهم انجام بدیم.
۳- همچنین تردها به هم وابسته نیستن.
۴- اگر یکی شون ارور بده، روی بقیه تاثیری نداره.
۵- همچنین share بودن memory بین اونها.
Life cycle of a Thread (Thread States)
لایف سایکل (life cycle) ترد در جاوا توسط JVM کنترل میشه.
Forwarded from عبدالرحیم شریفی
۵ تا وضعیت برای ترد در جاوا وجود داره:
1- New
2- Runnable
3- Running
4- Non-Runnable (Blocked)
5- Terminated
1- New
2- Runnable
3- Running
4- Non-Runnable (Blocked)
5- Terminated