CodeGym /وبلاگ جاوا /Random-FA /کلاس های جاوا: نوشتن کلاس های خود، سازنده ها
John Squirrels
مرحله
San Francisco

کلاس های جاوا: نوشتن کلاس های خود، سازنده ها

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

    String name;
    int age;

}
فرض کنید در حال نوشتن برنامه ای هستیم که به دلایلی شامل گربه ها می شود (به عنوان مثال، ما یک کلینیک دامپزشکی داریم که دسترسی به یک حساب آنلاین را ارائه می دهد). ما یک کلاس Cat ایجاد کرده‌ایم و دو متغیر را در آن اعلام کرده‌ایم: نام رشته و int age . این متغیرهای عضو فیلد نامیده می شوند. در اصل، این یک الگو برای همه گربه هایی است که در آینده ایجاد خواهیم کرد. هر شی Cat دو متغیر خواهد داشت: نام و سن.
public class Cat {

    String name;
    int age;

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

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

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

    String name;
    int age;

    static int count = 0;

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

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
خروجی کنسول: ما یک گربه به نام Smudge ایجاد کردیم. سن او 3 سال است ما گربه ای به نام فلافی ایجاد کردیم. سن او 5 است تعداد کل گربه ها = 2 حالا کلاس ما یک متغیر جدید به نام count دارد. این مسئول شمارش گربه های ایجاد شده است. هر بار که در روش main یک cat ایجاد می کنیم ، این متغیر را 1 افزایش می دهیم. این متغیر با استفاده از کلمه کلیدی static اعلام می شود. به این معنی که متعلق به کلاس است، نه به یک شی خاص از کلاس. که البته منطقی است: نام هر گربه متعلق به آن گربه خاص است، اما ما به یک گربه شمارنده نیاز داریم که برای همه آنها اعمال شود. این دقیقاً همان چیزی است که کلمه کلیدی static انجام می دهد: متغیر تعداد را به یک متغیر واحد برای همه گربه ها تبدیل می کند. توجه: وقتی متغیر را نمایش می دهیم، از smudge.count یا fluffy.count استفاده نمی کنیم. به Smudge یا Fluffy تعلق ندارد. متعلق به کل کلاس Cat است . به همین دلیل است که به سادگی حساب می شود. شما همچنین می توانید Cat.count را بنویسید. این نیز صحیح خواهد بود. هنگام نمایش متغیر نام، کارهای زیر را انجام نمی دهیم:
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

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

مواد و روش ها

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

    String name;
    int age;

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

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

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

        smudge.sayMeow();
        smudge.jump();

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

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

در آینده، شما باید کلاس های خود را بنویسید. هنگام نوشتن آنها باید به چه نکاتی توجه کنید؟ اگر در مورد متغیرها صحبت می کنیم، باید از چیزی به نام انتزاع استفاده کنید. انتزاع یکی از چهار اصل اساسی برنامه نویسی شی گرا است. به معنای استخراج مهم ترین و مهم ترین ویژگی های یک کالا و بالعکس کنار گذاشتن آن هایی است که جزئی یا بی اهمیت هستند. به عنوان مثال، بیایید یک کابینت بایگانی برای کارمندان شرکت ایجاد کنیم. برای ایجاد اشیاء کارمند، یک کلاس Employee نوشته ایم . توصیفگرهای مهم یک کارمند برای کابینت بایگانی شرکت ما چه ویژگی هایی هستند؟ نام، تاریخ تولد، SSN و شناسه کارمند. اما بعید است برای سوابق کارمندان شرکت به قد، رنگ چشم یا رنگ موی کارمند نیاز داشته باشیم. شرکت ها به این اطلاعات نیاز ندارند. بنابراین، در کلاس Employee ، متغیرهای زیر را اعلام می‌کنیم: String name ، int age ، int socialSecurityNumber و int staffId . و اطلاعات غیر ضروری (مانند رنگ چشم) را کنار می گذاریم. به عبارت دیگر ما یک انتزاع ایجاد می کنیم. با این حال، اگر ما یک کابینت بایگانی برای آژانس های مدلینگ بسازیم، وضعیت به طرز چشمگیری تغییر می کند. قد، رنگ چشم و رنگ موی یک مدل ویژگی های مهمی هستند، اما SSN او کاملاً برای ما بی ربط است. بنابراین، در کلاس Model ، باید متغیرهای زیر را ایجاد کنیم: String height ، String hair ، string eyes . به این ترتیب انتزاع کار می کند - آسان است! :)

سازندگان

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

    String name;
    int age;

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

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

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

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
اساساً سازنده یک الگو برای اشیاء یک کلاس است. در این مورد، نشان می‌دهیم که دو آرگومان، یک String و یک int ، باید برای هر شی 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 smudge = new Cat(); // Error!
    }
}
اکنون که کلاس سازنده دارد، کامپایلر جاوا می‌داند که اشیاء باید چگونه باشند و اجازه نمی‌دهد بدون تعیین آرگومان‌ها، اشیاء ایجاد شوند. حالا بیایید کلمه کلیدی this را که در داخل سازنده می بینید بررسی کنیم. این هم ساده است. کلمه کلیدی this برای نشان دادن یک شی خاص است. کد موجود در سازنده
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
را می توان تقریباً کلمه به کلمه تفسیر کرد: "نام این گربه (آنی که ما ایجاد می کنیم) = آرگومان ارسال شده برای پارامتر نام سازنده. پارامتر سن." پس از اجرای سازنده، می توانید تأیید کنید که تمام مقادیر لازم به گربه ما اختصاص داده شده است:
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 smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
خروجی کنسول: Smudge 5 هنگامی که سازنده فراخوانی شد:
Cat smudge = new Cat("Smudge", 5);
این چیزی است که در داخل اتفاق افتاده است:
this.name = "Smudge";
this.age = 5;
و مقادیر آرگومان های ارسال شده به سازنده به شی smudge اختصاص داده شد (این چیزی است که در این مورد به آن اشاره دارد). در واقع، حتی اگر هیچ سازنده ای را در یک کلاس اعلان نکنید، باز هم سازنده را فراخوانی می کند! اما چگونه ممکن است؟ О_О زیرا، تمام کلاس های جاوا یک سازنده به اصطلاح پیش فرض دارند. هیچ آرگومان نمی گیرد، اما هر بار که هر شیء از هر کلاسی را ایجاد می کنید، فراخوانی می شود.
public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
در نگاه اول، این ممکن است واضح نباشد. ما یک شی ایجاد کردیم، پس چه؟ سازنده کجا در اینجا کاری انجام می دهد؟ برای دیدن آن، بیایید به صراحت یک سازنده خالی برای کلاس Cat بنویسیم . در داخل آن، عبارتی را به کنسول خروجی خواهیم داد. اگر عبارت نمایش داده شود، سازنده فراخوانی شده است.
public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
خروجی کنسول: یک گربه ایجاد شد! اونجا تاییدیه سازنده پیش فرض همیشه به صورت نامرئی در کلاس های شما وجود دارد. اما باید یک چیز دیگر در مورد آن بدانید. هنگامی که سازنده ای با آرگومان ایجاد کنید، سازنده پیش فرض از یک کلاس حذف می شود. در واقع، ما قبلاً شاهد این موضوع در بالا بودیم. در این کد بود:
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 smudge = new Cat(); // Error!
    }
}
ما نمی‌توانستیم یک Cat بدون نام و سن ایجاد کنیم، زیرا سازنده Cat را با پارامترهای رشته و int اعلام کردیم. این باعث شد که سازنده پیش فرض بلافاصله از کلاس ناپدید شود. بنابراین حتما به خاطر داشته باشید که اگر به چندین سازنده در کلاس خود نیاز دارید، از جمله سازنده بدون آرگومان، باید آن را جداگانه اعلام کنید. کلینیک ما می خواهد کارهای خیر انجام دهد و به بچه گربه های بی خانمانی که نام و سن آنها مشخص نیست کمک کند. سپس کد ما باید به شکل زیر باشد:
public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
اکنون که یک سازنده پیش فرض صریح را مشخص کرده ایم، می توانیم هر دو نوع cat را ایجاد کنیم. در سازنده، می توانید مقادیر را مستقیماً اختصاص دهید. شما مجبور نیستید همیشه آنها را از بحث و جدل بگیرید. برای مثال، ما می‌توانیم همه گربه‌های خیابانی در پایگاه داده را با استفاده از "شماره گربه خیابانی <count>" به عنوان یک الگو برچسب‌گذاری کنیم. :
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + 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);
    }
}
ما یک متغیر تعداد داریم که گربه های خیابانی ما را می شمارد. هر بار که سازنده پیش فرض اجرا می شود، تعداد را 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 smudge = new Cat("Smudge", 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;
}
این دو سازنده کاملاً متفاوت هستند! اکنون، چند کار را تکمیل کنید تا درک خود را از مطالب تقویت کنید. :)
  1. موزه آثار باستانی.

    وظیفه شما طراحی یک کلاس Artifact است .
    سه نوع اثر در این موزه نگهداری می شود.
    ما هیچ چیز در مورد نوع اول نمی دانیم به جز شماره سریال اختصاص داده شده توسط موزه (به عنوان مثال: 212121).
    برای نوع دوم، ما شماره سریال و فرهنگی را می‌دانیم که آن را ایجاد کرده است (به عنوان مثال: 212121، "Aztecs").
    برای نوع سوم، شماره سریال، فرهنگی که آن را ایجاد کرده است و قرنی که در آن ایجاد شده است را می دانیم (به عنوان مثال: 212121، "Aztecs"، 12).

    یک کلاس Artifact ایجاد کنید که آثار باستانی نگهداری شده در موزه را توصیف کند و مجموعه سازنده های مورد نیاز کلاس را بنویسید. سپس در متد main() از هر نوع یک آرتیفکت ایجاد کنید.

    public class Artifact {
    
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
  2. سایت همسر یابی

    بیایید یک پایگاه داده کاربر برای یک وب سایت دوستیابی ایجاد کنیم.
    اما مشکل اینجاست: شما ترتیب مورد نیاز آرگومان ها را فراموش کرده اید و هیچ مستند فنی در دسترس نیست.
    یک کلاس User طراحی کنید که دارای فیلدهای زیر باشد: name ( String )، age ( short ) و height ( int ).
    تعداد مناسب سازنده را ایجاد کنید، به طوری که نام، سن و قد را بتوان به هر ترتیبی مشخص کرد.

    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
    
        }
    }
برای تقویت آموخته هایتان، پیشنهاد می کنیم یک درس ویدیویی از دوره جاوا ما تماشا کنید
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION