tgoop.com/javapro_ir/4089
Create:
Last Update:
Last Update:
📌 آشنایی با انواع Scope در زبان Java
در زبان برنامهنویسی Java، واژهی Scope به محدودهای اشاره دارد که یک متغیر، تابع یا شیء در آن قابل دسترسی و استفاده است. شناخت درست انواع Scope برای جلوگیری از خطاهای منطقی و طراحی ساختار مناسب برنامه بسیار ضروری است. در این پیام، انواع Scope را بهصورت مرحلهای با مثالهای ساده تا پیشرفته بررسی میکنیم.
✅ ۱. Local Scope (محدوده محلی)
متغیرهایی که درون یک متد یا بلاک تعریف میشوند، فقط در همان بلاک قابل استفادهاند و پس از خروج از آن، از بین میروند.
public class Example {
public static void main(String[] args) {
int x = 10; // x دارای Local Scope است
if (x > 5) {
int y = 20; // y فقط درون این بلوک if معتبر است
System.out.println("y: " + y);
}
// System.out.println(y); // خطا: y شناختهشده نیست
}
}
🔹 نکته: متغیر
y
خارج از بلاک if
وجود ندارد و دسترسی به آن باعث خطای کامپایل میشود.✅ ۲. Instance Scope (محدودهی شیء یا نمونه)
متغیرهایی که در سطح کلاس و خارج از متدها تعریف میشوند، اما بدون استفاده از کلیدواژه `static`، دارای Instance Scope هستند.
public class Person {
String name; // Instance variable
int age;
public void showInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
🔹 نکته: برای دسترسی به این متغیرها باید ابتدا یک شیء از کلاس ساخته شود.
Person p = new Person();
p.name = "Ali";
p.age = 25;
p.showInfo();
✅ ۳. Static Scope (محدوده سراسری در کلاس)
وقتی متغیر یا متدی با
static
تعریف شود، بدون نیاز به ساخت شیء و به صورت مستقیم از طریق نام کلاس قابل دسترسی خواهد بود.
public class Counter {
static int count = 0;
public static void increment() {
count++;
}
}
🔹 نکته: متغیر
count
بین تمام نمونهها مشترک است.
Counter.increment();
System.out.println(Counter.count); // خروجی: 1
✅ ۴. Block Scope (محدودهی بلوک کدی)
هر جایی که از
{}
استفاده شده باشد، مانند if
, for
, while
, و حتی یک بلوک ساده، میتواند محدودهی خاصی تعریف کند.
public class BlockScope {
public static void main(String[] args) {
{
int temp = 42;
System.out.println(temp);
}
// System.out.println(temp); // خطا: temp خارج از محدوده است
}
}
✅ ۵. Method Scope (محدودهی تابع)
پارامترهای ورودی یک متد و متغیرهای تعریفشده درون آن، فقط در همان متد قابل استفادهاند.
public class Calculator {
public int add(int a, int b) {
int result = a + b;
return result;
}
}
🔹 نکته: متغیر
result
فقط در متد add
وجود دارد و از بیرون آن قابل دسترسی نیست.✅ ۶. Nested Scope (محدودههای تو در تو)
در صورت تو در تو بودن بلوکها، بلوک داخلی به متغیرهای بلوک خارجی دسترسی دارد، ولی بالعکس آن صحیح نیست.
public class NestedScope {
public static void main(String[] args) {
int outer = 100;
{
int inner = 50;
System.out.println("outer: " + outer); // مجاز
System.out.println("inner: " + inner);
}
// System.out.println(inner); // خطا
}
}
✅ ۷. Lambda Scope (محدوده در عبارات لامبدا)
در Java، عبارات Lambda برای تعریف توابع بدون نیاز به ایجاد کلاس جدید استفاده میشوند. درون لامبداها، فقط به متغیرهایی میتوان دسترسی داشت که effectively final باشند؛ یعنی یا صراحتاً
final
تعریف شده باشند، یا بعد از مقداردهی، دیگر تغییر نکنند.
public class LambdaScopeExample {
public static void main(String[] args) {
String message = "Hello"; // این متغیر بعداً تغییر نکند
Runnable r = () -> {
System.out.println(message); // مجاز است
};
r.run();
}
}
🔹 نکته مهم: اگر مقدار
message
را بعد از لامبدا تغییر دهیم، کامپایلر خطا میدهد:
public class LambdaScopeError {
public static void main(String[] args) {
String msg = "Hi";
Runnable r = () -> {
System.out.println(msg);
};
msg = "Hello"; // ❌ خطا: msg باید final یا effectively final باشد
r.run();
}
}
BY آموزش برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4089