فصل اول: زبان جاوا، مفهوم ماشین مجازی و نحوه نصب
۱. جاوا چیست و چرا پلتفرم مستقل است؟
جاوا یک زبان شیگرا (Object-Oriented)، کلاسمحور (Class-based) و با امنیت بالا است. شعار کلیدی جاوا:
“Write Once, Run Anywhere” (یکبار بنویس، همهجا اجرا کن)
۲. مفاهیم اساسی JDK ،JRE و JVM
- JVM (Java Virtual Machine): ماشین مجازی جاوا. برنامهای است که کدهای میانی جاوا (بایتکد یا فایلهای .class) را خوانده و به زبان سیستمعامل مقصد ترجمه و اجرا میکند.
- JRE (Java Runtime Environment): شامل JVM به همراه کتابخانههای اصلی جاوا است؛ فقط برای اجرای برنامههای جاوا نیاز است.
- JDK (Java Development Kit): کیت کامل توسعه جاوا. شامل کامپایلر (javac)، دیباگر و JRE است. برنامهنویس برای نوشتن کد نیاز به JDK دارد.
۳. نصب ابزارها و تشریح محیط کار
- دانلود و نصب JDK (نسخههای پایدار مانند JDK 17 یا 21).
- نصب محیط توسعه یکپارچه (IDE): توصیهشده برای دانشگاه: IntelliJ IDEA یا Apache NetBeans یا Eclipse.
- منوهای پرکاربرد در IDE:
- Project Explorer: درختچه فایلها و پوشههای پروژه (پوشه src محل نوشتن فایلهای کُد است).
- Run / Debug: منوی اجرای برنامه یا خطایابی گامبهگام.
- Build: بازسازی و کامپایل کردن پروژه.
- Console / Output: پنجره پایین محیط برای مشاهده خروجی برنامه و تایپ ورودیها.
اولین برنامه جاوا (Hello World)
public class FirstProgram {
public static void main(String args) {
System.out.println("سلام به دنیای برنامهنویسی جاوا!");
}
}
فصل دوم: انواع متغیرها، توابع ورودی و خروجی
۱. متغیر چیست؟
متغیر خانه نامگذاریشدهای از حافظه رم (RAM) است که مقدار مشخصی از داده را نگه میدارد. در جاوا نوع متغیر باید قبل از استفاده مشخص شود (زبانی با اعلان صریح نوع یا Statically-Typed).
۲. انواع دادههای پایه (Primitive Types)
- اعداد صحیح: byte (۱ بایت)، short (۲ بایت)، int (۴ بایت - رایجترین)، long (۸ بایت)
- اعداد اعشاری: float (۴ بایت)، double (۸ بایت - رایجترین و دقیقتر)
- کاراکتر تک: char (مانند 'A' یا 'م')
- بولین (منطقی): boolean (تنها دو مقدار true یا false)
۳. ورودی و خروجی در جاوا
- خروجی:
- System.out.print(): چاپ متن در خروجی بدون رفتن به سطر بعد.
- System.out.println(): چاپ متن و رفتن به سطر بعد.
- System.out.printf(): چاپ قالببندیشده (مشابه زبان C).
- ورودی: استفاده از کلاس Scanner از کتابخانه java.util.
مثالهای کاربردی فصل دوم
مثال ۱: تعریف انواع داده و چاپ خروجی
public class VariableExample {
public static void main(String args) {
int studentId = 101;
double averageScore = 18.75;
char status = 'A';
boolean isPass = true;
System.out.println("شماره دانشجویی: " + studentId);
System.out.println("معدل: " + averageScore);
System.out.println("وضعیت قبولی: " + isPass);
}
}
مثال ۲: دریافت مشخصات دانشجو از کاربر با Scanner
import java.util.Scanner;
public class InputExample {
public static void main(String args) {
Scanner input = new Scanner(System.in);
System.out.print("نام خود را وارد کنید: ");
String name = input.nextLine();
System.out.print("سن خود را وارد کنید: ");
int age = input.nextInt();
System.out.println("خوش آمدید " + name + "، شما " + age + " سال سن دارید.");
}
}
مثال ۳: محاسبه مساحت و محیط دایره بر اساس ورودی شعاع
import java.util.Scanner;
public class CircleCalculator {
public static void main(String args) {
Scanner scanner = new Scanner(System.in);
final double PI = 3.14159; // ثابتی که مقدارش تغییر نمیکند
System.out.print("لطفاً شعاع دایره را وارد کنید: ");
double radius = scanner.nextDouble();
double area = PI * radius * radius;
double perimeter = 2 * PI * radius;
System.out.printf("مساحت دایره: %.2f\n", area);
System.out.printf("محیط دایره: %.2f\n", perimeter);
}
}
فصل سوم: عملگرها، ساختارهای شرطی و حلقهها
۱. عملگرها
- محاسباتی: + , - , * , / , % (باقیمانده)
- مقایسهای: == (برابری)، != (نابرابری)، < ، > ، <= ، >=
- منطقی: && (و/AND)، || (یا/OR)، ! (نقیض/NOT)
۲. ساختارهای شرطی
- if - else if - else: برای تصمیمگیری بر اساس درستی یک شرط.
- switch - case: انتخاب بین چندین حالت ثابت مجزا.
۳. حلقههای تکرار
- for: برای تکرار با تعداد دفعات مشخص.
- while: تکرار تا زمانی که شرط برقرار باشد (بررسی شرط در ابتدا).
- do-while: تکرار با حداقل یکبار اجرا (بررسی شرط در انتها).
مثالهای کاربردی فصل سوم
مثال ۱: ساختار شرطی (بررسی نمره دانشجو)
import java.util.Scanner;
public class GradeCheck {
public static void main(String args) {
Scanner sc = new Scanner(System.in);
System.out.print("نمره را وارد کنید (۰ تا ۲۰): ");
double grade = sc.nextDouble();
if (grade >= 17 && grade <= 20) {
System.out.println("سطح: عالی (A)");
} else if (grade >= 12 && grade < 17) {
System.out.println("سطح: قبول (B)");
} else if (grade >= 0 && grade < 12) {
System.out.println("سطح: مردود (C)");
} else {
System.out.println("نمره نامعتبر است!");
}
}
}
مثال ۲: استفاده از Switch-Case برای منوی عملیات
import java.util.Scanner;
public class SimpleMenu {
public static void main(String args) {
Scanner sc = new Scanner(System.in);
System.out.println("۱. ورود\n۲. ثبتنام\n۳. خروج");
System.out.print("یک گزینه را انتخاب کنید: ");
int choice = sc.nextInt();
switch (choice) {
case 1:
System.out.println("در حال ورود به سیستم...");
break;
case 2:
System.out.println("فرم ثبتنام باز شد.");
break;
case 3:
System.out.println("از برنامه خارج شدید.");
break;
default:
System.out.println("گزینه انتخابی نامعتبر است!");
}
}
}
مثال ۳: حلقهها (چاپ جدول ضرب یک عدد با حلقه for)
import java.util.Scanner;
public class MultiplicationTable {
public static void main(String args) {
Scanner sc = new Scanner(System.in);
System.out.print("عدد مورد نظر را وارد کنید: ");
int num = sc.nextInt();
for (int i = 1; i <= 10; i++) {
System.out.println(num + " * " + i + " = " + (num * i));
}
}
}
فصل چهارم: رشتهها (Strings) و آرایهها (Arrays)
۱. رشته (String) چیست؟
در جاوا، رشته یک شیء (Object) از کلاس String است (داده اولیه نیست).
متدهای رایج String:
- length(): طول رشته
- charAt(index): دسترسی به کاراکتر در خانه مشخص (ایندکسها از ۰ شروع میشوند)
- equals(): مقایسه برابری محتوای دو رشته (هرگز از == برای مقایسه متن دو رشته استفاده نکنید!)
- toUpperCase() / toLowerCase(): تبدیل به حروف بزرگ/کوچک
- contains(): بررسی وجود یک زیررشته
- replace(): جایگزینی کاراکتر یا متن
مثالهای کاربردی فصل چهارم
مثال ۱: متدهای کاربردی رشته و بررسی رمز عبور
public class StringMethods {
public static void main(String args) {
String originalPass = "Java@123";
String enteredPass = "java@123";
// بررسی برابری با حساسیت به حروف
if (originalPass.equals(enteredPass)) {
System.out.println("رمز صحیح است.");
} else {
System.out.println("رمز اشتباه است (به حروف بزرگ و کوچک دقت کنید).");
}
// دسترسی به طول و کاراکترها
System.out.println("طول رشته: " + originalPass.length());
System.out.println("کاراکتر اول: " + originalPass.charAt(0));
}
}
۲. آرایه چیست؟
آرایه مجموعهای از عناصر همنوع است که در خانههای متوالی حافظه پشت سر هم قرار میگیرند. طول آرایه پس از تعریف ثابت است.
مثال ۲: آرایه یکبعدی (محاسبه میانگین نمرات)
public class ArrayAverage {
public static void main(String args) {
double[] scores = {18.5, 14.0, 19.25, 12.0, 16.75};
double sum = 0.0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
double average = sum / scores.length;
System.out.println("تعداد دانشجویان: " + scores.length);
System.out.println("معدل کل: " + average);
}
}
مثال ۳: آرایه دوبعدی (ماتریس نمرات دو دانشجو در سه درس)
public class TwoDimArray {
public static void main(String args) {
// [سطر][ستون] -> سطر: دانشجو، ستون: درس
int[][] grades = {
{15, 18, 20},
{12, 14, 19}
};
for (int row = 0; row < grades.length; row++) {
System.out.print("نمرات دانشجو " + (row + 1) + ": ");
for (int col = 0; col < grades[row].length; col++) {
System.out.print(grades[row][col] + " ");
}
System.out.println();
}
}
}
متدهای جادویی کلاس java.util.Arrays
جاوا یک کلاس کمکی آماده به اسم Arrays دارد که شامل ابزارهای بسیار قدرتمندی است.
import java.util.Arrays;
public class ArrayMethodsDemo {
public static void main(String[] args) {
int[] numbers = {45, 12, 85, 32, 89, 39, 69, 44, 42, 1, 6, 8};
// ۱. چاپ شیک آرایه بدون نوشتن حلقه!
System.out.println("آرایه اولیه: " + Arrays.toString(numbers));
// ۲. مرتبسازی صعودی (Sort)
Arrays.sort(numbers);
System.out.println("آرایه مرتبشده: " + Arrays.toString(numbers));
// ۳. جستجوی سریع (Binary Search)
// نکته: این متد حتماً باید بعد از sort صدا زده شود
int target = 45;
int index = Arrays.binarySearch(numbers, target);
System.out.println("عدد " + target + " در ایندکس شماره " + index + " قرار دارد.");
// ۴. پر کردن یکباره یک آرایه جدید با مقدار پیشفرض (Fill)
int[] defaultScores = new int[5];
Arrays.fill(defaultScores, 20); // همه خانهها 20 میشوند
System.out.println("آرایه پیشفرض: " + Arrays.toString(defaultScores));
// ۵. محاسبه مجموع و میانگین با حلقه for-each
int sum = 0;
for (int num : numbers) {
sum += num;
}
double average = (double) sum / numbers.length;
System.out.println("مجموع اعداد: " + sum);
System.out.println("میانگین اعداد: " + average);
}
}
شروع شی گرایی
فصل پنجم: برنامهنویسی شیگرا (OOP)، کلاس، سازنده و اعضای ایستا
۱. کلاس و شیء به زبان ساده
- کلاس (Class): مثل نقشه ساخت یک خانه است. خودش خانه نیست، بلکه الگوی ساخت آن است.
- شیء (Object / Instance): خانهای واقعی است که از روی آن نقشه ساخته شده و در حافظه جا میگیرد.
۲. ارکان کلاس
- ویژگیها یا فیلدها (Attributes / Fields): اطلاعات شیء (مثل name, age).
- رفتارها یا متدها (Methods): کارهایی که شیء انجام میدهد (مثل study(), sleep()).
- سازنده (Constructor): متدی همنام با کلاس بدون نوع بازگشتی که هنگام ایجاد شیء (new) فراخوانی شده و فیلدها را مقداردهی اولیه میکند.
- مفهوم مخرب در جاوا: بر خلاف C++، در جاوا متد مخرب صریح نداریم. جاوا ابزاری خودکار به نام Garbage Collector (زبالهروب) دارد که اشیای بلااستفاده را از رم پاک میکند.
- ارسال پارامتر: در جاوا همهچیز Pass-by-Value است (برای دادههای اولیه خود مقدار کپی میشود؛ برای اشیاء، کپیِ آدرس ارجاع پاس داده میشود).
- اعضای ایستا (static): متغیرها یا متدهایی که متعلق به خودِ کلاس هستند و نه یک شیءِ خاص؛ برای استفاده از آنها نیازی به ساخت شیء با کلمه new نیست.
مثالهای کاربردی فصل پنجم
سازنده (Constructor) چیست و چه کاربردی دارد؟
- تعریف ساده: سازنده یک متد خاص و ویژه در داخل کلاس است که نام آن دقیقاً همنام با خود کلاس است و نوع بازگشتی (void یا int و غیره) هم ندارد.
- کاربرد اصلی: وظیفه سازنده مقداردهی اولیه به ویژگیهای (فیلدهای) شیء در لحظه تولد (ساخت) آن است. هر زمان که از کلمه کلیدی new استفاده میکنید، جاوا به صورت خودکار متد سازنده را صدا میزند تا شیء ما آماده و پر از اطلاعات اولیه شود، نه خالی و ناقص!
نکته مهم: اگر ما در کلاس خود هیچ سازندهای ننویسیم، جاوا خودش یک «سازنده پیشفرض خالی» پشت صحنه میسازد؛ اما به محض اینکه ما سازنده با پارامتر بنویسیم، سازنده پیشفرض خودکار حذف میشود.
مثال ۱: تعریف کلاس، سازنده (Constructor) و ساخت شیء
class Student {
// فیلدها
String name;
double gpa;
// سازنده (Constructor)
public Student(String studentName, double studentGpa) {
name = studentName;
gpa = studentGpa;
}
// متد نمایش اطلاعات
public void printInfo() {
System.out.println("دانشجو: " + name + " | معدل: " + gpa);
}
}
public class MainClass {
public static void main(String args) {
// ایجاد دو شیء مجزا
Student s1 = new Student("زهرا رضایی", 18.5);
Student s2 = new Student("مریم حسینی", 19.2);
s1.printInfo();
s2.printInfo();
}
}
مثال ۲: استفاده از کلمه کلیدی static
تعریف static به زبان ساده و ملموس
در جاوا به طور پیشفرض، هر متغیر یا متدی که داخل کلاس مینویسید متعلق به «شیء» (Object) است؛ یعنی هر بار که دستور new را میزنید، یک نسخه اختصاصی از آن متغیر در حافظه رم برای آن شیء ساخته میشود.
اما وقتی کلمه static را قبل از متغیر یا متدی قرار میدهید، مالکیت آن تغییر میکند:
متعلق به خودِ «کلاس» میشود، نه اشیاءِ آن.
یعنی از آن متغیر فقط و فقط یک نسخه مشترک در کل حافظه ساخته میشود که بین تمام اشیاء به اشتراک گذاشته خواهد شد.
تمثیل مناسب برای سر کلاس:
- متغیر غیر استاتیک (Instance Variable): مثل کیف یا خودکار اختصاصی هر دانشجو؛ هر دانشجو کیف و وسایل خودش را دارد و مال خودِ اوست.
- متغیر استاتیک (Static Variable): مثل تخته وایتبرد کلاس یا کولر اتاق؛ یکی است، متعلق به کل کلاس است و همه دانشجویان به همان یک تخته دسترسی دارند و تغییرش میدهند.
۲. کاربردهای اصلی static
- مدیریت حافظه (صرفهجویی در رم): نیازی نیست اطلاعات یا متدهایی که برای همه یکسان هستند، با هر بار new کردن دوباره در حافظه تکثیر شوند.
- شمارندهها و مقادیر اشتراکی: برای شمارش تعداد اشیاء ساختهشده، ثبت اطلاعات سراسری (مثل نام دانشگاه برای همه دانشجویان).
- متدهای ابزاری و کمکی (Utility Methods): مثل توابع ریاضی (Math.sqrt(), Math.pow())؛ شما برای گرفتن جذر یک عدد نیازی ندارید از کلاس ریاضی شیء بسازید (new Math)! مستقیم مینویسید Math.sqrt(16).
- دسترسی سریع و بدون نیاز به شیء: برای استفاده از اعضای استاتیک فقط کافی است نام کلاس را بیاورید: ClassName.memberName.
۳. مثالهای کاربردی و هدفمند
مثال ۱: متغیر استاتیک به عنوان ویژگی مشترک (نام دانشگاه)
فرض کنید ۱۰۰۰ دانشجو داریم؛ اگر نام دانشگاه را معمولی تعریف کنیم، ۱۰۰۰ بار متن “دانشگاه دختران” در حافظه کپی میشود. اما با static فقط یکبار ذخیره میشود:
مثال ۳: کپسولهسازی (Encapsulation) با Getter و Setter
class Employee {
private double salary; // دسترسی مستقیم ممنوع شد
// Getter برای خواندن
public double getSalary() {
return salary;
}
// Setter برای اعتبارسنجی قبل از تغییر
public void setSalary(double amount) {
if (amount > 0) {
this.salary = amount;
} else {
System.out.println("حقوق نامعتبر است!");
}
}
}
public class EncapsulationDemo {
public static void main(String args) {
Employee emp = new Employee();
emp.setSalary(15000000);
System.out.println("حقوق کارمند: " + emp.getSalary());
}
}
فصل ششم: مفهوم وراثت (Inheritance) و کاربردهای آن
۱. وراثت چیست؟
وراثت قابلیتی است که به یک کلاس جدید (فرزند / Subclass) اجازه میدهد ویژگیها و متدهای یک کلاس از قبل موجود (والد / Superclass) را به ارث ببرد.
- مزیت اصلی: پرهیز از کدهای تکراری (Reusability) و برقراری رابطه معنایی “است از” (is-a).
- کلمات کلیدی: extends برای ارثبری، super برای دسترسی به سازنده یا متدهای کلاس والد.
- بازنویسی متد (Method Overriding): کلاس فرزند رفتار والد را شخصیسازی میکند.
مثالهای کاربردی فصل ششم
مثال ۱: ارثبری پایه (شخص و استاد)
// کلاس والد
class Person {
String fullName;
public Person(String fullName) {
this.fullName = fullName;
}
public void introduce() {
System.out.println("سلام، من " + fullName + " هستم.");
}
}
// کلاس فرزند
class Professor extends Person {
String faculty;
public Professor(String fullName, String faculty) {
super(fullName); // فراخوانی سازنده والد
this.faculty = faculty;
}
@Override
public void introduce() {
System.out.println("من دکتر " + fullName + "، استاد دانشکده " + faculty + " هستم.");
}
}
public class InheritanceDemo {
public static void main(String args) {
Person p = new Person("علی احمدی");
p.introduce();
Professor prof = new Professor("فاطمه کریمی", "کامپیوتر");
prof.introduce();
}
}
مثال ۲: چندریختی (Polymorphism) در وراثت اشکال هندسی
class Shape {
public void draw() {
System.out.println("در حال رسم یک شکل هندسی ناشناخته...");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("در حال رسم یک دایره (O)");
}
}
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("در حال رسم یک مستطیل ()");
}
}
public class PolymorphismDemo {
public static void main(String args) {
// متغیر از جنس والد، شیء از جنس فرزند
Shape s1 = new Circle();
Shape s2 = new Rectangle();
s1.draw();
s2.draw();
}
}
فصل هفتم: ساخت رابط کاربری گرافیکی (GUI) با Swing
۱. واسط کاربری گرافیکی چیست؟
به جای اجرای کد در کنسول متنی سیاه، محیطی پنجرهای با دکمه، برچسب متنی و فیلد ورودی ایجاد میکنیم.
- کتابخانه پیشفرض: javax.swing.*
- اجزای اصلی:
- JFrame: پنجره اصلی برنامه.
- JLabel: متن نمایشی غیرقابل ویرایش.
- JTextField: کادر ورودی متن توسط کاربر.
- JButton: دکمه قابل کلیک.
- Event Handling (رویدادها): واکنش پنجره به کلیک ماوس با استفاده از ActionListener.
مثالهای کاربردی فصل هفتم
مثال ۱: ساخت یک پنجره ساده با دکمه
import javax.swing.JButton;
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String args) {
JFrame frame = new JFrame("اولین پنجره من");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null); // چیدمان دستی مختصات
JButton btn = new JButton("کلیک کنید");
btn.setBounds(130, 100, 140, 40); // x, y, width, height
frame.add(btn);
frame.setVisible(true); // پنجره را نمایش بده
}
}
مثال ۲: پاسخ به رویداد کلیک دکمه (Event Handling)
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ClickCounter {
public static void main(String args) {
JFrame frame = new JFrame("رویداد کلیک");
frame.setSize(350, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
JLabel label = new JLabel("هنوز کلیک نشده است.");
label.setBounds(50, 30, 250, 30);
frame.add(label);
JButton button = new JButton("من را بزن!");
button.setBounds(50, 80, 120, 35);
frame.add(button);
// تعریف رویداد با استفاده از ActionListener
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("دکمه با موفقیت کلیک شد!");
}
});
frame.setVisible(true);
}
}
مثال ۳: مینی ماشینحساب جمع دو عدد با ورودی متنی
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MiniCalculator {
public static void main(String args) {
JFrame f = new JFrame("ماشینحساب جمع");
f.setSize(300, 250);
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField txtNum1 = new JTextField();
txtNum1.setBounds(50, 20, 180, 30);
f.add(txtNum1);
JTextField txtNum2 = new JTextField();
txtNum2.setBounds(50, 60, 180, 30);
f.add(txtNum2);
JButton btnSum = new JButton("محاسبه جمع");
btnSum.setBounds(50, 100, 180, 35);
f.add(btnSum);
JLabel lblResult = new JLabel("نتیجه: ");
lblResult.setBounds(50, 150, 180, 30);
f.add(lblResult);
btnSum.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
int n1 = Integer.parseInt(txtNum1.getText());
int n2 = Integer.parseInt(txtNum2.getText());
int result = n1 + n2;
lblResult.setText("نتیجه: " + result);
} catch (NumberFormatException ex) {
lblResult.setText("خطا: لطفاً فقط عدد وارد کنید!");
}
}
});
f.setVisible(true);
}
}
فصل هشتم: مدیریت خطا و استثناها (Exception Handling)
۱. خطا چیست؟
خطا وضعیتی است که در حین اجرای برنامه رخ میدهد و باعث توقف ناگهانی (Crash) برنامه میشود (مانند تقسیم عدد بر صفر یا خواندن فایلی که وجود ندارد).
۲. ساختار try-catch-finally
- try: کدهایی که احتمال بروز خطا در آنها وجود دارد درون این بلوک قرار میگیرند.
- catch: اگر در بلوک try خطایی رخ داد، برنامه کرش نکرده و وارد این بخش میشود تا خطا را کنترل و پیام مناسب دهد.
- finally: این بلوک در هر صورت (چه خطا رخ دهد و چه ندهد) اجرا میشود؛ معمولاً برای بستن ارتباطات و فایلها استفاده میشود.
- throw و throws: برای پرتاب صریح یک خطا در کد.
مثالهای کاربردی فصل هشتم
مثال ۱: خطای تقسیم بر صفر (ArithmeticException)
public class DivisionException {
public static void main(String args) {
int a = 10;
int b = 0;
try {
int result = a / b;
System.out.println("نتیجه: " + result);
} catch (ArithmeticException e) {
System.out.println("خطای ریاضی: تقسیم یک عدد بر صفر غیرمجاز است!");
}
System.out.println("برنامه بدون متوقف شدن به پایان رسید.");
}
}
مثال ۲: خطای خروج از مرزهای آرایه (ArrayIndexOutOfBoundsException)
public class ArrayIndexException {
public static void main(String args) {
int numbers = {10, 20, 30};
try {
// خانه شماره 5 وجود ندارد (فقط 0 تا 2 معتبر است)
System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("خطا: شما سعی کردید به خانهای خارج از طول آرایه دسترسی پیدا کنید!");
}
}
}
مثال ۳: اعتبارسنجی سن و پرتاب خطای دستی با throw
public class CustomThrow {
public static void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("سن مجاز نیست! باید حداقل ۱۸ سال داشته باشید.");
} else {
System.out.println("ثبت نام با موفقیت انجام شد.");
}
}
public static void main(String args) {
try {
checkAge(15);
} catch (IllegalArgumentException e) {
System.out.println("خطای بررسی سن: " + e.getMessage());
}
}
}
فصل نهم: ساختمان دادهها در جاوا (Java Collections Framework)
آرایه معمولی اندازه ثابت دارد؛ مجموعه فریمورک کالکشن جاوا (java.util.*) ساختارهای دادهای پویا با قابلیت تغییر اندازه خودکار را فراهم میکند:
Collection (اینترفیس اصلی)List (لیست): ترتیبی، ایندکسدار، و دارای دادههای تکراری مجاز.
-
- ArrayList: مبتنی بر آرایه پویا، جستجو و خواندن در آن بسیار سریع است.
- LinkedList: مبتنی بر لیست پیوندی (گرهها)، درج و حذف در میانه آن بسیار سریع است.
- Set (مجموعه): نامرتب، بدون ایندکس، داده تکراری نمیپذیرد (HashSet).
- Map (دیکشنری/نگاشت): دادهها را به صورت جفت کلید-مقدار (Key-Value) نگه میدارد؛ کلیدها تکراری نمیشوند (HashMap).
مثالهای کاربردی فصل نهم
مثال ۱: کار با ArrayList (افزودن، تغییر و چاپ لیست دانشجویان)
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String args) {
ArrayList students = new ArrayList ();
students.add("زهرا");
students.add("فاطمه");
students.add("مریم");
System.out.println("تعداد اعضا: " + students.size());
System.out.println("دانشجوی اول: " + students.get(0));
// حلقه فور-ایچ (for-each) برای پیمایش سریع
for (String name : students) {
System.out.println("- " + name);
}
}
}
مثال ۲: حذف اعضای تکراری با HashSet
در ریاضیات دبیرستان خواندیم که:
«در یک مجموعه، عضو تکراری معنی ندارد و ترتیب نوشتن اعضا هم مهم نیست.»
HashSet در جاوا دقیقاً پیادهسازی همین مفهوم است:
هیچ عضو تکراری نمیپذیرد (Unique Elements): اگر ۱۰ بار هم یک مقدار تکراری را به آن اضافه کنید، فقط یکبار ذخیره میشود.
ترتیب ندارد (Unordered): عناصر بر اساس ترتیبی که شما وارد میکنید چیده نمیشوند؛ جاوا آنها را بر اساس فرمولهای داخلی خود (هشینگ) میچیند.
ایندکس عددی ندارد: مثل آرایه یا ArrayList نمیتوانید بگویید «عنصر خانه شماره ۲ را به من بده» (get(2) ندارد!).
۲. کاربردهای اصلی HashSet در دنیای واقعی
حذف سریع دادههای تکراری (Deduplication):فرض کنید لیستی از ۱۰۰۰ شماره تلفن یا ایمیل دارید و میخواهید موارد تکراری را با یک حرکت حذف کنید.
عملیات مجموعهها در ریاضی:پیادهسازی اشتراک (Intersection)، اجتماع (Union) و تفاضل دو دسته داده.
۳. متدهای کلیدی HashSet
add(value): اضافه کردن مقدار (اگر تکراری نباشد true و اگر تکراری باشد false برمیگرداند).
contains(value): بررسی اینکه آیا مقدار در مجموعه هست یا نه (true/false).
remove(value): حذف یک مقدار مشخص.
size(): تعداد اعضای غیرتکراری مجموعه.
clear(): پاکسازی کل مجموعه.
import java.util.HashSet;
public class HashSetExample {
public static void main(String args) {
HashSet courses = new HashSet ();
courses.add("ریاضی");
courses.add("فیزیک");
courses.add("ریاضی"); // تلاش برای افزودن مجدد عضو تکراری
// خروجی فقط 2 عضو دارد، مقدار تکراری نادیده گرفته شد
System.out.println("دروس ثبت شده: " + courses);
}
}
مثال ۳: ذخیره شماره دانشجویی و نام با HashMap (کلید و مقدار)
عریف ساده و ملموس HashMap
در آرایهها یا ArrayList، برای پیدا کردن یک داده باید شماره خانه یا ایندکس عددی آن را میدانستیم (0, 1, 2, ...).
اما در دنیای واقعی دادهها با عدد شمارهگذاری نمیشوند؛ بلکه با یک شناسه معنادار شناخته میشوند:
- کد ملی ← نام و مشخصات فرد
- شماره دانشجویی ← نمرات دانشجو
- کلمه انگلیسی ← معنی فارسی (دیکشنری)
تعریف: HashMap ساختار دادهای است که دادهها را بهصورت جفت «کلید و مقدار» (Key - Value) ذخیره میکند.
import java.util.HashMap;
public class HashMapExample {
public static void main(String args) {
// کلید: شماره دانشجویی (Integer)، مقدار: نام (String)
HashMap<Integer, String> studentMap = new HashMap<>();
studentMap.put(401123, "سارا علوی");
studentMap.put(401124, "نگین احمدی");
// دسترسی به مقدار از طریق کلید
int searchId = 401123;
System.out.println("نام صاحب شماره " + searchId + ": " + studentMap.get(searchId));
}
}
فصل دهم: کار با فایلها در جاوا (I/O Streams)
برای پایدار نگه داشتن اطلاعات پس از بستن برنامه، دادهها در فایل ذخیره میشوند. کلاسهای اصلی در پکیج java.io قرار دارند:
- نوشتن در فایل: FileWriter و BufferedWriter
- خواندن از فایل: FileReader و BufferedReader یا استفاده از Scanner با ارجاع به فایل
- بررسی وضعیت فایل: کلاس File (بررسی وجود فایل exists(), اندازه فایل و غیره)
مثالهای کاربردی فصل دهم
مثال ۱: ایجاد فایل و نوشتن متن درون آن
import java.io.FileWriter;
import java.io.IOException;
public class WriteToFile {
public static void main(String args) {
try {
// ساخت فایل و نوشتن روی آن (true در انتها برای Append/اضافه کردن است)
FileWriter writer = new FileWriter("students.txt");
writer.write("101, Zahra Ahmadi, 19.5\n");
writer.write("102, Maryam Hosseini, 18.0\n");
writer.close(); // بسیار مهم: حتماً باید بسته شود تا ذخیره کامل گردد
System.out.println("اطلاعات با موفقیت در فایل ذخیره شد.");
} catch (IOException e) {
System.out.println("خطا در هنگام نوشتن فایل: " + e.getMessage());
}
}
}
مثال ۲: خواندن خط به خط متن از فایل با Scanner
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadFromFile {
public static void main(String args) {
try {
File myFile = new File("students.txt");
Scanner reader = new Scanner(myFile);
System.out.println("محتوای خوانده شده از فایل:");
while (reader.hasNextLine()) {
String line = reader.nextLine();
System.out.println(line);
}
reader.close();
} catch (FileNotFoundException e) {
System.out.println("خطا: فایل مورد نظر پیدا نشد!");
}
}
}
مثال ۳: بررسی مشخصات و موجود بودن فایل
import java.io.File;
public class FileDetails {
public static void main(String args) {
File file = new File("students.txt");
if (file.exists()) {
System.out.println("نام فایل: " + file.getName());
System.out.println("مسیر کامل: " + file.getAbsolutePath());
System.out.println("اندازه به بایت: " + file.length());
System.out.println("قابل نوشتن است؟ " + file.canWrite());
} else {
System.out.println("فایلی با این نام یافت نشد.");
}
}
}