Java
46 subscribers
42 photos
36 files
137 links
Download Telegram
دقت کنید که اگر در class هیچ constructor ی وجود نداشه باشه، کامپایلر به صورت اتوماتیک یک default constructor در زمان compile میسازه
Example:

class Student3{  

   int id;  

   String name;  

  

   void display(){

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

   }  

  

   public static void main(String args[]){  

      Student3 s1=new Student3();  

      Student3 s2=new Student3();  

      s1.display();  

      s2.display();  

   }  

}

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

Output:

0 null

0 null

در این مثال☝️، ما هیچ کانستراکتوری برای کلاس مون ننوشتیم، بخاطر همین کامپایلر برامون یک default constructor میسازه و مقدارهای 0 و null رو به متغیرها میده. (همون default value)
Java parameterized constructor

این نوع از کانستراکتور همراه را پارامترهای ورودی هست
Example:
class Student4{
int id;
String name;

Student4(int i,String n){
id = i;
name = n;
}
void display(){
System.out.println(id+" "+name);
}

public static void main(String args[]){
Student4 s1 = new Student4(111,"Karan");
Student4 s2 = new Student4(222,"Aryan");
s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 Karan
222 Aryan

در این مثال☝️ما یه constructor به همراه دوتا پارامتر ورودی داریم که میتونیم با استفاده از اون متغیرهامونو مقداردهی کنیم

در واقع دلیل استفاده از این نوع constructor ها داشتن روشهای مختلف برای مقداردهی اولیه object در زمان ایجاد هست.

Constructor Overloading in Java

ما میتونیم با استفاده از تغییر تعداد و نوع پارامترها تعداد بیشتری constructor داشته باشیم که به این کار Constructor Overloading میگن

Example:
class Student5{
int id;
String name;
int age;
Student5(int i,String n){
id = i;
name = n;
}
Student5(int i,String n,int a){
id = i;
name = n;
age=a;
}
void display(){
System.out.println(id+" "+name+" "+age);
}

public static void main(String args[]){
Student5 s1 = new Student5(111,"Karan");
Student5 s2 = new Student5(222,"Aryan",25);
s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 Karan 0
222 Aryan 25


دقت کنید، با وجود اینکه هیچ return type ی برای constructor وجود نداره، اما یک instance از class رو همیشه return میکنه.

همچنین constructor میتونه وظایف دیگه‌ای هم علاوه بر مقداردهی اولیه object، (مثل همون کارایی که method انجام میده) داشته باشه.
Java Books

[ File : Java A Beginner Guide Sixth Edition Herbert Schildt.pdf ]
https://t.me/java_me/6

[ File : Java The Complete Reference Ninth Herbert Schildt.pdf ]
https://t.me/java_me/7

[ File : OCA Oracle Certified Associate Jeanne Boyarsky.pdf ]
https://t.me/java_me/9

[ File : OCP Oracle Certified Professional Jeanne Boyarsky.pdf ]
https://t.me/java_me/10
Basics of Java

What is Java
https://t.me/java_me/18

History of Java
https://t.me/java_me/20

Features of Java
https://t.me/java_me/23

Hello Java Program
https://t.me/java_me/28

Internal Program
https://t.me/java_me/33

JDK, JRE and JVM
https://t.me/java_me/37

Variables in Java
https://t.me/java_me/43

Data Types in Java
https://t.me/java_me/52

Operators in java
https://t.me/java_me/69
Java Books

https://t.me/java_me/128

Basics of Java

https://t.me/java_me/129
—---------------------------------------------—

Java Control Statements

Java If-else
https://t.me/java_me/83

Java Switch
https://t.me/java_me/95

Java For Loop
https://t.me/java_me/100

Java While Loop
https://t.me/java_me/104

Java do-while Loop
https://t.me/java_me/107

Java Break
https://t.me/java_me/110

Java Continue
https://t.me/java_me/113

Java Comments
https://t.me/java_me/114
Java Books

https://t.me/java_me/128

Basics of Java

https://t.me/java_me/129

Java Control Statements

https://t.me/java_me/132
—---------------------------------------------—

Java OOPs Concepts

OOPs Concepts
https://t.me/java_me/116

Naming conventions
https://t.me/java_me/117

Object and Class
https://t.me/java_me/118

Constructor
https://t.me/java_me/122
Java static keyword


کلمه static توی جاوا در واقع برای manage کردن مموری استفاده میشه و میتونه در متغیرها، متودها، بلاک ها و کلاس تو در تو استفاده بشه
- variable (also known as class variable)
https://t.me/java_me/135

- method (also known as class method)
https://t.me/java_me/136

- block
https://t.me/java_me/137

- nested class
Java static variable


اگه یک متغیر با کلمه static تعریف بشه، اون متغیر به عنوان static variable در نظر گرفته میشه.
نکته: static variable فقط در زمانی که کلاس load میشه و فقط برای یک بار مموری میگیره. در واقع static variable باعث کاهش میزان استفاده از مموری استفاده میشه.

به کد زیر دقت کنید
class Student{  
int rollno;
String name;
String college="ITS";
}

تصور کنید که ما ۵۰۰ تا student داشته باشیم، در این صورت همه متغیرها وقتی object ساخته میشه مموری میگیره. همه این objectها، rollno و name متفاوتی دارن. پس اختصاص یافتن مموری برای هر کدومشون کار درستی هست، اما college داره برای همه instance ها تکرار میشه که مموری اضافه داره میگیره. حالا اگه این متغیر رو static کنیم دیگه فقط یکبار مموری میگیره.

Example:
class Student8{  
int rollno;
String name;
static String college ="ITS";

Student8(int r,String n){
rollno = r;
name = n;
}
void display (){
System.out.println(rollno+" "+name+" "+college);
}

public static void main(String args[]){
Student8 s1 = new Student8(111,"Karan");
Student8 s2 = new Student8(222,"Aryan");

s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 Karan ITS
222 Aryan ITS


توجه کنید که متغیر static بین همه instance ها share میشه

Example:
class Counter2{  
static int count=0;//will get memory only once and retain its value

Counter2(){
count++;
System.out.println(count);
}

public static void main(String args[]){
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
--------------------------------------------
Output:
1
2
3

در این مثال☝️با توجه به static بودن count، مقدار قبلی متغیر با ساخت یک inctance دیگه از بین نمیره و میتونیم ازش استفاده کنیم، چون در زمان load کلاس مقداردهی شده و مختص به instance های ایجاد شده نیست و همچنین امکان خواندن و نوشتن متغیر توسط instance وجود داره.
Java static method


اگر ما از کلمه static در کنار متود استفاده کنیم، اونو به عنوان static method میشناسیم
دقت کنید که static method مربوط به خود کلاس میشه و نه object، همچنین میتونیم static method رو بدون ساخت یک instance از یک کلاس صدا بزنیم، و اینکه static method فقط میتونه به متغیرها و متودهای static دسترسی پیدا کنه.
Example:
class Student9{  
int rollno;
String name;
static String college = "ITS";

static void change(){
college = "BBDIT";
}

Student9(int r, String n){
rollno = r;
name = n;
}

void display (){
System.out.println(rollno+" "+name+" "+college);
}

public static void main(String args[]){
Student9.change();

Student9 s1 = new Student9 (111,"Karan");
Student9 s2 = new Student9 (222,"Aryan");

s1.display();
s2.display();
}
}
--------------------------------------------
Output:
111 Karan BBDIT
222 Aryan BBDIT

در این مثال☝️قبل ساخت یک instance از کلاس، متود static رو صدا می زنیم که اون هم میتونه مقدار متغیر static رو عوض کنه.

Example:
class Calculate{  
static int cube(int x){
return x*x*x;
}

public static void main(String args[]){
int result=Calculate.cube(5);
System.out.println(result);
}
}
--------------------------------------------
Output:
125

و در این مثال☝️بدون ساخت یک instance از کلاس، از طریق static method محاسبه مون رو انجام بدیم.

دقت کنید که دوتا محدودیت اصلی برای static method وجود داره.
۱- یک static method نمیتونه به اعضا غیراستاتیک دسترسی پیدا کنه یا متودهای غیراستاتیک رو صدا بزنه.
۲- نمیتونیم از کلمات this و super در static method استفاده کنیم. (چون این کلمات به instance یک کلاس مربوط میشه)

Example:
class A{  
int a=40;//non static

public static void main(String args[]){
System.out.println(a);
}
}
--------------------------------------------
Output:
Compile Time Error

در این مثال☝️چون میخواستیم از یک متود static به یک متغیر غیراستاتیک دسترسی پیدا کنیم، به ارور برخورد کردیم.

دقت کنید که متود main هم یک متود استاتیک هست و زمانی که jvm داره این متود رو صدا میزنه، بدون نیاز به ساخت objectی از اون کلاس میتونه این کار رو انجام بده.
Java static block


بلاک static میتونه برای مقداردهی اعضای static بکار بره، همچنین static block قبل از متود main و در زمان load کلاس اجرا میشه.
Example:
class A2{  

   static{

      System.out.println("static block is invoked");

   }  

   public static void main(String args[]){  

      System.out.println("Hello main");  

   }  

} 

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

Output:

static block is invoked

Hello main

در این مثال☝️ابتدا static block اجرا میشه و سپس متود main.

در جاوا ۶ به قبل اجرا برنامه بدون وجود متود main امکان پذیر بوده اما از جاوا ۷ بعد دیگر این امکان وجود ندارد.
Example:
class A3{  

   static{  

      System.out.println("static block is invoked");  

      System.exit(0);  

   }  

}

اجرای این مثال☝️در جاوا بدون هیچ مشکلی انجام خواهد شد، چون در ابتدا static block اجرا میشه و قبل از رسیدن به متود main از برنامه خارج میشه و دیگر وجود یا عدم وجود متود main چک نمیشه اما در جاوا ۷ با اینکه static block قبل از متود main اجرا میشه اما وجود متود main الزامی هست.

خروجی مثال بالا در جاوا ۶ به قبل:
static block is invoked

خروجی مثال بالا از جاوا ۷ به بعد:
Error: Main method not found in class A3, please define the main method as:

public static void main(String[] args)
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