Java
46 subscribers
42 photos
36 files
137 links
Download Telegram
this keyword in java


در جاوا this به خود object اشاره داره.
از موارد استفاده this میشه این ۶ مورد رو نام برد
1 - refer current class instance variable (اشاره به متغیرهای آبجکت)
2 - invoke current class method (متودهای آبجکت رو صدا بزنه)
3 - invoke current class constructor (کانستراکتورها رو صدا بزنه)
4 - as an argument in the method call (یکی از ورودی های متود باشه)
5 - as argument in the constructor call (یکی از ورودی های کانستراکتور باشه)
6 - return the current class instance from the method (مقدار برگشتی از یک متود باشه)

Example:
class Student{  
int rollno;
String name;
float fee;
Student(int rollno,String name,float fee){
this.rollno=rollno;
this.name=name;
this.fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+fee);
}
}

class TestThis2{
public static void main(String args[]){
Student s1=new Student(111,"ankit",5000f);
Student s2=new Student(112,"sumit",6000f);
s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 ankit 5000
112 sumit 6000

در این مثال☝️با توجه به اینکه rollno، name و fee (همون instance variable هامون) در کانستراکتور کلاس Student با local variable ها هم نام هستن، ولی تونستیم ازشون استفاده کنیم
در واقعا this.name به instance variable و name خالی به local variable اشاره میکنه


Example:
class Student{  
int rollno;
String name,course;
float fee;
Student(int rollno,String name,String course){
this.rollno=rollno;
this.name=name;
this.course=course;
}
Student(int rollno,String name,String course,float fee){
this(rollno,name,course);//reusing constructor
this.fee=fee;
}
void display(){
System.out.println(rollno+" "+name+" "+course+" "+fee);
}
}
class TestThis7{
public static void main(String args[]){
Student s1=new Student(111,"ankit","java");
Student s2=new Student(112,"sumit","java",6000f);
s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 ankit java null
112 sumit java 6000

در این مثال☝️با استفاده از کلمه this تونستیم یکی از کانستراکتورها مونو صدا بزنیم.

دقت کنید که اگر به صورت زیر👇نوشته بشه
Student(int rollno,String name,String course,float fee){  
this.fee=fee;
this(rollno,name,course);//C.T.Error
}

(یعنی صدا زدن یه کانستراکتور به وسیله this در یک کانستراکتور دیگه) ما کامپایل ارور خواهیم داشت، چون اول باید instance بسازیم تا بعد بتونیم از instance variable هاش استفاده کنیم.
Inheritance in Java


وراثت در جاوا در واقع یک مکانیسم هست که در اون یک object تمامی ویژگی ها و رفتارهای object پدر رو به دست میاره (یا به ارث می بره). وقتی یک کلاس، یک کلاس دیگه رو به ارث میبره، میتونه از فیلدها و متودهای اون دوباره استفاده کنه و همچنین متودها و فیلدهای خودش رو هم داشته باشه.

وارث یک رابطه ی IS-A (هست یک) هست، که میتونیم رابطه پدر فرزندی هم بهش بگیم.

وراثت در جاوا دوتا قابلیت به ما میده
1- Method Overriding
2- Code Reusability

Syntax:
class Subclass-name extends Superclass-name  

{  

   //methods and fields  

}  

از کلمه extends برای ارث بردن یک کلاس از کلاس دیگه استفاده میشه.

در جاوا به کلاسی که به ارث برده میده میشه parent یا super کلاس و به کلاسی که به ارث میبره child یا subclass هم گفته میشه.
همون طور که در این عکس می بینید، programmer یک subclass هست و employee یک superclass هست. رابطه بین این دو کلاس به صورت (برنامه‌نویس هست یک کارمند) یا (Programmer IS-A Employee) هست.
class Employee{  
float salary=40000;
}
class Programmer extends Employee{
int bonus=10000;
public static void main(String args[]){
Programmer p=new Programmer();
System.out.println("Programmer salary is:"+p.salary);
System.out.println("Bonus of Programmer is:"+p.bonus);
}
}
--------------------------------------------
Output:
Programmer salary is:40000.0
Bonus of programmer is:10000

در مثال بالا☝️کلاس Programmer تونسته با استفاده وراثت به فیلد salary دسترسی پیدا کنه و اونو بخونه.

توجه کنید که رابطه IS-A (هست یک) رو میشه به این صورت هم معنی کرد.
برنامه‌نویس هست یک کارمند یا برنامه‌نویس یک نوع کارمند هست.
Types of inheritance in java

در کلاس های جاوا ما ۳ نوع وراثت داریم: single, multilevel و hierarchical
1- Single Inheritance Example:
class Animal{  
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void bark(){
System.out.println("barking...");
}
}
class TestInheritance{
public static void main(String args[]){
Dog d=new Dog();
d.bark();
d.eat();
}
}
--------------------------------------------
Output:
barking...
eating...

در این مثال☝️از ساده ترین نوع از وراثت استفاده شده، به نحوی که کلاس Animal دارای متود eat هست، زمانی که کلاس Dog ، کلاس Animal رو extend میکنه، میتونه از متود اون هم استفاده کنه.
دقت کنید که در اینجا رابطه Dog Is-A Animal برقرار هست.

2- Multilevel Inheritance Example:
class Animal{  
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void bark(){
System.out.println("barking...");
}
}
class BabyDog extends Dog{
void weep(){
System.out.println("weeping...");
}
}
class TestInheritance2{
public static void main(String args[]){
BabyDog d=new BabyDog();
d.weep();
d.bark();
d.eat();
}
}
--------------------------------------------
Output:
weeping...
barking...
eating...

در این مثال☝️به شکل چند سطحی از وراثت استفاده شده است، به این صورت که کلاس Dog از کلاس Animal ارث برده و کلاس BabyDog هم از کلاس Dog، درسته که کلاس BadyDog از کلاس Animal اکستند نکرده ولی تونسته از طریق extend کردن کلاس Dog به متودهای کلاس Animal هم دسترسی پیدا کنه.
در واقع هم رابطه Dog Is-A Animal و هم BabyDog Is-A Dog برقرار هست. پس میشه گفت BabyDog Is-A Animal.

3- Hierarchical Inheritance Example:
class Animal{  
void eat(){
System.out.println("eating...");
}
}
class Dog extends Animal{
void bark(){
System.out.println("barking...");
}
}
class Cat extends Animal{
void meow(){
System.out.println("meowing...");
}
}
class TestInheritance3{
public static void main(String args[]){
Cat c=new Cat();
c.meow();
c.eat();
//c.bark();//C.T.Error
}
}
--------------------------------------------
Output:
meowing...
eating...

اما در این مثال☝️میتونیم ببینیم دوتا کلاس از یک کلاس ارث بردن، در واقع کلاس Dog از کلاس Animal و کلاس Cat هم از کلاس Animal ارث برده. دقت کنید که کلاس Dog و Cat هیچ ارتباطی به هم ندارن و نمیتونن از همدیگه چیزی به ارث ببرن و در صورت استفاده به کامپایل تایم ارور خواهیم خورد.
در اینجا هم رابطه Dog Is-A Animal و Cat Is-A Animal برقرار هست.
دو نوع ارث بری دیگه هم وجود داره که در جاوا فقط از طریق interface ها support میشه و نمی تونیم در کلاس ها ازشون استفاده کنیم
دلیل support نکردن multiple inheritance در جاوا، کم کردن پیچیدگی و ساده بودن زبان برنامه نویسی هست. مثلا تصور کنید که ۳ کلاس A , B و C داریم و کلاس C از هر دو کلاس A و B ارث میبره (extend میکنه)، حالا اگر هر دو کلاس A و B یک متود مثل هم داشته باشن، وقتی کلاس C میخواد از این متود استفاده کنه نمیدونه از کدومش باید استفاده کنه.
دقت کنید که اگر همچین نوعی از وراثت در جاوا داشته باشیم به کامپایل ارور بر خواهیم خورد.
Association In Java

اگر در کلاس جاوا رفرنسی از یک کلاس وجود داشته باشه به رابطه بین این دو کلاس association relationship میگن.
در واقع این رابطه رو بصورت HAS-A هم بیان میکنن، به مثال زیر توجه کنید:
class Employee{  

   int id;  

   String name;  

   Address address;//Address is a class  

...  

}

در این مثال☝️رابطه بین دو کلاس Employee و Address به صورت HAS-A هست. یعنی یک employee، یک address داره.

توجه کنید که دو نوع رابطه HAS-A وجود داره، یکی به اسم composition و یکی دیگه هم به اسم aggregation.

۱- رابطه composition یک رابطه وابسته هست، یعنی وجود یک کلاس وابسته به وجود یک کلاس دیگه ست. مثلا کلاس Human رو تصور کنید، رابطه این کلاس با سایر کلاس های اعضای بدن مثل Heart, Leg و Hand بصورت یک رابطه وابسته هست (چون اگر Human از بین بره بقیه اعضا هم از بین خواهند رفت). همچنین میتوان رابطه ماشین و اجرای آن به صورت یک رابطه composition تعریف کرد.

۲- اما در رابطه aggregation، رابطه دو کلاس به هم وابسته نیست. مثلا کلاس Student و کلاس School را در نظر بگیرید. این دو کلاس به هم رابطه دارند اما وجود هیچ کدوم وابسته به دیگری نیست. در واقع می توان هم از کلاس Student و هم از کلاس School به صورت مستقل استفاده کرد.
@java_me
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