"

برنامه نویسی شی گرا در جاوا چیست؟

تیم تحریریه 1404/11/29 0 3
لینک کوتاه https://zoheirsoftware.com/z/3c21d3b9b |
برنامه نویسی شی گرا در جاوا چیست؟,دلایل اهمیت شی‌گرایی در جاوا ,چهار اصل اساسی شی‌گرایی (OOP Pillars)

برنامه نویسی شی گرا در جاوا چیست؟

برنامه‌نویسی شی‌گرا (OOP) یک سبک یا پارادایم برنامه‌نویسی است که بر اساس مفاهیم "کلاس" (Class) و "شیء" (Object) بنا شده است .

هدف اصلی آن، شبیه‌سازی موجودیت‌های دنیای واقعی در دنیای برنامه‌نویسی است تا بتوانیم مسائل پیچیده را به شکلی ساده‌تر، منظم‌تر و قابل فهم‌تر مدل‌سازی کنیم .

در این رویکرد، به جای تمرکز صرف روی توابع و منطق برنامه، تمرکز اصلی روی داده‌ها است و با آن‌ها به عنوان "شیء" رفتار می‌شود .

به عنوان مثال، اگر بخواهیم یک برنامه برای مدیریت یک کتابخانه بنویسیم، در رویکرد شی‌گرا به جای فکر کردن به فرآیندهایی مانند "ثبت کتاب" یا "جستجوی عضو"، به موجودیت‌های دنیای واقعی مانند "کتاب"، "عضو"، و "کتابدار" فکر می‌کنیم.

هر یک از این موجودیت‌ها یک شیء خواهند بود که دارای ویژگی‌ها (صفات) و رفتارها (کارهایی که می‌توانند انجام دهند) هستند .

 

برنامه نویسی شی گرا در جاوا چیست؟

دلایل اهمیت شی‌گرایی در جاوا 

جاوا یک زبان کاملاً شی‌گرا است. این بدان معناست که تقریباً همه چیز در جاوا، در قالب کلاس‌ها و اشیاء تعریف می‌شود . استفاده از اصول شی‌گرایی در جاوا مزایای متعددی دارد :

  • سازماندهی بهتر کد

    با تقسیم برنامه به اجزای کوچک و مجزا (اشیاء)، کد شما خواناتر، قابل فهم‌تر و مدیریت آن آسان‌تر می‌شود.
  • قابلیت استفاده مجدد (Reusability)

    پس از تعریف یک کلاس، می‌توانید از آن به عنوان یک قالب برای ایجاد اشیاء بیشمار و حتی در پروژه‌های دیگر استفاده کنید. مفهوم "وراثت" نیز این قابلیت را به شدت افزایش می‌دهد .
  • نگهداری آسان‌تر (Maintainability)

    به دلیل ماژولار بودن برنامه، تغییر در یک بخش از کد، تأثیر کمتری بر سایر بخش‌ها خواهد داشت. این موضوع رفع اشکال و به‌روزرسانی برنامه را ساده‌تر می‌کند .
  • امنیت بالاتر

با استفاده از اصل "کپسوله‌سازی" می‌توان دسترسی به داده‌های حساس را محدود کرده و از آن‌ها در برابر تغییرات ناخواسته محافظت کرد .

 

 

دلایل اهمیت شی‌گرایی در جاوا 

 

 

مفاهیم پایه‌ای کلاس و شیء

برای درک شی‌گرایی، ابتدا باید با دو مفهوم بنیادین آن آشنا شویم: کلاس و شیء.

  • کلاس (Class) چیست؟

کلاس را می‌توان به عنوان یک قالب یا نقشه (Blueprint) در نظر گرفت.

کلاس مشخص می‌کند که یک شیء از آن نوع، چه ویژگی‌ها (صفات) و چه رفتارهایی (متدها) خواهد داشت . به عبارت دیگر، کلاس یک موجودیت منطقی است و تا زمانی که از آن شیء ساخته نشود، فضایی از حافظه را اشغال نمی‌کند .

برای مثال، اگر بخواهیم موجودیت "ماشین" را مدل‌سازی کنیم، کلاس Car به این شکل خواهد بود:

public class Car {
    // ویژگی‌ها (Attributes or Fields)
    String color;
    String model;
    int speed;

    // رفتارها (Methods)
    void accelerate() {
        speed = speed + 10;
        System.out.println("The car is accelerating. Current speed: " + speed);
    }

    void brake() {
        speed = speed - 5;
        System.out.println("The car is braking. Current speed: " + speed);
    }
}


در این مثال، Car یک کلاس است که بیان می‌کند هر ماشینی دارای ویژگی‌هایی مانند color، model و speed و رفتارهایی مانند accelerate() و brake() است .

  • شیء (Object) چیست؟

شیء یک نمونه (Instance) مشخص و عینی از یک کلاس است .

اگر کلاس را به عنوان یک نقشه در نظر بگیریم، شیء خانه‌ای است که بر اساس آن نقشه ساخته شده است.

هر شیء دارای حالت (State) و رفتار (Behavior) خاص خود است. حالت یک شیء توسط مقادیر ویژگی‌هایش تعیین می‌شود و رفتار آن توسط متدهایش .

برای ایجاد یک شیء از کلاس Car، از کلمه کلیدی new استفاده می‌کنیم:

public class Main {
    public static void main(String[] args) {
        // ایجاد یک شیء از کلاس Car با نام myCar
        Car myCar = new Car();

        // تنظیم ویژگی‌های شیء myCar
        myCar.color = "Red";
        myCar.model = "Sedan";
        myCar.speed = 0;

        // فراخوانی رفتارهای شیء myCar
        System.out.println("My car is a " + myCar.color + " " + myCar.model);
        myCar.accelerate(); // خروجی: The car is accelerating. Current speed: 10
        myCar.brake();      // خروجی: The car is braking. Current speed: 5
    }
}


در اینجا myCar یک شیء از نوع Car است. این شیء یک حالت مشخص (color=Red, model=Sedan) دارد و می‌تواند رفتارهای تعریف‌شده در کلاس را انجام دهد.

می‌توانیم اشیاء مستقلی مانند yourCar نیز با ویژگی‌های متفاوت ایجاد کنیم .

 

 

🚀 از صفر تا قهرمان جاوا، فقط با یک دوره!
به دنبال یه فرصت طلایی برای شروع برنامه‌نویسی می‌گردی؟
دوره آموزشی جاوا ما، همون چیزیه که نیاز داری!

✨ چرا این دوره رو انتخاب می‌کنی؟
🎯 از مبتدی تا حرفه‌ای
بدون پیش‌زمینه شروع می‌کنی و به یه برنامه‌نویس جاوا تبدیل می‌شی که بازار کار منتظرته!

🛠 پروژه‌محور و عملی
با انجام پروژه‌های واقعی، کدنویسی رو یاد می‌گیری، نه فقط تئوری!

👨‍🏫 پشتیبانی همیشگی
هرجا گیر کنی، تیم پشتیبانی کنارته تا مشکلت حل بشه.

🔓 دسترسی مادام‌العمر
هر وقت خواستی به محتوا دسترسی داری، برای همیشه!

 

🔥 همین حالا ثبت‌نام کن 

 

 

 

 

چهار اصل اساسی شی‌گرایی (OOP Pillars)

برنامه‌نویسی شی‌گرا بر چهار اصل اساسی استوار است که درک و پیاده‌سازی صحیح آن‌ها، قدرت این رویکرد را نمایان می‌سازد .

  • کپسوله‌سازی (Encapsulation)

    کپسوله‌سازی به معنای کنار هم قرار دادن داده‌ها (ویژگی‌ها) و متدهایی که روی آن داده‌ها کار می‌کنند، در یک واحد (کلاس) و محدود کردن دسترسی مستقیم به برخی از اجزای داخلی آن شیء است .
    به زبان ساده، ما داده‌های حساس را از دنیای بیرون پنهان می‌کنیم و تنها از طریق متدهای مجاز (که معمولاً به عنوان "getter" و "setter" شناخته می‌شوند) امکان دسترسی و تغییر آن‌ها را فراهم می‌کنیم .

چرا کپسوله‌سازی مهم است؟

    • امنیت

      از تغییر ناخواسته و مخرب داده‌ها جلوگیری می‌کند.
    • کنترل

      به شما اجازه می‌دهد قوانین خاصی را برای تغییر داده‌ها اعمال کنید.
    • انعطاف‌پذیری

      می‌توانید نحوه پیاده‌سازی داخلی یک کلاس را بدون آنکه بر سایر بخش‌های برنامه که از آن کلاس استفاده می‌کنند تأثیر بگذارد، تغییر دهید .

مثال کپسوله‌سازی در جاوا:

public class Student {
    // ویژگی‌ها را private تعریف می‌کنیم تا دسترسی مستقیم وجود نداشته باشد
    private String name;
    private int age;

    // سازنده (Constructor) برای مقداردهی اولیه
    public Student(String name, int age) {
        this.name = name;
        setAge(age); // استفاده از setter برای اعتبارسنجی
    }

    // متد getter برای دسترسی به name
    public String getName() {
        return name;
    }

    // متد setter برای تغییر name
    public void setName(String name) {
        this.name = name;
    }

    // متد getter برای دسترسی به age
    public int getAge() {
        return age;
    }

    // متد setter برای تغییر age با اعتبارسنجی
    public void setAge(int age) {
        if (age > 0 && age < 150) {
            this.age = age;
        } else {
            System.out.println("Invalid age!");
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Student s = new Student("John", 20);
        // s.age = -5;  // خطا! چون age خصوصی است و دسترسی مستقیم ممکن نیست.
        s.setAge(25);   // روش صحیح تغییر از طریق setter
        System.out.println(s.getName() + " is " + s.getAge() + " years old.");
    }
}



همانطور که می‌بینید، فیلد age خصوصی (private) است و تنها از طریق متد setAge() قابل تغییر است.

این به ما اجازه می‌دهد در متد setter منطق اعتبارسنجی قرار دهیم و از وارد شدن سن نامعتبر جلوگیری کنیم .

  • وراثت (Inheritance)

    وراثت مکانیسمی است که به یک کلاس اجازه می‌دهد ویژگی‌ها و متدهای یک کلاس دیگر را به ارث ببرد .
    کلاسی که از آن ارث برده می‌شود، کلاس پایه (Parent or Superclass) و کلاسی که ارث می‌برد، کلاس مشتق‌شده (Child or Subclass) نامیده می‌شود.
    در جاوا برای پیاده‌سازی وراثت از کلمه کلیدی extends استفاده می‌شود .

چرا وراثت مهم است؟

    • استفاده مجدد از کد (Code Reusability)

      می‌توانید ویژگی‌ها و رفتارهای مشترک را در یک کلاس پایه قرار داده و در کلاس‌های فرزند بدون نیاز به تکرار مجدد از آن‌ها استفاده کنید .
    • ایجاد سلسله مراتب

      وراثت به شما امکان می‌دهد رابطه "هست یک" (is-a) را بین مفاهیم مدل‌سازی کنید. به عنوان مثال، "اتومبیل" یک نوع "وسیله نقلیه" است.
    • چندریختی

      وراثت زیربنای اصلی چندریختی را فراهم می‌کند.

مثال وراثت در جاوا:

فرض کنید کلاس پایه Vehicle را داریم:

public class Vehicle {
    protected String brand = "Generic Vehicle"; // protected به کلاس‌های فرزند اجازه دسترسی می‌دهد

    public void honk() {
        System.out.println("Beep! Beep!");
    }
}
حالا کلاس Car را با استفاده از extends از Vehicle مشتق می‌کنیم:

java
public class Car extends Vehicle {
    private String modelName = "Mustang"; // ویژگی خاص خودش

    public static void main(String[] args) {
        Car myCar = new Car();

        // فراخوانی متد honk از کلاس پایه (Vehicle)
        myCar.honk();

        // استفاده از ویژگی brand از کلاس پایه
        System.out.println(myCar.brand + " " + myCar.modelName);
    }
}
// خروجی:
// Beep! Beep!
// Generic Vehicle Mustang



در این مثال، کلاس Car تمام اعضای Vehicle (مانند honk()) را به ارث برده است، بدون اینکه نیازی به تعریف مجدد آن‌ها باشد.

همچنین ویژگی خاص خود، modelName را نیز دارد .

در وراثت، یک کلاس فرزند می‌تواند متدهای به ارث‌رسیده را تغییر دهد (اصطلاحاً Override کند) که به مبحث چندریختی مرتبط است .

  •  چندریختی (Polymorphism)

    چندریختی (چندشکلی) به معنای "دارای اشکال متعدد" است.
    در برنامه‌نویسی، چندریختی به یک شیء اجازه می‌دهد تا در موقعیت‌های مختلف، رفتارهای متفاوتی از خود نشان دهد .
    به عبارت ساده‌تر، یک عمل می‌تواند به روش‌های مختلفی انجام شود .

انواع چندریختی در جاوا:

    • Override کردن متد (Runtime Polymorphism)

      زمانی که یک کلاس فرزند، متدی را که از کلاس پایه به ارث برده است، دوباره پیاده‌سازی می‌کند.
    • Overload کردن متد (Compile-time Polymorphism)

      زمانی که چندین متد با یک نام، اما با پارامترهای متفاوت (تعداد یا نوع) در یک کلاس داشته باشیم.

 

انواع چندریختی در جاوا

 

 

 

چرا چندریختی مهم است؟

    • انعطاف‌پذیری و قابلیت توسعه

      می‌توانید کدهایی بنویسید که با اشیاء کلاس‌های پایه کار کنند و در زمان اجرا، متد مربوط به کلاس فرزند اجرا شود.
      این امر افزودن کلاس‌های جدید را بسیار آسان می‌کند.
    • یکپارچگی

      یک رابط واحد (مثلاً یک متد) می‌تواند برای انواع مختلف داده‌ها یا اشیاء استفاده شود.

مثال چندریختی (Override کردن متد):

// کلاس پایه Animal
public class Animal {
    public void animalSound() {
        System.out.println("The animal makes a sound");
    }
}

// کلاس فرزند Cat
public class Cat extends Animal {
    @Override
    public void animalSound() {
        System.out.println("The cat says: Meow Meow");
    }
}

// کلاس فرزند Dog
public class Dog extends Animal {
    @Override
    public void animalSound() {
        System.out.println("The dog says: Bow Wow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal(); // یک شیء از کلاس Animal
        Animal myCat = new Cat();       // یک ارجاع از نوع Animal، اما شیء از نوع Cat
        Animal myDog = new Dog();       // یک ارجاع از نوع Animal، اما شیء از نوع Dog

        myAnimal.animalSound(); // خروجی: The animal makes a sound
        myCat.animalSound();    // خروجی: The cat says: Meow Meow
        myDog.animalSound();    // خروجی: The dog says: Bow Wow
    }
}


همانطور که مشاهده می‌کنید، هر سه متغیر از نوع Animal هستند، اما متد animalSound() که روی آن‌ها فراخوانی می‌شود، بسته به نوع شیء حقیقی (Animal, Cat, Dog) رفتار متفاوتی از خود نشان می‌دهد.

این همان چندریختی است .

  • انتزاع (Abstraction)

    انتزاع به معنای پنهان‌سازی پیچیدگی‌های پیاده‌سازی و نمایش تنها قابلیت‌های ضروری یک شیء به کاربر است .
    شما با یک رابط ساده کار می‌کنید و نیازی ندارید بدانید که در پشت صحنه چه می‌گذرد.
    یک مثال خوب در دنیای واقعی، پدال گاز ماشین است.
    شما با فشردن آن، سرعت ماشین را افزایش می‌دهید، اما از جزئیات پیچیده‌ای مانند تنظیم میزان سوخت، باز شدن دریچه هوا و ... بی‌خبرید.

طریق پیاده‌سازی انتراع در جاوا:

    • کلاس‌های انتزاعی (Abstract Classes)

    • واسط‌ها (Interfaces)

 

طریق پیاده‌سازی انتراع در جاوا

 

چرا انتزاع مهم است؟

    • کاهش پیچیدگی

      کاربر با یک رابط ساده سر و کار دارد و از جزئیات داخلی بی‌نیاز می‌شود.
    • افزایش امنیت

      جزئیات پیاده‌سازی پنهان می‌شوند.
    • قابلیت تعویض

      می‌توانید پیاده‌سازی داخلی یک متد را به طور کامل تغییر دهید، بدون آنکه بر روی کدهایی که از آن متد استفاده می‌کنند تأثیری بگذارد.

مثال انتزاع با واسط (Interface):

یک interface به نام Shape تعریف می‌کنیم که فقط یک متد انتزاعی (بدون بدنه) به نام getArea() دارد.

 

// تعریف یک واسط (Interface)
interface Shape {
    double getArea(); // متد انتزاعی - بدون بدنه
}
// کلاس Rectangle این واسط را پیاده‌سازی می‌کند
class Rectangle implements Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double getArea() {
        return length * width;
    }
}

// کلاس Circle این واسط را پیاده‌سازی می‌کند
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape myRectangle = new Rectangle(5, 4);
        Shape myCircle = new Circle(3);

        System.out.println("Area of Rectangle: " + myRectangle.getArea());
        System.out.println("Area of Circle: " + myCircle.getArea());
    }
}


در این مثال، ما یک قرارداد (Shape) تعریف کرده‌ایم که می‌گوید "هر کلاسی که Shape است، باید بتواند مساحت خود را محاسبه کند (getArea)".

نحوه محاسبه مساحت به خود کلاس‌ها (Rectangle و Circle) واگذار شده است. ما در main فقط با واسط Shape کار می‌کنیم و از جزئیات پیاده‌سازی بی‌خبریم .

 

چهار اصل اساسی شی‌گرایی (OOP Pillars)

 

نتیجه‌گیری

برنامه‌نویسی شی‌گرا در جاوا، رویکردی قدرتمند و استاندارد برای توسعه نرم‌افزارهای مدرن است.

با درک صحیح مفاهیم کلاس و شیء و به کارگیری چهار اصل اساسی آن یعنی کپسوله‌سازی، وراثت، چندریختی و انتزاع، می‌توانید کدهایی بنویسید که:

  • خواناتر و خوش‌ساختارتر باشند.
  • قابلیت استفاده مجدد بالایی داشته باشند.
  • به راحتی قابل توسعه و نگهداری باشند.
  • از امنیت و انعطاف‌پذیری بیشتری برخوردار باشند.

تسلط بر OOP گامی حیاتی برای هر برنامه‌نویس جاوا است و شالوده اصلی بسیاری از الگوها و چارچوب‌های طراحی (Design Patterns & Frameworks) را تشکیل می‌دهد.

 

دوره های مرتبط
آموزش java,آموزش برنامه نویسی جاوا,آموزش برنامه نویسی java,آموزش زبان برنامه نویسی جاوا

آموزش برنامه نویسی Java

Java یکی از زبان های شی گرایی قوی در عرصه تولید نرم افزار های بانکی و امنیتی به شمار می رود.

1,500,000 تومان

1.9k بازدید

ارسال دیدگاه

برای ارسال نظر لطفا ورود یا ثبت نام کنید.