JavaRush /בלוג Java /Random-HE /10 שיעורים מופשטים וממשקי ג'אווה שאלות ראיון

10 שיעורים מופשטים וממשקי ג'אווה שאלות ראיון

פורסם בקבוצה
שיעורים מופשטים וממשקים פופולריים מאוד בכל שפות התכנות מונחה עצמים. וכמעט בכל ראיון ג'אווה אתה נתקל בשאלה אחת לפחות בנושא זה. ממשקים מוזכרים לעתים קרובות יותר בשל הפופולריות שלהם בקרב מעצבי תוכנה, אך שאלות לגבי שיעורים מופשטים עולות מדי פעם. האחרונים נשאלים לרוב ממועמדים לתפקיד של מפתחים זוטרים, נניח, עם ניסיון של לא יותר משנתיים בפיתוח Java, בעוד ששאלות לגבי ממשקים נתקלות לרוב במהלך ראיונות עם מי שנסיונם כבר עלה על ארבע שנים. הם נשאלים בדרך כלל בשילוב עם שאלות אחרות על דפוסי עיצוב של Java, כגון דפוסי Decorator או Factory. 10 שיעורים מופשטים וממשקי Java שאלות ראיון - 1במאמר זה, נבחן שאלות נפוצות בנושא שיעורים וממשקים מופשטים שנשאלו ברמות שונות של ראיונות Java. רובם לא אמורים להיות קשים אפילו למתכנת ג'אווה מתחיל. אלו הן בעיקר שאלות ידע טהורות, אבל חלק מהן, כמו ההבדלים בין מחלקות מופשטות וממשקים ב-Java, או מתי לבחור מחלקה מופשטת על פני ממשק , יכולות להיות די מסובכות. אנו מציעים לך תריסר שאלות מעניינות בנושא.
אם אי פעם שאלו אתכם שאלה בראיון או נאלצתם לשאול כל שאלה כדאית לגבי שיעורים וממשקים מופשטים, אבל היא לא ברשימה הזו, אנא שתפו אותה בתגובות.

1. האם למחלקה מופשטת יכולים להיות בנאים בג'אווה?

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

2. האם שיעורים מופשטים בג'אווה יכולים ליישם ממשקים? האם עליהם ליישם את כל השיטות?

כן, מחלקות מופשטות יכולות ליישם ממשקים באמצעות ה- implements. מכיוון שהם מופשטים, הם לא נדרשים ליישם את כל השיטות. שימוש במחלקת בסיס מופשטת וממשק להכרזה על הסוג הוא תרגול מומלץ. דוגמה לכך היא ממשק java.util.Listוהמחלקה המופשטת המתאימה java.util.AbstractList. מכיוון AbstractListשהוא מיישם את כל השיטות הנפוצות, יישומים ספציפיים (כגון LinkedListו ArrayList) אינם חייבים ליישם את כל השיטות, כפי שהיה קורה אם הם יישמו את הממשק Listישירות. פתרון זה משלב את היתרון של שימוש בממשק להכרזה על סוג עם הגמישות של מחלקה מופשטת ליישום כל ההתנהגות הנפוצה במקום אחד. בספרו של יהושע בלוך "Java. לתכנות יעיל" יש פרק מצוין בנושא שימוש בממשקים ושיעורים מופשטים ב-Java, להבנה טובה יותר יש טעם ללמוד אותו.

3. האם שיעור מופשט יכול להיות סופי?

לא הוא לא יכול. מילת המפתח finalפירושה שהכיתה נמצאת בראש ההיררכיה ואין לה צאצאים. ומעמד מופשט ללא יורשים הוא סוס כדורי בחלל ריק, מכיוון שאי אפשר ליצור מופע abstract class. לפיכך, אם מחלקה היא גם abstractוגם final, אז אין לה צאצאים ולא ניתן להפעיל אותה. מהדר Java יזרוק שגיאה אם ​​תיצור מחלקה abstractו- final.

4. האם למחלקה מופשטת בג'אווה יש שיטות סטטיות?

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

5. האם ניתן ליצור מחלקה מופשטת?

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

6. האם לכיתה מופשטת יש צורך בשיטות מופשטות?

לא, למחלקה מופשטת ייתכן שלא יהיו שיטות מופשטות כלשהן. אתה יכול ליצור תקציר מחלקה ב-Java פשוט על ידי שימוש במילת מפתח abstractבהצהרה שלה. המהדר יאכוף כל מגבלה מבנית, כגון אי מתן אפשרות ליצור מופעים של מחלקה זו. אגב, השאלה האם צריכות להיות שיטות מופשטות במחלקה או ממשק מופשט שנויה במחלוקת. נראה לי שלמחלקה מופשטת צריכה להיות שיטות מופשטות, שכן זה הדבר הראשון שמתכנת חושב עליו כשהוא רואה מחלקה מופשטת. זה משתלב היטב עם העיקרון של מזעור הפתעות.

7. מה ההבדלים בין מחלקה אבסטרקטית לממשק בג'אווה?

זוהי השאלות החשובות ביותר ואחת השאלות הקלאסיות ביותר בראיון Java. אני לא יכול לספור כמה פעמים ראיתי את השאלה הזו בראיונות ג'אווה בכל הרמות. מה שהופך את השאלה הזו למעניינת הוא, במיוחד, ההזדמנות של המבקש לספק דוגמה. לענות על שאלות על היסודות של תכנות מונחה עצמים, כמו הפשטה, אנקפסולציה, פולימורפיזם ותורשה, זה קל, אבל כשמדובר בניואנסים עדינים כאלה, מועמדים לעבודה מתבלבלים לעתים קרובות ואומרים את הדבר הראשון שעולה על הדעת. התשובה לשאלה זו ראויה למאמר נפרד (במיוחד לאחר שינויים ב-Java 8), עם זאת, בקיצור:
  • ממשק מתאר רק את ההתנהגות (שיטות) של אובייקט, אבל אין לו מצבים (שדות) (למעט public static final), בעוד שמחלקה מופשטת יכולה לקבל אותם.

  • מחלקה מופשטת עוברת בירושה (מתרחבת), וממשק מיושם (מיישמת). אנחנו יכולים לרשת רק מחלקה אחת, אבל ליישם כמה ממשקים שנרצה. ממשק יכול להרחיב (להרחיב) ממשק/ממשקים אחרים.

  • מחלקות מופשטות משמשות כאשר יש קשר "is-a", כלומר תת המחלקה מרחיבה את המחלקה המופשטת הבסיסית, וניתן ליישם ממשקים על ידי מחלקות שונות שאינן קשורות כלל זו לזו.

8. מתי הגיוני להעדיף מחלקה מופשטת על ממשק ולהיפך?

זהו המשך לשאלות קודמות בנושא שיעורים וממשקים מופשטים. אם אתה יודע מה ההבדלים התחביריים שלהם, אז מענה על שאלה זו לא יגרום לך לבעיות, שכן הם הגורם הקובע בקבלת ההחלטה. מכיוון שכמעט בלתי אפשרי להוסיף שיטה חדשה לממשק שפורסם, עדיף להשתמש במחלקה מופשטת במקרה של צורך פוטנציאלי בפיתוח נוסף. פיתוח שיעורים מופשטים ב-Java קל יותר מאשר פיתוח ממשקים. כמו כן, אם לממשק יש יותר מדי שיטות והטמעת כולן הופכת לכאב ראש אמיתי, עדיף ליצור מחלקה אבסטרקטית למימוש ברירת המחדל. דפוס זה מלווה בחבילת Java collections, המחלקה המופשטת AbstractListמספקת את מימוש ברירת המחדל של ה- List. השתמש במחלקות מופשטות אם:
  • אתה רוצה לחלוק קוד בין כמה מחלקות קשורות.

  • היית מצפה שלמחלקות שמרחיבות את המחלקה המופשטת שלך יהיו שיטות או שדות משותפים רבים, או שידרשו משנה גישה מלבד public(לדוגמה, protectedו private).

  • אתה רוצה להצהיר על לא סטטי או не-finalשדות. זה מאפשר לך להגדיר שיטות שיכולות לגשת ולשנות את מצב האובייקט שאליו הן שייכות.
השתמש בממשקים אם:
  • אתה מצפה משיעורים לא קשורים ליישם את הממשק שלך. לדוגמה, ממשקים Comparableומיושמים Cloneableעל ידי מחלקות רבות שאינן קשורות.

  • אתה רוצה להגדיר את ההתנהגות של סוג נתונים מסוים, אבל לא אכפת לך מי יישם את זה.

  • אתה רוצה להשתמש בירושה מסוגים מרובים.

9. מהי שיטה מופשטת בג'אווה?

שיטה מופשטת היא שיטה ללא גוף. אתה פשוט מכריז על שיטה מבלי להגדיר אותה, באמצעות מילת מפתח abstractבהצהרת השיטה. כל השיטות המוצהרות בתוך ממשק בשפת Java הן מופשטות כברירת מחדל. הנה דוגמה לשיטה מופשטת ב-Java:
public void abstract printVersion();
כעת, כדי ליישם שיטה זו, עליך להרחיב את המחלקה המופשטת ולעקוף את השיטה הזו.

10. האם מחלקה אבסטרקטית ב-Java יכולה להכיל מתודה main?

כן, מחלקה אבסטרקטית ב-Java יכולה להכיל מתודה main, כי היא רק עוד שיטה סטטית, וניתן להפעיל מחלקה אבסטרקטית באמצעות השיטה main, כל עוד לא מפעילים אותה. זה כל מה שרציתי להגיד לך. וזכרו: מחלקות וממשקים מופשטים הם החלטות עיצוב מרכזיות בתהליך הניתוח והעיצוב מונחה עצמים, ויש להשתמש בהם בזהירות הראויה, כמובן, אם ברצונכם ליצור מערכת גמישה.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION