השאלה המעניינת והחשובה הזו נשאלה לאחד הקוראים שלי במהלך ראיון טלפוני לתפקיד מפתח Java. למרות שהוא ידע שאי אפשר
לעשות שיעור מופשט final
בשפת ג'אווה , הוא היה מבולבל מניסוח השאלה. התשובה פשוטה: לא,
final
לא יכולות להיות שיטות מופשטות ב-class. למה? כי ברגע שאתה מכריז על מתודה אבסטרקטית במחלקה של שפת Java, המחלקה הזו הופכת אוטומטית למופשטת, ואי
final
אפשר לעשות מחלקה אבסטרקטית בשפת Java.
final
זה אומר שלא יכולות להיות שיטות מופשטות ב- Java -class.
מפתחי Java רבים מתבלבלים כשהם עונים על שאלה זו בגלל הניסוח. גם אם האדם ששאל את השאלה מכיר את המושג הכללי, ייתכן שהוא לא יבין שמחלקה, לאחר שהכריזה בה על שיטה מופשטת, הופכת למופשטת, ואי אפשר
final
ליצור מחלקה מופשטת בג'אווה. נקודה זו מפרידה בין השאלה הזו לבין השאלה הנפוצה והנפוצה יותר:
האם ניתן בג'אווה להכריז על מחלקה כמופשטת וסופית בו זמנית? הבה נסתכל על קוד אחד לדוגמה כדי להדגים
final
שלא ניתן להכריז על שיטה מופשטת ב--class. תנו
Hello.java
לנו
public final
מחלקה בשם
Hello
, שיש לה שיטה מופשטת
print()
.
public final class Hello {
public abstract void print();
}
הקלידו את הקוד הזה ב-IDE, תקבלו את הודעת השגיאה הבאה, הם אומרים
Hello
שזה חייב להיות מחלקה אבסטרקטית כדי שניתן יהיה להכריז בו על שיטות מופשטות.
אותו דבר יקרה אם תקליד את הקוד הזה בפנקס רשימות ותרכיב אותו באמצעות כלי השירות javac משורת הפקודה. לפי מפרטי Java, ברגע שאתה מכריז על מתודה אבסטרקטית בתוך מחלקה, המחלקה הופכת למחלקה אבסטרקטית, ומכיוון שאינך
final
יכול לעשות מחלקה אבסטרקטית ב-Java, המהדר יפיק שגיאה. זה נכון גם למחלקות ברמה העליונה וגם למחלקות מקוננות בשפת Java. גם אם תכריז על שיטה מופשטת במחלקה מקוננת
final
, השגיאה תהיה זהה. שאלה קשורה נוספת היא:
האם למחלקה מופשטת בג'אווה יש שיטות סטטיות? תשובה: כן, הם יכולים, אין בעיה להכריז על מתודה סטטית במחלקה אבסטרקטית, שכן כדי להשתמש בשיטה סטטית אין צורך ליצור מופע של המחלקה, ניתן לקרוא להן פשוט באמצעות שם המחלקה. אנו יכולים לשנות את הדוגמה שלנו כך שתכלול
Hello
שיטה במחלקה
main()
, שהיא סטטית ב-Java, כפי שמוצג להלן:
public abstract class Hello {
public abstract void print();
public static void main(String args[]) {
}
}
כפי שאתה יכול לראות, לא נזרקת שגיאת קומפילציה. קוד זה מתחבר ללא בעיות, מכיוון שב-Java אתה יכול להכריז בבטחה מלאה על שיטה סטטית במחלקה מופשטת.
מסקנות קצרות אי אפשר להכריז על שיטה מופשטת ב-
final
class. מכיוון שברגע שאתה עושה זאת, המחלקה הופכת אוטומטית למופשטת, לפי מפרטי Java. ומכיוון
final
ש-class ב-Java לא יכול להיות מופשט, זה לא מקובל, והקומפיילר יאסור עליך לעשות זאת על ידי זריקת שגיאה. אבל אתה יכול להכריז על שיטות סטטיות גם במחלקות סופיות וגם בשיעורים מופשטים, אין עם זה בעיות.
GO TO FULL VERSION