JavaRush /בלוג Java /Random-HE /שאלה ותשובה: האם ניתן להגדיר שיטות מופשטות בשיעור אחרון?

שאלה ותשובה: האם ניתן להגדיר שיטות מופשטות בשיעור אחרון?

פורסם בקבוצה
השאלה המעניינת והחשובה הזו נשאלה לאחד הקוראים שלי במהלך ראיון טלפוני לתפקיד מפתח Java. למרות שהוא ידע שאי אפשר לעשות שיעור מופשט finalבשפת ג'אווה , הוא היה מבולבל מניסוח השאלה. התשובה פשוטה: לא, finalלא יכולות להיות שיטות מופשטות ב-class. למה? כי ברגע שאתה מכריז על מתודה אבסטרקטית במחלקה של שפת Java, המחלקה הזו הופכת אוטומטית למופשטת, ואי finalאפשר לעשות מחלקה אבסטרקטית בשפת Java. finalזה אומר שלא יכולות להיות שיטות מופשטות ב- Java -class.
שאלה ותשובה: האם ניתן להגדיר שיטות מופשטות בשיעור אחרון?  - 1
מפתחי Java רבים מתבלבלים כשהם עונים על שאלה זו בגלל הניסוח. גם אם האדם ששאל את השאלה מכיר את המושג הכללי, ייתכן שהוא לא יבין שמחלקה, לאחר שהכריזה בה על שיטה מופשטת, הופכת למופשטת, ואי אפשר finalליצור מחלקה מופשטת בג'אווה. נקודה זו מפרידה בין השאלה הזו לבין השאלה הנפוצה והנפוצה יותר: האם ניתן בג'אווה להכריז על מחלקה כמופשטת וסופית בו זמנית? הבה נסתכל על קוד אחד לדוגמה כדי להדגים finalשלא ניתן להכריז על שיטה מופשטת ב--class. תנו Hello.javaלנו public finalמחלקה בשם Hello, שיש לה שיטה מופשטת print().
public final class Hello {
  public abstract void print();
}
הקלידו את הקוד הזה ב-IDE, תקבלו את הודעת השגיאה הבאה, הם אומרים Helloשזה חייב להיות מחלקה אבסטרקטית כדי שניתן יהיה להכריז בו על שיטות מופשטות.
שאלה ותשובה: האם ניתן להגדיר שיטות מופשטות בשיעור אחרון?  - 2
שאלה ותשובה: האם ניתן להגדיר שיטות מופשטות בשיעור אחרון?  - 3
אותו דבר יקרה אם תקליד את הקוד הזה בפנקס רשימות ותרכיב אותו באמצעות כלי השירות javac משורת הפקודה. לפי מפרטי Java, ברגע שאתה מכריז על מתודה אבסטרקטית בתוך מחלקה, המחלקה הופכת למחלקה אבסטרקטית, ומכיוון שאינך finalיכול לעשות מחלקה אבסטרקטית ב-Java, המהדר יפיק שגיאה. זה נכון גם למחלקות ברמה העליונה וגם למחלקות מקוננות בשפת Java. גם אם תכריז על שיטה מופשטת במחלקה מקוננת final, השגיאה תהיה זהה. שאלה קשורה נוספת היא: האם למחלקה מופשטת בג'אווה יש שיטות סטטיות? תשובה: כן, הם יכולים, אין בעיה להכריז על מתודה סטטית במחלקה אבסטרקטית, שכן כדי להשתמש בשיטה סטטית אין צורך ליצור מופע של המחלקה, ניתן לקרוא להן פשוט באמצעות שם המחלקה. אנו יכולים לשנות את הדוגמה שלנו כך שתכלול Helloשיטה במחלקה main(), שהיא סטטית ב-Java, כפי שמוצג להלן:
public abstract class Hello {
  public abstract void print();
  public static void main(String args[]) {
     // Howой-то code
  }
}
כפי שאתה יכול לראות, לא נזרקת שגיאת קומפילציה. קוד זה מתחבר ללא בעיות, מכיוון שב-Java אתה יכול להכריז בבטחה מלאה על שיטה סטטית במחלקה מופשטת. מסקנות קצרות אי אפשר להכריז על שיטה מופשטת ב- finalclass. מכיוון שברגע שאתה עושה זאת, המחלקה הופכת אוטומטית למופשטת, לפי מפרטי Java. ומכיוון finalש-class ב-Java לא יכול להיות מופשט, זה לא מקובל, והקומפיילר יאסור עליך לעשות זאת על ידי זריקת שגיאה. אבל אתה יכול להכריז על שיטות סטטיות גם במחלקות סופיות וגם בשיעורים מופשטים, אין עם זה בעיות.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION