انواع تعریف متغییرها
برای استفاده از یک متغییر که در واقع یک مکان رزرو شده از حافظه رم شماست , باید قبلا اون رو تعریف کنیم مثل تعاریف زیر :
int a, b, c; // تعریف سه متغییر a,b,c.
int a = 10, b = 10; // مثال مقدار دهی اولیه
byte B = 22; // مقدار دهی اولیه متغییر نوع byte B.
double pi = 3.14159; // تعریف و مقداردهی متغییر pi.
char a = 'a'; // تعریف نوع کاراکتری a و مقداردهی اولیه آن
سه نوع تعریف متغییر یا شی ارجاع رو براتون شرح میدم که شامل موارد زیر میشه :
1- متغییر های محلی local
2- متغییر های نمونه instance
3- متغییر های ثابت کلاسی class/static
متغییر های محلی :
دقت کنید که وقتی یک متغییر رو داخل یک متد یا سازنده یا یک بلاک تعیین شده تعریف میکنیم در واقع اون متغییر حالت محلی داره و فقط توی همون متد یا سازنده یا بلاک اعتبار داره . در این نوع تعریف باید بلا فاصله بعد از تعریق مقدار دهی اولیه رو انجام بدیم چرا که این نوع تعریف هیچ مقدار اولیه ای به متغییر نمیده . در ضمن نمیتونبم از تغییر دهنده های دسترسی جاوا برای این نوع تعریف استفاده کنیم .
به مثال زیر توجه کنید :
public class Test{
public void pupAge(){//تعریف متغییر داخل متد با مقدار دهی اولیه که باید انجام بگیره
int age = 0;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}
نتیجه اجرای کد بالایی پایین اومده :
Puppy age is: 7
حالا به این مثال توجه کنید که توش از مقدار دهی اولیه استفاده نشده و نتیجش رو ببینید :
public class Test{
public void pupAge(){//مقدار دهی اولیه انجام نشده
int age;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}
نتیجه :
Test.java:4:variable number might not have been initialized
age = age + 7;
^ 1 error
متغییرهای نمونه یا instance :
- این نوع متغییر ها د اخل کلاس و خارج از تمام متدها تعریف میشن و تمام متدهای داخل کلاس و سازنده ی کلا س هم به اون دسترسی دارند.
- در واقع اختصاص حافظه به این نوع متغییر زمانی انجام میشه که شما با کلمه کلیدی new یک شی از نوع کلاسی که حاوی این متغییره میسازید .
- میتونیم از modifire های برای تغییر نوع دسترسی به این نوع متغییرها استفاده کنیم . بطور مثال میتونیم کاری کنیم که اگه کلاسی از کلاس ما ارث میبره کدوم متغییر های رو ارث ببره کدومارو نبره .
- این نوع متغییرها در زمان تعریف مقدار اولیه میگرن .
- اگه دسترسی عمومی بدیم میتونیم مستقیم از شیی که تعریف کردیم به مقادیر این نوع متغییرها دسترسی داشته باشیم .
به مثال زیر خوب توجه کنید :
import java.io.*;
public class Employee{
// این متغییر برای تمام کلاسهای فرزند قابل دسترسی است.
public String name;
// این متغییر فقط تو همین کلاس دیده میشه.
private double salary;
// متغییری که داخل سازنده مقدار دهی اولیه شده .
public Employee (String empName){
name = empName;
}
// توی این متد متغییر salary مقدار دهی شده.
public void setSalary(double empSal){
salary = empSal;
}
// این متد مقادیر متغییر های کلاس مارو چاپ میکنه.
public void printEmp(){
System.out.println("name : " + name );
System.out.println("salary :" + salary);
}
public static void main(String args[]){
Employee empOne = new Employee("Ransika");
empOne.setSalary(1000);
empOne.printEmp();
}
}
و نتیجه کد بالا :
name : Ransika
salary :1000.0
متغیرهای ثابت کلاسی یا class/static :
- توی این نوع تعریف درست مثل متغییر های نمونه یا instance عمل میکنیم با این تفاوت که قبل از تعریف کلمه کلیدی static رو میاریم .
- باید خارج از متد تعریف بشه .
- مستقیم از نام کلاس قابل دسترسی هست و نه از اشیایی که از اون کلاس تعریف شدن .
- با ثابت ها یا constants که با کلمه کلیدی final تعریف میشن اشتباه نگیرین .
- مقدار متغییر نوع static توی تمام اشیای تعریف شده از یک کلاس یکسان هست .
مثال زیر رو ببینید :
import java.io.*;
public class Employee{
//تعریف یک متغییر استاتیک پرایویت
private static double salary;
// تعریف یک ثابت از نوع استاتیک
public static final String DEPARTMENT = "Development ";
public static void main(String args[]){
salary = 1000;
System.out.println(DEPARTMENT+"average salary:"+salary);
}
}
نتیجه :
Development average salary:1000
نکته : برای دسترسی به نوع استاتیک فقط از نام کلاس میتونیم اقدام کنیم .
Employee.DEPARTMENT

الهی !