Java
46 subscribers
42 photos
36 files
137 links
Download Telegram
Example of Association Relationship (HAS-A):
Address.java

--------------------------------------------

public class Address {  

   String city,state,country;  

  

   public Address(String city, String state, String country) {  

      this.city = city;  

      this.state = state;  

      this.country = country;  

   }  

}


Emp.java

--------------------------------------------

public class Emp {  

   int id;  

   String name;  

   Address address;  

  

   public Emp(int id,String name,Address address){

      this.id = id;  

      this.name = name;  

      this.address=address;  

   }  

  

   void display(){  

      System.out.println(id+" "+name);  

      System.out.println(address.city+" "+address.state+" "+address.country);  

   }  

  

   public static void main(String[] args) {  

      Address address1=new Address("gzb","UP","india");  

      Address address2=new Address("gno","UP","india");  

  

      Emp e=new Emp(111,"varun",address1);  

      Emp e2=new Emp(112,"arun",address2);  

      

      e.display();  

      e2.display();        

   }  

} 

--------------------------------------------

Output:

111 varun

gzb UP india

112 arun

gno UP india

@java_me
Method Overloading in Java


متودهای هم نام در یک کلاس که دارای پارامترهای ورودی متفاوتی هستن رو Method Overloading میگن.

فرض کنید که شما میخواید چندتا عدد رو با هم جمع کنید، اگر از یه متود مثل
a(int,int)
برای جمع دو عدد و
b(int,int,int)
برای جمع سه عدد استفاده کنیم، باعث پایین اومدن خوانایی کد میشه، چون داریم برای یک عملیات (جمع) از دوتا متود با دو اسم متفاوت استفاده میکنیم.
بخاطر همین از method overloading استفاده میکنیم.

دوتا روش برای overloading وجود داره:
۱- با تغییر تعداد پارامترهای ورودی
۲- با تغییر نوع پارامترهای ورودی
دقت کنید که امکان overloading با تغییر مقدار برگشتی متود وجود ندارد.

1) Method Overloading: changing no. of arguments
class Adder{  
static int add(int a,int b){
return a+b;
}
static int add(int a,int b,int c){
return a+b+c;
}
}
class TestOverloading1{
public static void main(String[] args){
System.out.println(Adder.add(11,11));
System.out.println(Adder.add(11,11,11));
}
}
--------------------------------------------
Output:
22
33

در این مثال☝️ما دوتا متود add داریم که اولی دارای دوتا پارامتر و دومی دارای سه تا پارامتر ورودی هست، دلیل اینکار اینه که ما داریم یک عملیات (جمع) رو به روشهای متفاوت انجام میدیم.(یعنی یه کار به روش های مختلف)

2) Method Overloading: changing data type of arguments
class Adder{  
static int add(int a, int b){
return a+b;
}
static double add(double a, double b){
return a+b;
}
}
class TestOverloading2{
public static void main(String[] args){
System.out.println(Adder.add(11,11));
System.out.println(Adder.add(12.3,12.6));
}
}
--------------------------------------------
Output:
22
24.9

و در این مثال☝️با تغییر نوع پارامتر ورودی از int به double تونستیم دوتا متود add داشته باشیم تا در صورت نیاز هر کدوم رو که خواستیم صدا بزنیم.

3) Changing the return type of method
class Adder{  
static int add(int a,int b){
return a+b;
}
static double add(int a,int b){
return a+b;
}
}
class TestOverloading3{
public static void main(String[] args){
System.out.println(Adder.add(11,11));//ambiguity
}
}
--------------------------------------------
Output:
Compile Time Error: method add(int,int) is already defined in class Adder

مثال بالا☝️نشان می دهد اگر فقط مقدار بازگشتی تفاوت دو متود هم نام باشه، در جاوا به کامپایل ارور بر می خوریم.

همچنین امکان overload کردن متود main در جاوا وجود داره اما توجه داشته باشید که JVM فقط متود mainی رو که دارای پارامتر ورودی String به صورت آرایه هست رو صدا می زنه.
class TestOverloading4{  
public static void main(String[] args){
System.out.println("main with String[]");
}
public static void main(String args){
System.out.println("main with String");
}
public static void main(){
System.out.println("main without args");
}
}
--------------------------------------------
Output:
main with String[]


@java_me
Method Overriding in Java


اگر subclass یا همون کلاس بچه، یک متود داشته باشه که نامش با یک متود دیگر در کلاس پدر( super class) هم نام باشه، بهش متود اوور رایدینگ یا method overriding میگن.

زمانی از این ویژگی استفاده میکنیم که میخواهیم یک متود از کلاس پدر را در subclass دوباره پیاده سازی کنیم.

۳تا قانون برای این کار داریم:
۱- متود باید هم نام متود سوپرکلاس باشه
۲- پارامترهای متود باید با پارامترهای متود سوپرکلاس یکی باشه
۳- رابطه بین دو کلاس باید به صورت IS-A باشه

problem without method overriding
class Vehicle{  
void run(){
System.out.println("Vehicle is running");
}
}
class Bike extends Vehicle{
public static void main(String args[]){
Bike obj = new Bike();
obj.run();
}
}
--------------------------------------------
Output:
Vehicle is running

در این مثال☝️متود run مختص به کلاس Vehicle هست ولی اگر بخواهیم در صورت اجرا شدن متود run کد مخصوص به کلاس Bike اجرا شود باید متود run را در کلاس Bike با همون اسم override کنیم، به مثال زیر 👇توجه کنید.
Example of method overriding
class Vehicle{  
void run(){
System.out.println("Vehicle is running");
}
}
class Bike2 extends Vehicle{
void run(){
System.out.println("Bike is running safely");
}
public static void main(String args[]){
Bike2 obj = new Bike2();
obj.run();
}
}
--------------------------------------------
Output:
Bike is running safely

همون طور که در این مثال☝️میبینید، هر ۳ قانون هم نام، هم پارامتر و IS-A بودن برای پیاده سازی method overriding رعایت شده است.

نکته:
متودهای static را نمیشه override کرد.
در این مثال، بانک یک کلاس هست که یک متود برای دریافت میزان بهره در آن پیاده سازی شده، اما بانک هایی که این کلاس رو 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