JavaRush /בלוג Java /Random-HE /מבוא לשיעורים: כתיבת שיעורים משלך, בנאים

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

פורסם בקבוצה
שלום! היום נדבר על שיעורים בג'אווה. ניתן לומר כי שיעורים הם הליבה של תכנות Java. כאשר אתה הופך למתכנת, המשימה העיקרית שלך תהיה לכתוב שיעורים משלך עם פונקציונליות שונה. מבוא לשיעורים: כתיבת שיעורים משלך, בנאים - 1בואו להבין מה זה הדבר הזה ואיך זה עובד :) כפי שאתם כבר יודעים, Java היא שפת תכנות מונחה עצמים. כל התוכניות מורכבות מאובייקטים הקשורים איכשהו זה לזה. מחלקה היא בעצם תבנית לאובייקט. הוא קובע איך אובייקט ייראה ואילו פונקציות יהיו לו. כל אובייקט הוא אובייקט של מחלקה כלשהי . בואו נסתכל על הדוגמה הפשוטה ביותר:
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(כמות). היא אחראית לספירת החתולים שנוצרו. בכל פעם שאנו יוצרים חתול בשיטה הראשית, אנו מגדילים את המשתנה הזה ב-1. משתנה זה מוגדר על ידי מילת המפתח הסטטית . זה אומר שהוא שייך למחלקה ולא לאובייקט ספציפי של המחלקה. וזה, כמובן, הגיוני: אם לכל חתול צריך להיות שם משלו, אז אנחנו צריכים מונה חתולים אחד לכולם. זה בדיוק מה שהמילה סטטית מאפשרת לך להשיג - 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נגדיר את המשתנים String name, int age, int socialInsuranceNumberו int taxNumberונזנח מידע מיותר עבורנו (כגון צבע עיניים) ונפשט אותו . אבל אם ניצור קובץ של דוגמניות צילום עבור סוכנות דוגמנות, המצב משתנה באופן דרמטי. לתיאור דוגמנית אופנה חשובים לנו מאוד גובה, צבע עיניים וצבע שיער, אבל מספר ה-TIN ממש לא חשוב לנו. לכן, במחלקה Modelעלינו ליצור משתנים int height, String hair, String 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!
    }
}
עכשיו שלמחלקה יש בנאי, מהדר Java יודע איך האובייקטים צריכים להיראות ולא מאפשר ליצור אובייקטים ללא הארגומנטים שצוינו בו. כעת נסתכל על מילת המפתח 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 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 העובדה היא שב-Java לכל המחלקות יש מה שנקרא בנאי ברירת מחדל . אין לו טיעונים, אבל הוא נורה בכל פעם שנוצר אובייקט כלשהו מכל מחלקה.
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: מחרוזת + מספר. בנאי ברירת המחדל נעלם מהמחלקה מיד לאחר מכן. לכן, הקפד לזכור: אם אתה צריך כמה בנאים בכיתה שלך, כולל אחד ריק, עליך ליצור אותו בנפרד . כך למשל, המרפאה הווטרינרית שלנו רוצה לעשות מעשים טובים ולעזור לחתולים חסרי בית, שאיננו יודעים את שמם וגילם. אז הקוד שלנו אמור להיראות כך:
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();
    }
}
כעת, לאחר שציינו במפורש בנאי ברירת מחדל, אנו יכולים ליצור את שני סוגי החתולים. בקונסטרוקטור, אתה יכול להקצות ערכים באופן מפורש, ולא רק לקחת אותם מהארגומנטים. לדוגמה, אנו יכולים לתעד את כל חתולי הרחוב במסד נתונים תחת השם "מספר חתול רחוב...":
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, "אצטקים"). הסוג השלישי הוא שעליו ידוע המספר הסידורי, התרבות שלפיה הוא נוצר והגיל המדויק של יצירתו (לדוגמה: 212121, "אצטקים", 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