Java
46 subscribers
42 photos
36 files
137 links
Download Telegram
در این مثال، بانک یک کلاس هست که یک متود برای دریافت میزان بهره در آن پیاده سازی شده، اما بانک هایی که این کلاس رو extend میکنن (رابطه IS-A) هر کدوم نرخ بهره متفاوتی دارن.
Bank.java
742 B
پیاده سازی method overriding در مثال بانک
https://t.me/javadp_me

جاوا Design Patterns
Forwarded from Java Design Patterns
Singleton

#DifficultyBeginner #GangOfFour #JavaCreational

هدف استفاده از singleton اینه که مطمئن بشیم فقط یک instance از کلاس مون ساخته شده و فقط یک راه دسترسی به اون وجود داشته باشه.

@javadp_me
@java_me
Super Keyword in Java


کلمه super در جاوا اشاره که کلاس پدر (parent class object) داره.
وقتی شما یه اینستنس از subclass میسازید، یه اینستنس از parent class هم ساخته میشه

Usage of java super Keyword
۱- دسترسی به instance variable های کلاس پدر
۲- صدا زدن متودهای کلاس پدر
۳- صدا زدن کانستراکتور کلاس پدر

1) super is used to refer immediate parent class instance variable
class Animal{  
String color="white";
}
class Dog extends Animal{
String color="black";
void printColor(){
System.out.println(color);//prints color of Dog class
System.out.println(super.color);//prints color of Animal class
}
}
class TestSuper1{
public static void main(String args[]){
Dog d=new Dog();
d.printColor();
}
}
--------------------------------------------
Output:
black
white

در این مثال☝️در هر دو کلاس Dog و Animal یه فیلد به اسم color داریم، ولی تونستیم با استفاده از super در کلاس Dog به فیلد color در کلاس Animal دسترسی پیدا کنیم.

2) super can be used to invoke parent class method
class Animal{  
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void eat(){
System.out.println("eating bread...");
}
void bark(){
System.out.println("barking...");
}
void work(){
super.eat();
bark();
}
}
class TestSuper2{
public static void main(String args[]){
Dog d=new Dog();
d.work();
}
}
--------------------------------------------
Output:
eating...
barking...

در این مثال☝️در هر دو کلاس Dog و Animal یه متود به اسم eat داریم، درواقع override ش کردیم، ولی تونستیم با استفاده از super در کلاس Dog متود eat رو در کلاس Animal صدا بزنیم.

3) super is used to invoke parent class constructor
class Animal{  
Animal(){
System.out.println("animal is created");
}
}
class Dog extends Animal{
Dog(){
super();
System.out.println("dog is created");
}
}
class TestSuper3{
public static void main(String args[]){
Dog d=new Dog();
}
}
--------------------------------------------
Output:
animal is created
dog is created

در این مثال☝️با استفاده super در کلاس Dog تونستیم کانستراکتور Animal رو صدا بزنیم

@javadp_me
@java_me
Instance initializer block


برای مقداردهی اولیه یا initialize کردن دیتا در جاوا به کار میره. زمانی این بلاک اجرا میشه که یک آبجکت از کلاس ساخته بشه.
درسته که امکان مقداردهی به صورت مستقیم به متغیرها وجود داره ولی میشه با استفاده از این بلاک کارهای بیشتری در زمان مقداردهی اولیه انجام داد.

Example of instance initializer block
class Bike7{  
int speed;

Bike7(){
System.out.println("speed is "+speed);
}

{
speed=100;
}

public static void main(String args[]){
Bike7 b1=new Bike7();
Bike7 b2=new Bike7();
}
}
--------------------------------------------
Output:
speed is 100
speed is 100


دقت کنید که در جاوا ۳تا مکان برای انجام دادن یک رفتار یا یک کار وجود داره.
۱- متود
۲- کانستراکتور
۳- بلاک

- سوال
اول instance initializer block اجرا میشه یا کانستراکتور؟
class Bike8{  
int speed;

Bike8(){
System.out.println("constructor is invoked");
}

{
System.out.println("instance initializer block invoked");
}

public static void main(String args[]){
Bike8 b1=new Bike8();
Bike8 b2=new Bike8();
}
}
--------------------------------------------
Output:
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

همین طور که در این مثال☝️میبینید اول instance initializer block اجرا میشه، اما صبر کنید، این بلاک در زمان ساخته شدن آبجک صدا زده میشه و در واقع جاوا کامپایر این بلاک رو کپی میکنه توی کانستراکتور، درست بعد از super()
پس اول کانستراکتور صدا زده میشه.

نکته:
دقت کنید که کدهای توی این بلاک توسط جاوا کامپایبر توی همه کانستراکتورها کپی میشه.

@javadp_me
@java_me
همین طور که میبینید جاوا کامپایلر کدی که در بلاک هست رو توی کانستراکتور و بعد از super() کپی میکنه

@javadp_me
@java_me
Instance initializer block


Example 1:
class A{  
A(){
System.out.println("parent class constructor invoked");
}
}
class B2 extends A{
B2(){
super();
System.out.println("child class constructor invoked");
}

{
System.out.println("instance initializer block is invoked");
}

public static void main(String args[]){
B2 b=new B2();
}
}
--------------------------------------------
Output:
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked


Example 2:
class A{  
A(){
System.out.println("parent class constructor invoked");
}
}

class B3 extends A{
B3(){
super();
System.out.println("child class constructor invoked");
}

B3(int a){
super();
System.out.println("child class constructor invoked "+a);
}

{
System.out.println("instance initializer block is invoked");
}

public static void main(String args[]){
B3 b1=new B3();
B3 b2=new B3(10);
}
}
--------------------------------------------
Output:
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked 10

در این دو مثال☝️تربیت اجرا بین instance initializer block و کانستراکتور مشخص شده است

@javadp_me
@java_me
Final Keyword In Java


کلمه final در جاوا برای محدود کردن به کار میره و در ۳جا استفاده داره
۱- متغیر ۲- متود ۳- کلاس

اگر متغیر مون final باشه و بهش مقدار ندیم بهش میگن blank final variable یا uninitialized final variable و فقط میشه تو کانستراکتور مقداردهیش کرد. همچنین blank final variable میتونه استاتیک باشه که در این صورت مقداردهی این متغیر توی static block انجام میشه.

1) Java final variable
اگر ما یه متغیر رو final کنیم دیگه نمیتونیم مقدارش رو عوض کنیم. در واقع داریم ثابت ش میکنیم.

Example of final variable
class Bike9{  
final int speedlimit=90;
void run(){
speedlimit=400;
}
public static void main(String args[]){
Bike9 obj=new Bike9();
obj.run();
}
}
--------------------------------------------
Output:
Compile Time Error

همین طور که در این مثال☝️میبینید ما متغیر speedlimit رو داریم که final شده و می خوایم در متود run مقدارش رو عوض کنیم ولی نمیتونیم این کار رو انجام بدیم.

2) Java final method
اگر یک متود final باشه، نمیتونیم اون رو override کنیم.

Example of final method
class Bike{  
final void run(){System.out.println("running");}
}

class Honda extends Bike{
void run(){
System.out.println("running safely with 100kmph");
}

public static void main(String args[]){
Honda honda= new Honda();
honda.run();
}
}
--------------------------------------------
Output:
Compile Time Error


3) Java final class
اگر یک کلاس final باشه، نمیتونیم اون رو extend کنیم.

Example of final class
final class Bike{}  

class Honda1 extends Bike{
void run(){
System.out.println("running safely with 100kmph");
}

public static void main(String args[]){
Honda1 honda= new Honda();
honda.run();
}
}
--------------------------------------------
Output:
Compile Time Error


- سوال
- آیا final متود ارث برده میشه؟
آره، فاینال متود ارث برده میشه ولی قابل override نیست.

- آیا میتونیم blank final variable مقداردهی کنیم؟
آره، اما فقط از طریق کانستراکتور میتونیم این کار رو انجام بدیم.

Example blank final variable
class Bike10{  
final int speedlimit;//blank final variable

Bike10(){
speedlimit=70;
System.out.println(speedlimit);
}

public static void main(String args[]){
new Bike10();
}
}
--------------------------------------------
Output:
70

در این مثال☝️میبینیم که blank final variable فقط از طریق کانستراکتور مقداردهی میشه.

Example static blank final variable
class A{  
static final int data;//static blank final variable
static{ data=50;}
public static void main(String args[]){
System.out.println(A.data);
}
}

در این مثال☝️میبینیم که static blank final variable فقط از طریق استاتیک بلاک مقداردهی میشه.

- فاینال پارامتر final parameter چیست؟
اگر پارامتر ورودی یک متود final باشه، نمی تونیم مقدار اون رو عوض کنیم.
Example:
class Bike11{  
int cube(final int n){
n=n+2;//can't be changed as n is final
n*n*n;
}
public static void main(String args[]){
Bike11 b=new Bike11();
b.cube(5);
}
}
--------------------------------------------
Output:
Compile Time Error


- آیا میتونیم یک کانستراکتور final داشته باشیم؟
خیر، چون کانستراکتور رو نمیتونیم override کنیم که بخوایم با final کردن اون از این کار جلوگیری کنیم.

@javadp_me
@java_me
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:
90


Java 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
Java Challenge Channel

https://t.me/javach_me
Forwarded from Java in Action
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