JavaRush /وبلاگ جاوا /Random-FA /مقدمه ای بر کلاس ها: نوشتن کلاس های خود، سازنده ها

مقدمه ای بر کلاس ها: نوشتن کلاس های خود، سازنده ها

در گروه منتشر شد
سلام! امروز در مورد کلاس های جاوا صحبت خواهیم کرد. می توان گفت که کلاس ها هسته اصلی برنامه نویسی جاوا هستند. وقتی یک برنامه نویس می شوید، وظیفه اصلی شما نوشتن کلاس های خود با عملکردهای مختلف خواهد بود. مقدمه ای بر کلاس ها: نوشتن کلاس های خود، سازنده ها - 1بیایید بفهمیم این چیز چیست و چگونه کار می کند :) همانطور که قبلاً می دانید، جاوا یک زبان برنامه نویسی شی گرا است. همه برنامه ها از اشیایی تشکیل شده اند که به نوعی با یکدیگر مرتبط هستند. یک کلاس در اصل یک الگو برای یک شی است. تعیین می کند که یک شی چگونه به نظر می رسد و چه عملکردهایی دارد. هر شی یک شی از یک کلاس است . بیایید ساده ترین مثال را بررسی کنیم:
public class Cat {

    String name;
    int age;

}
فرض کنید در حال نوشتن یک برنامه هستیم و در این برنامه برای چیزی به گربه نیاز داریم (مثلاً یک کلینیک دامپزشکی با قابلیت گرفتن نوبت آنلاین داریم). ما یک کلاس ایجاد کردیم Catو دو متغیر برای آن تعیین کردیم - یک رشته nameو یک عدد age. چنین متغیرهای کلاس فیلد نامیده می شود . در اصل، این یک الگو برای همه گربه هایی است که در آینده ایجاد خواهیم کرد. هر گربه (شیء کلاس Cat) دو متغیر خواهد داشت - نام و سن.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
اینطوری کار میکنه! ما یک گربه ساختیم، نام و سن آن را گذاشتیم و همه آن را به کنسول منتقل کردیم. هیچ چیز پیچیده ای نیست :) کلاس ها اغلب اشیاء و پدیده های دنیای اطراف را توصیف می کنند. یک گربه، یک میز، یک شخص، رعد و برق، یک صفحه کتاب، یک چرخ - همه اینها با استفاده از کلاس های جداگانه در برنامه شما ایجاد می شود. حالا بیایید نگاهی به متغیرهایی که در کلاس ایجاد کردیم بیاندازیم Cat. به اینها فیلدها یا متغیرهای نمونه می گویند . نام، در واقع، تمام ماهیت آنها را آشکار می کند. هر نمونه (شیء) کلاس دارای این متغیرها خواهد بود Cat. nameهر گربه ای که ایجاد می کنیم متغیر و متغیر خودش را دارد age. به طور کلی منطقی است: با گربه های واقعی همه چیز یکسان است :) علاوه بر متغیرهای نمونه، متغیرهای دیگری نیز وجود دارد - متغیرهای کلاس یا ثابت. بیایید به مثال خود اضافه کنیم:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
خروجی کنسول:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
اکنون یک متغیر جدید در کلاس خود داریم - count(کمیت). او مسئول شمارش گربه های ایجاد شده است. هر بار که یک cat در روش اصلی ایجاد می کنیم، این متغیر را 1 افزایش می دهیم. این متغیر با کلمه کلیدی static مشخص می شود . این به این معنی است که متعلق به کلاس است و نه به یک شی خاص از کلاس. که البته منطقی است: اگر هر گربه باید نام خود را داشته باشد، پس برای همه به یک گربه شمار نیاز داریم. این دقیقاً همان چیزی است که کلمه استاتیک به شما امکان می دهد به آن دست پیدا کنید - countمتغیر یکسان برای همه گربه ها. لطفا توجه داشته باشید: وقتی آن را روی کنسول چاپ می کنیم، نمی نویسیم barsik.countیا vasia.count. او نه متعلق به بارسیک و نه به واسیا نیست - او متعلق به کل طبقه است Cat. بنابراین، ساده است count. شما همچنین می توانید بنویسید Cat.count- این نیز صحیح خواهد بود. این با خروجی یک متغیر به کنسول nameکار نمی کند :
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
خطا! nameهر گربه گربه خودش را دارد. اینجاست که کامپایلر گیج می شود. "نام را به کنسول خارج کنید؟ نام کیست؟ :/"

مواد و روش ها

علاوه بر متغیرها، هر کلاس متدهایی نیز دارد. ما در یک سخنرانی جداگانه با جزئیات بیشتر در مورد آنها صحبت خواهیم کرد، اما نکات کلی بسیار ساده است. متدها عملکرد کلاس شما هستند. آنچه که اشیاء این کلاس می توانند انجام دهند. شما قبلاً با یکی از روش ها آشنا هستید - این است main(). اما روش main، همانطور که به یاد دارید، ثابت است - یعنی به کل کلاس تعلق دارد (منطق مانند متغیرها است). و روش های معمولی و غیر استاتیک را فقط می توان بر روی اشیاء خاصی که ایجاد کرده ایم فراخوانی کرد. به عنوان مثال، اگر بخواهیم یک کلاس برای یک گربه بنویسیم، باید بدانیم که گربه باید چه کارکردهایی در برنامه ما داشته باشد. بر این اساس، اجازه دهید چند روش برای آن بنویسیم:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
خب، حالا کلاس ما خیلی بیشتر شبیه توصیف یک گربه واقعی است! حالا ما فقط یک گربه به نام بارسیک با نام و سن نداریم. او همچنین می تواند میومیو کند و بپرد! چه نوع گربه ای بدون چنین "کارکردی" وجود دارد :) ما یک شی خاص را می گیریم - barsikو روش های آن را می نامیم sayMeow()و jump(). ما به کنسول نگاه می کنیم:

Мяу!
Прыг-скок!
یک گربه واقعی! :)

ایجاد کلاس های خود انتزاع - مفهوم - برداشت

در آینده باید کلاس های خود را بنویسید. هنگام نوشتن آنها باید به چه نکاتی توجه کرد؟ اگر در مورد متغیرها صحبت می کنیم، باید از چیزی به نام انتزاع استفاده کنید . انتزاع یکی از چهار اصل اساسی برنامه نویسی شی گرا است. این شامل برجسته کردن اصلی ترین و مهم ترین ویژگی های یک شی و بالعکس - کنار گذاشتن ویژگی های ثانویه و بی اهمیت است. به عنوان مثال، ما در حال ایجاد پرونده ای از کارکنان شرکت هستیم. برای ایجاد اشیاء کارمند، یک کلاس نوشتیم Employee. چه ویژگی هایی برای توصیف یک کارمند در پرونده شرکت مهم است؟ نام کامل، تاریخ تولد، شماره تامین اجتماعی، شماره شناسایی مالیاتی. اما بعید است که ما به قد، رنگ چشم و موهای او در کارت یک کارمند شرکت نیاز داشته باشیم. شرکت به این اطلاعات نیاز ندارد. بنابراین، برای کلاس ، Employeeمتغیرهای ، و و را تنظیم می کنیم و اطلاعاتی را که برای ما غیر ضروری است (مانند رنگ چشم) کنار می گذاریم و آن را انتزاع می کنیم . اما اگر برای آژانس مدلینگ فایلی از مدل های عکس بسازیم، وضعیت به شدت تغییر می کند. برای توصیف یک مدل مد، قد، رنگ چشم و رنگ مو برای ما بسیار مهم است، اما شماره TIN مطلقاً برای ما مهم نیست. بنابراین در کلاس باید متغیرهای , , , را ایجاد کنیم . انتزاع اینگونه کار می کند، ساده است! :) String nameint ageint socialInsuranceNumberint taxNumberModelint heightString hairString eyes

سازندگان

بیایید به مثال گربه خود برگردیم.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
به این کد نگاه کنید و سعی کنید حدس بزنید مشکل برنامه ما چیست. دو ساعت در برنامه ما گربه ای بود که نام و سنی نداشت! البته این کاملا اشتباه است. هیچ گربه ای در پایگاه داده کلینیک دامپزشکی بدون اطلاعات در مورد آنها نباید وجود داشته باشد. حال آن را به عهده برنامه نویس می گذاریم. اگر فراموش نکند نام و سن خود را نشان دهد، همه چیز درست می شود. اگر او فراموش کند، یک خطا در پایگاه داده وجود دارد، گربه های ناشناخته. چگونه می توانیم این مشکل را حل کنیم؟ لازم است به نحوی ایجاد گربه های بدون نام و سن ممنوع شود. اینجاست که توابع سازنده به کمک ما می آیند . در اینجا یک مثال است:
public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
سازنده اساساً یک الگو برای اشیاء کلاس است. در این مورد، ما مشخص می کنیم که برای هر شی catباید دو آرگومان مشخص شود - یک رشته و یک عدد. اگر اکنون بخواهیم یک گربه بی نام بسازیم، موفق نخواهیم شد.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
اکنون که یک کلاس سازنده دارد، کامپایلر جاوا می داند که اشیاء باید چگونه باشند و اجازه نمی دهد که اشیا بدون آرگومان های مشخص شده در آن ایجاد شوند. حالا بیایید به کلمه کلیدی thisکه در داخل سازنده می بینید نگاه کنیم. با او هم همه چیز ساده است. "this" در انگلیسی به معنای "این، این" است. یعنی این کلمه بر شیئی خاص دلالت می کند. کد در سازنده
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
را می توان تقریباً تحت اللفظی ترجمه کرد: " name for this cat (که در حال ایجاد آن هستیم) = آرگومان نامی که در سازنده مشخص شده است. age for this cat (که در حال ایجاد آن هستیم) = آرگومان سنی که در سازنده مشخص شده است." پس از فعال شدن سازنده، می توانید بررسی کنید که به گربه ما تمام مقادیر لازم اختصاص داده شده است:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
خروجی کنسول:

Барсик
5
هنگامی که سازنده به پایان رسید:
Cat barsik = new Cat("Barsik", 5);
در واقع موارد زیر در داخل اتفاق افتاد:
this.name = "Barsik";
this.age = 5;
و به شی barsik(آن است this) مقادیری از آرگومان های سازنده اختصاص داده شد. در واقع، اگر سازنده ها را در کلاس مشخص نکنید، همچنان سازنده را فعال می کند ! ولی چطور این ممکن است؟ O_O واقعیت این است که در جاوا همه کلاس ها یک سازنده به اصطلاح پیش فرض دارند . هیچ آرگومان ندارد، اما هر بار که هر شیء از هر کلاس ایجاد می شود، فعال می شود.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
در نگاه اول این قابل توجه نیست. خوب، ما یک شی ایجاد کردیم و آن را ایجاد کردیم، کار طراح کجاست؟ برای دیدن این موضوع، بیایید Catیک سازنده خالی برای کلاس با دستان خود بنویسیم و در داخل آن عبارتی را به کنسول خروجی خواهیم داد. اگر نمایش داده شود، سازنده کار کرده است.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
خروجی کنسول:

Создали кота!
اینجا تاییدیه. سازنده پیش فرض همیشه به صورت نامرئی در کلاس های شما وجود دارد. اما باید یک ویژگی دیگر آن را بدانید. هنگامی که سازنده ای با آرگومان ایجاد می کنید، سازنده پیش فرض از کلاس ناپدید می شود. اثبات این، در واقع، ما قبلا در بالا دیده ایم. در اینجا در این کد:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
ما نمی‌توانستیم گربه‌ای بدون نام و سن بسازیم زیرا یک سازنده برای Cat: string + number تعریف کردیم. سازنده پیش فرض بلافاصله پس از این از کلاس ناپدید شد. بنابراین، حتما به خاطر داشته باشید: اگر به چندین سازنده در کلاس خود نیاز دارید، از جمله سازنده خالی، باید آن را جداگانه ایجاد کنید . به عنوان مثال، کلینیک دامپزشکی ما می خواهد کارهای خیر انجام دهد و به گربه های بی خانمانی که نام و سن آنها را نمی دانیم کمک کند. سپس کد ما باید به شکل زیر باشد:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
اکنون که به صراحت یک سازنده پیش فرض را مشخص کرده ایم، می توانیم هر دو نوع cat را ایجاد کنیم. در سازنده، می‌توانید مقادیر را به‌صراحت اختصاص دهید، نه اینکه آنها را فقط از آرگومان‌ها بگیرید. برای مثال، می‌توانیم همه گربه‌های خیابانی را در یک پایگاه داده با نام «شماره گربه خیابانی...» ثبت کنیم:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
ما یک متغیر داریم countکه یک شمارنده گربه خیابانی است. هر بار که سازنده پیش فرض را اجرا می کنیم، آن را 1 افزایش می دهیم و آن عدد را به عنوان نام گربه اختصاص می دهیم. برای یک سازنده، ترتیب آرگومان ها بسیار مهم است. بیایید آرگومان های نام و سن را در سازنده خود عوض کنیم.
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
خطا! سازنده به وضوح توضیح می دهد: هنگام ایجاد یک شی، Catباید یک عدد و یک رشته به آن ترتیب داده شود . به همین دلیل است که کد ما کار نمی کند. حتماً این را به خاطر داشته باشید و هنگام ایجاد کلاس های خود این را در نظر داشته باشید:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
این دو طراح کاملا متفاوت هستند! حالا چند مشکل را حل کنید تا مطالب را یکپارچه کنید :)
  • موزه آثار باستانی.
وظیفه شما طراحی کلاس است Artifact. آثار نگهداری شده در این موزه سه نوع است. اولی چیزی است که جز شماره سریال تعیین شده توسط موزه (مثلاً: 212121) چیزی در مورد آن مشخص نیست. دوم این است که شماره سریال و فرهنگی که توسط آن ایجاد شده است شناخته شده است (به عنوان مثال: 212121، "Aztecs"). نوع سوم این است که شماره سریال در مورد آن شناخته شده است، فرهنگی که توسط آن ایجاد شده است، و سن دقیق ایجاد آن (به عنوان مثال: 212121، "Aztecs"، 12). کلاسی ایجاد کنید Artifactکه آثار باستانی ذخیره شده در موزه را توصیف کند و تعداد سازنده لازم را برای آن بنویسید. در روش main()، از هر نوع یک آرتیفکت ایجاد کنید.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • وب سایت جلسه
شما در حال ایجاد یک پایگاه داده کاربران برای یک سایت دوستیابی هستید. اما مشکل اینجاست که شما فراموش کرده اید که به چه ترتیبی باید مشخص شوند و مشخصات فنی را در دست ندارید. کلاسی طراحی کنید Userکه دارای فیلدهای نام ( String)، سن ( short) و ارتفاع ( int) باشد. تعداد سازنده لازم برای آن ایجاد کنید تا نام، سن و قد به هر ترتیبی مشخص شود.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION