CodeGym /בלוג Java /Random-HE /שיעורי Java: כתיבת שיעורים משלך, בנאים
John Squirrels
רָמָה
San Francisco

שיעורי Java: כתיבת שיעורים משלך, בנאים

פורסם בקבוצה
היי! היום נדבר על שיעורים בג'אווה. אפשר לומר ששיעורים מהווים את אבן הפינה של תכנות Java. כשאתה הופך למתכנת, כמעט כל העבודה שלך תהיה כתיבת שיעורים משלך שיש להם פונקציות שונות. בוא נראה מה זה אומר ואיך זה עובד. :) כידוע, Java היא שפת תכנות מונחה עצמים. כל התוכנות מורכבות מאובייקטים שבדרך זו או אחרת קשורים זה לזה. מחלקה היא, בעצם, תבנית לאובייקט. הוא קובע איך האובייקט ייראה ואילו פונקציות יהיו לו. כל אובייקט הוא אובייקט של מחלקה כלשהי. שקול את הדוגמה הפשוטה הזו:

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 עכשיו לכיתה שלנו יש משתנה חדש שנקרא ספירה. הוא אחראי לספירת החתולים שנוצרו. בכל פעם שאנו יוצרים חתול בשיטה הראשית , אנו מגדילים את המשתנה הזה ב-1. משתנה זה מוצהר באמצעות מילת המפתח static. זה אומר שהוא שייך למחלקה, לא לאובייקט ספציפי של המחלקה. וזה כמובן הגיוני: השם של כל חתול שייך לחתול הספציפי הזה, אבל אנחנו צריכים מונה חתול אחד שמתאים לכולם. זה בדיוק מה שמילת המפתח סטטית משיגה: היא הופכת את משתנה הספירה למשתנה יחיד עבור כל החתולים. הערה: כאשר אנו מציגים את המשתנה, אנו לא משתמשים ב-smudge.count או fluffy.count. זה לא שייך לא לסמדג' ולא לפלאפי; זה שייך לכל מחלקת החתולים . לכן זה פשוט לספור. אתה יכול גם לכתוב 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() . אבל, כפי שאתם אולי זוכרים, השיטה העיקרית היא סטטית, כלומר היא שייכת לכל המחלקה (ההיגיון זהה לזה של משתנים). עם זאת, ניתן לקרוא לשיטות סטנדרטיות שאינן סטטיות רק על אובייקטים ספציפיים שיצרנו. לדוגמה, אם ברצוננו לכתוב כיתת חתולים, עלינו לדעת אילו פונקציות אמורות להיות לחתול בתוכנית שלנו. בהנחה זו, בואו נכתוב כמה שיטות לחתול שלנו:

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();

    }
}
תבדוק את זה! עכשיו הכיתה שלנו הרבה יותר קרובה להידמות לחתול! עכשיו אין לנו רק חתול עם שם ("מריחה") וגיל (3). הוא גם יכול להגיד מיאו וקפוץ! איזה סוג של חתול זה יהיה בלי ה"פונקציונליות" הזו? :) אנחנו לוקחים אובייקט ספציפי (סמיך) וקוראים לשיטות sayMeow() ו- jump() שלו. בואו נסתכל על הקונסולה: מיאו! לְזַנֵק! חתול אמיתי! :)

יצירת שיעורים משלך. הַפשָׁטָה

בעתיד, תצטרך לכתוב שיעורים משלך. ממה אתה צריך לשים לב כשאתה כותב אותם? אם אנחנו מדברים על משתנים, אז תצטרך לעשות שימוש במשהו שנקרא הפשטה. הפשטה היא אחד מארבעת העקרונות הבסיסיים של תכנות מונחה עצמים. זה אומר לחלץ את המאפיינים החשובים והמשמעותיים ביותר של פריט, ולהיפך, לזרוק את אלה מינוריים או חסרי משמעות. למשל, בואו ניצור ארון תיוק לעובדי החברה. כדי ליצור אובייקטים של עובדים, כתבנו כיתת Employee . אילו מאפיינים הם מתארים חשובים של עובד עבור ארון התיוק של החברה שלנו? שם, תאריך לידה, SSN ומזהה עובד. אבל לא סביר שנזדקק לגובה, צבע עיניים או צבע שיער של העובד לתיעוד העובדים של החברה. חברות לא צריכות את המידע הזה. לכן, במחלקת Employee , אנו מצהירים על המשתנים הבאים: String name , int age , int socialSecurityNumber ו- int employeeId . ואנחנו משאירים מידע מיותר (כמו צבע עיניים). במילים אחרות, אנו יוצרים הפשטה. עם זאת, אם אנחנו מכינים ארון תיוק לסוכנויות דוגמנות, המצב משתנה באופן דרמטי. גובה, צבע עיניים וצבע שיער של דוגמנית הם מאפיינים חשובים, אבל ה-SSN שלה ממש לא רלוונטי עבורנו. אז, במחלקה Model , אנחנו צריכים ליצור את המשתנים הבאים: גובה מחרוזת , שיער מחרוזת , עיניים מחרוזת . כך עובדת הפשטה - זה קל! :)

בונים

בוא נחזור לדוגמה החתול שלנו.

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";

    }
}
עיין בקוד הזה ונסה להבין מה לא בסדר בתוכנית שלנו. לתוכנית שלנו היה חתול ללא שם או גיל במשך שעתיים! כמובן, זה שגוי מטבעו. המאגר של המרפאה הווטרינרית לא אמור לכלול חתולים ללא מידע. נכון לעכשיו, החתול שלנו נתון לחסדי המתכנת. אנו סומכים על כך שהוא לא ישכח לציין שם וגיל, ושהכל יהיה בסדר. אם הוא ישכח, למאגר תהיה בעיה: חתולים ללא שם. כיצד נוכל לפתור את הבעיה הזו? עלינו איכשהו למנוע מחתולים להיווצר ללא שם וגיל. זה המקום שבו בנאים באים להציל. בוא ניתן דוגמה:

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 , עבור כל אובייקט חתול . אם ננסה ליצור חתול חסר שם עכשיו, זה לא יעבוד.

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!
    }
}
עכשיו שלמחלקה יש בנאי, מהדר Java יודע איך האובייקטים צריכים להיראות, ולא מאפשר ליצור אובייקטים מבלי לציין את הארגומנטים. כעת, בוא נחקור את מילת המפתח זה, שאתה רואה בתוך הבנאי. זה גם פשוט. מילת המפתח זו מיועדת לציון אובייקט מסוים. הקוד בקונסטרוקטור

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);
    }
}
פלט מסוף: כתם 5 כאשר הקונסטרוקטור נקרא:

Cat smudge = new Cat("Smudge", 5);
זה מה שקרה בפועל בפנים:

this.name = "Smudge";
this.age = 5;
והערכים של הארגומנטים שהועברו לבנאי הוקצו לאובייקט הכתם (לשם זה מתייחס במקרה הזה). למעשה, גם אם לא תכריז על בנאים במחלקה, הוא עדיין יקרא בנאי! אבל איך זה אפשרי? О_О מכיוון שלכל מחלקות Java יש מה שנקרא בנאי ברירת מחדל. זה לא דורש שום טיעונים, אבל זה מופעל בכל פעם שאתה יוצר אובייקט כלשהו מכל מחלקה.

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();
    }
}
כעת, לאחר שציינו בנאי ברירת מחדל מפורש, אנו יכולים ליצור את שני סוגי החתולים. בקונסטרוקטור, אתה יכול להקצות ערכים ישירות. אתה לא צריך לקחת אותם תמיד מוויכוחים. לדוגמה, נוכל לתייג את כל חתולי הרחוב במסד הנתונים באמצעות "מספר חתול רחוב <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, "אצטקים").
    עבור הסוג השלישי, אנו יודעים את המספר הסידורי, התרבות שיצרה אותו, והמאה שבה הוא נוצר (לדוגמה: 212121, "אצטקים", 12).

    צור כיתת Artifact המתארת ​​את העתיקות השמורה במוזיאון, וכתוב את סט הבנאים הנדרש עבור הכיתה. לאחר מכן, בשיטת main() , צור חפץ אחד מכל סוג.

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
  2. אתר היכרויות

    בואו ניצור מאגר משתמשים לאתר היכרויות.
    אבל הנה הבעיה: שכחת את הסדר הנדרש של הטיעונים, ואין תיעוד טכני זמין.
    עצב מחלקת משתמש , שתכלול את השדות הבאים: שם ( מחרוזת ), גיל ( קצר ) וגובה ( int ).
    צור את המספר המתאים של בנאים, כך שניתן לציין את השם, הגיל והגובה בכל סדר.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
כדי לחזק את מה שלמדת, אנו מציעים לך לצפות בשיעור וידאו מקורס Java שלנו
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION