שאלות ראשיות בראיון Java עם קור

שאלות ראשיות לראיונות בג'אווה יכולות לעזור לך בהתכוננות לראיונות המבוססים על ג'אווה. בין אם אתה מתחיל או מקצוען מנוסה מאוד, ג'אווה הבסיסית משמשת תפקיד חיוני בכל ראיון ג'אווה/ JEE.

ג'אווה הבסיסית היא אזור האהוב ביותר ברוב הראיונות ומשמשת תפקיד קריטי בהחלטת תוצאת הראיון שלך.

פוסט זה בא ישירות מ-14+ שנות תכנות בג'אווה שלי והמון ניסיון בראיונות. ג'אווה 16 הושקה לאחרונה ועידכנתי את הפוסט כדי לכלול חלק מהשאלות מהגרסאות האחרונות.

שאלות ראיון בג'אווה ותשובות

I have already written a lot about java interview questions for specific topics such as String, Collections, and Multithreading.

  1. שאלות ראיון במחרוזות בג'אווה
  2. שאלות ראיון בתהליכים בג'אווה
  3. שאלות ראיון באוספי נתונים בג'אווה
  4. שאלות ראיון בחריגות בג'אווה

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

1. תן שמות לכמה מהתכונות החשובות של הגרסה 14 של ג'אווה?

ג'אווה 14 יוצאת לאור ב־17 במרץ 2020. זו גרסה לא-תמיכה לתקופה ארוכה. כמה מהתכונות החשובות למפתחים בגרסה 14 הן:תכונות Java 14:

  1. ביטויי מקרה – JEP 361
  2. שיפורים בפילטרת התבניות של אופרטור instanceof – תכונת תצוגה מקדימה, JEP 305
  3. הודעות NullPointerException שימושיות – JEP 358
  4. בלוקי טקסט – תצוגה שנייה, JEP 368
  5. רשומות – מחלקות נתונים, תכונת תצוגה מקדימה, JEP 359.

2. תן שמות לכמה מהתכונות החשובות של הגרסה 13 של ג'אווה?

ג'אווה 13 הושקה ב־17 בספטמבר 2019. זו גרסה לא-תמיכה לתקופה ארוכה. כמה מהתכונות החשובות למפתחים בגרסה 13 הן:תכונות Java 13:

  1. בלוקי טקסט – תכונת תצוגה מקדימה, JEP 355
  2. החלפת ביטויים – תכונה מקדימה, JEP 354
  3. הטמעה מחדש של ממשק ה-Sockets של Java – JEP 353
  4. ארכיון CDS דינמי – JEP 350
  5. שיטת FileSystems.newFileSystem()
  6. מפענחים DOM ו-SAX עם תמיכה במרחב השמות
  7. תמיכה ב-Unicode 12.1
  8. שיפורים ב-ZGC כדי להחזיר זיכרון לא בשימוש – JEP 351

3. תן שמות של תכונות חשובות בגרסת Java 12?

גרסת Java 12 הושקה ב-19 במרץ 2019. זו גרסה לא לצמית. חלק מתכונות Java 12 הם:

  1. שינויים ב-JVM – JEP 189, JEP 346, JEP 344, ו-JEP 230.
  2. החלפת ביטויים
  3. שיטת mismatch() בקובץ
  4. עיצוב מספרים קומפקטיים
  5. אוספי Teeing ב-API של Stream
  6. שיטות חדשות במחלקת String
  7. JEP 334: ממשק קבועים ב-JVM
  8. JEP 305: תואם דפוס ל-instanceof
  9. סדרות מחרוזות גולמיות הוסרו מ-JDK 12.

4. מהן תכונות העיקריות של הגרסה Java 11?

Java 11 היא הוצאת ה-LTS השנייה לאחר Java 8. הם שינו את רישיון השימוש ואת דגם התמיכה, שכן אם תורידו את ה-JDK של Oracle Java 11, תצטרכו לשלם עבור שימוש מסחרי. אם ברצונכם להשתמש בגרסה חינמית, תוכלו להוריד אותה מאתר OpenJDK.

כמה מהתכונות החשובות של Java 11 הן:

  • אנו יכולים להריץ תוכנית Java ישירות דרך פקודת java. הקובץ המקורי יועבר להידרג וישוחק. זה חלק מהמימוש של תכונת JEP 330.
  • התווספו 6 שיטות חדשות במחלקת String – isBlank(), lines(), strip(), stripLeading(), stripTrailing(), ו-repeat(). תוכלו לקרוא אודותם במאמר שלנו על מחלקת Java String.
  • במחלקת Files התווספו שני שיטות חדשות לקריאה/כתיבת נתוני מחרוזת – readString() ו-writeString().
  • ניתן להשתמש ב-"var" עם ביטויי lambda גם. זה חלק מהמימוש של JEP 323.
  • אפסילון: מאסף אשפה No-Op עבור סביבות מבחן. זו תכונת ניסיונית וחלק מ-JEP 318.
  • מודולי Java EE ו-CORBA הוסרו מהבניה התקנית של JDK. מנוע ה-JavaScript של Nashorn גם הופסק.
  • קליינט HTTP חדש (JEP 321) ורשם טיסות (JEP 328)

לסקירה מלאה, נא לקרוא תכונות של Java 11.

5. מהם תכונות החשובות ביותר של הגרסה 10 של Java?

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

  • היכרות עם סוג המשתנה המקומי
  • שיפור java.util.Locale וממשקי ה- API הקשורים כדי ליישם הרחבות נוספות של קידודי יוניקוד של תגי שפה BCP 47.
  • אפשר ל-HotSpot VM להקצות את זיכרון אובייקטי ה-Java על מכשיר זיכרון חלופי, כגון NV-DIMM, שצויין על ידי המשתמש.
  • ספק אוסף ברירת מחדל של אישורי רשות התעופה (CA) בשורשים ב-JDK.

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

6. מהן התכונות החשובות של הגרסה Java 9?

Java 9 הייתה השקה ראשית והביאה המון תכונות. חלק מהתכונות החשובות הם:

  • Java 9 REPL (JShell)
  • מערכת מודולים של Java 9
  • שיטות יצירה לרשימה לא ניתנת לשינוי, לסט, למפה, ול-Map.Entry
  • שיטות פרטיות בממשקים
  • זרמים ריאקטיביים
  • שיפורים באוסף הזבל (Garbage Collector)

תמצאו עוד פרטים עליהם ב־תכונות של Java 9.

7. מהן התכונות החשובות של הגרסה Java 8?

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

Java 8 הייתה אחת מהשקות הגדולות ביותר אחרי הערות וגנריקה של Java 5. חלק מהתכונות החשובות של Java 8 הן:

  1. שינויי ממשק עם שיטות ברירת מחדל וסטטיות
  2. ממשקים פונקציונליים וביטויי Lambda
  3. API של Java Stream למחלקות אוספים
  4. API של תאריך וזמן ב-Java

I strongly recommend to go through above links to get proper understanding of each one of them, also read Java 8 Features.

8. תן שמות לכמה מהעקרונות של ה-OOPS ב-Java?

Java מבוססת על עקרונות תכנות מונחה עצמים, הנה כמה מהעקרונות שמיושמים בתכנות ב-Java.

  • התרחקות
  • איכול
  • פולימורפיזם
  • ירושה
  • קישור
  • אגרגציה
  • הרכבה

למידע נוסף ראה ב־עקרונות ה-OOPS ב-Java.

9. מה המשמעות של תלת פלטפורמה של ג'אווה?

תלת פלטפורמה אומרת שאתה יכול להריץ את אותו התוכנית בג'אווה בכל מערכת הפעלה. לדוגמה, תוכל לכתוב תוכנית בג'אווה בווינדוס ולהריץ אותה ב-Mac OS.

10. מהו JVM והאם הוא תלת פלטפורמה?

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

11. מה ההבדל בין JDK ל-JVM?

קיט פיתוח ג'אווה (JDK) היא למטרות פיתוח ו-JVM היא חלק ממנו לביצוע תוכניות ג'אווה.

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

12. מה ההבדל בין JVM ו-JRE?

סביבת הרצה של ג'ובה (JRE) היא המימוש של JVM. JRE מורכבת מ-JVM ומקבצי בינארי ג'אווה וממחלקות אחרות כדי להריץ כל תוכנית בהצלחה. JRE אינה מכילה כלים לפיתוח כמו מהדר ג'אווה, מפענח דוקר, וכו'. אם ברצונך להריץ תוכנית ג'אווה כלשהי, עליך להתקין JRE.

13. איזו מחלקה היא המחלקה-אב של כל המחלקות?

java.lang.Object היא המחלקה השורש לכל מחלקות הג'אווה ואין צורך להרחיב אותה.

14. למה ג'אווה אינה תומכת בהורשה מרובה?

אין ל-Java תמיכה בריבוי ירושה במחלקות בגלל "בעיה המעוון". כדי לדעת עוד על בעיה המעוון עם דוגמה, קרא את ריבוי הירושה ב-Java.

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

15. למה Java אינה שפה עקרונית עקרונית?

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

כפי שאנו יודעים, לכל סוגיות הפרימיטיביות יש מחלקות מעטפת כגון Integer, Long וכו 'שמספקות כמה שיטות נוספות.

16. מה ההבדל בין משתני הנתיב ומשתני ה- classpath?

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

‏משתנה ה- Classpath הוא ספציפי ל-Java ומשמש תוכניות Java כדי לאתר קבצי מחלקות. אנו יכולים לספק את מיקום משתנה ה-Classpath בעת הפעלת היישום ב-Java ויכול להיות תיקייה, קבצי ZIP, קבצי JAR וכו'.

‏השיטה main() היא נקודת הכניסה של כל יישום סטנדלון של Java. תחביר השיטה main הוא public static void main(String args[]).

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

מהו ההעמסה והדריסה ב-Java?

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

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

האם ניתן להעמיס על השיטה main()?

כן, אנו יכולים לקבוע מספר רב של שיטות עם השם "main" בתוך כיתה אחת. עם זאת, אם נפעיל את הכיתה, סביבת הרצה של Java תחפש את השיטה הראשית בתחביר כגון public static void main(String args[]).

20. האם ניתן להכיל מספר רב של מחלקות ציבוריות בקובץ מקור Java?

אין אפשרות להכיל יותר ממחלקה אחת ציבורית בקובץ מקור Java יחיד. בקובץ מקור יחיד ניתן להכיל מספר מחלקות שאינן ציבוריות.

21. מהו חבילת Java ואיזו חבילה מיובאת כברירת מחדל?

חבילת Java היא המנגנון לארגון המחלקות ב-Java על ידי קיבוץ אותן. הלוגיקה של הקיבוץ יכולה להיות מבוססת על פונקציות או מודולים. שם מלא של מחלקת Java כולל את החבילה ושם המחלקה. לדוגמה, java.lang.Object הוא השם המלא של המחלקה Object השייך לחבילה java.lang.

החבילה java.lang מיובאת כברירת מחדל ולא נדרש לייבא אף מחלקה מהחבילה הזו באופן מפורש.

22. מהם מזהי הגישה ב-Java?

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

A java class can only have public or default access modifier. Read Java Access Modifiers to learn more about these in detail.

23. מהו מילת המפתח final?

מילת המפתח final משמשת עם מחלקות כדי לוודא שכל מחלקה אחרת לא יכולה להרחיב אותה. לדוגמה, מחלקת המחרוזת היא final ואין באפשרותנו להרחיב אותה.

ניתן להשתמש במילת המפתח final עם שיטות כדי לוודא שמחלקות הילד אינן יכולות לדרוס אותה.

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

משתני ממשק Java הם כברירת מחדל סופיים וסטטיים.

24. מהו מילת המפתח static?

מילת המפתח static ניתן להשתמש עם משתנים ברמת המחלקה כדי להפוך אותם לגלובליים, כלומר כל האובייקטים ישתפו באותו משתנה.

ניתן להשתמש במילת המפתח static גם עם שיטות. שיטה סטטית יכולה לגשת רק למשתנים סטטיים של המחלקה ולקרוא רק לשיטות סטטיות של המחלקה.

קרא עוד בפרטיות ב־מילת המפתח הסטטית של ג'אווה.

25. מהו finally ו finalize בג'אווה?

בלוק finally משמש עם try-catch כדי לשים את הקוד שתרצה לבצע בכל מקרה, גם אם יתקיים חריגה על ידי בלוק try-catch. בלוק finally בדרך כלל משמש כדי לשחרר משאבים שנוצרו בבלוק try.

הפעולה finalize() היא פעולה מיוחדת במחלקת Object שאנו יכולים לדרוס במחלקות שלנו. פעולה זו מתקראת על ידי אוסף הזבל כאשר האובייקט נמחק כזבל. פעולה זו נדרשת לדריסה בדרך כלל כדי לשחרר משאבי מערכת כאשר האובייקט נמחק כזבל.

26. האם אפשר להצהיר על מחלקה כסטטית?

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

המחלקה הפנימית הסטטית היא זהה לכל מחלקה ראשית אחרת והיא מקוננת לצורת עריכה רק לנוחות באריזה.

קרא עוד על מחלקות פנימיות ב־מחלקה פנימית של ג'אווה.

27. מהו יבוא סטטי?

אם עלינו להשתמש במשתנה או בשיטה סטטית ממחלקה אחרת, נהוג לייבא את המחלקה ולאחר מכן להשתמש בשיטה/משתנה עם שם המחלקה.

import java.lang.Math;

//בתוך המחלקה
double test = Math.PI * 5;

ניתן לעשות את אותו הדבר על ידי יבוא השיטה או המשתנה הסטטי בלבד ולאחר מכן להשתמש בו בתוך המחלקה כאילו הוא שייך אליה.

import static java.lang.Math.PI;

//כבר אין צורך להתייחס למחלקה
double test = PI * 5;

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

28. מהו try-with-resources ב-Java?

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

מֵאָז Java 7, אנו יכולים ליצור משאבים בתוך בלוק try ולהשתמש בהם. Java מתעסקת בסגירתו כשהבלוק try-catch מסתיים. קרא עוד ב־ניהול משאבים אוטומטי ב־Java.

29. מהו בלוק תפיסה מרובה ב־Java?

אחת השיפורים ב־Java 7 היה בלוק תפיסה מרובה שבו אפשר לתפוס מספר יוצא דופן של חריגות בבלוק catch יחיד. זה מקצר את הקוד שלנו והופך אותו לנקי יותר כאשר לכל בלוק catch יש קוד דומה.

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

קרא עוד ב־בלוק תפיסה מרובה ב־Java.

30. מהו בלוק סטטי?

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

31. מהו ממשק?

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

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

32. מהו מחלקה מופשטת?

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

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

33. מה ההבדל בין מחלקה מופשטת לבין ממשק?

  • המילת מפתח abstract משמשת ליצירת מחלקה מופשטת, בעוד ש-mמילת מפתח interface משמשת לממשקים.
  • מחלקות מופשטות יכולות לכלול מימוש של שיטות, בעוד שממשקים אינם יכולים.
  • A class can extend only one abstract class but it can implement multiple interfaces.
  • ניתן להריץ מחלקה מופשטת אם יש בה את השיטה main(), בעוד שאין אפשרות להריץ ממשק.

ישנם עוד הבדלים מפורטים ב- הבדל בין מחלקה מופשטת לבין ממשק.

34. האם ניתן לממש או להרחיב ממשק אחר?

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

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

35. מהו ממשק סימון?

A marker interface is an empty interface without any method but used to force some functionality in implementing classes by Java. Some of the well known marker interfaces are Serializable and Cloneable.

36. מהם קלפיות העטיפה?

קלפיות העטיפה של Java הן הייצוג באובייקט של שמונה סוגי הפרימיטיביים ב-Java. כל קלפית העטיפה ב-Java הן לא ניתנות לשינוי וסופיות. אוטומטית הקלפיות ב-Java 5 והפרימיטיבים שלהן מאפשרים המרות קלות בין סוגי הפרימיטיביים והקלפיות העטיפה המתאימות להם.

למידע נוסף ראה קלפיות העטיפה ב-Java.

37. מהו Enum ב-Java?

Enum נוסף ב-Java 1.5 כסוג חדש שדלתיו מורכבים ממערך קבוע של קבועים. לדוגמה, ב-Java, אנו יכולים ליצור את Direction כ-enums עם שדות קבועים כמו EAST, WEST, NORTH, SOUTH.

enum הוא המילה המפתחית ליצירת סוג enum ודומה למחלקה. קבועי enum מואצים באופן משתמע לסטטיים ולסופיים. קרא עוד בפרטים ב- enum java .

38. מהם ההערות ב-Java?

האנוטציות של ג'אווה מספקות מידע על הקוד ואין להן השפעה ישירה על הקוד שהן מעניקות. האנוטציות נכנסו לשימוש בג'אווה 5. אנוטציה היא מטא-נתונים על התוכנית המוטמעת בתוך התוכנית עצמה. ניתן לנתח אותה על ידי כלי ניתוח האנוטציות או המהדר. ניתן גם לציין את זמינות האנוטציה רק בזמן קומפילציה או עד לריצת התוכנית. אנוטציות מובנות בג'אווה הן @Override, @Deprecated ו־@SuppressWarnings. קרא עוד ב־אנוטציות בג'אווה.39. מהו Java Reflection API ולמה זה כל כך חשוב?

API השקפת ג'אווה מאפשר לבדוק ולשנות את התנהגותו של יישום ג'אווה בזמן ריצה. אנו יכולים לבדוק כיתת ג'אווה, ממשק, enum ולקבל את פרטי השדות והשיטות שלהם. שימוש ב־API השקפה הוא נושא מתקדם ועדיף להימנע ממנו בתכנות רגיל. שימוש ב־API השקפה עלול לשבש את תבנית העיצוב כמו תבנית הופכיות על ידי קריאה לבנאי הפרטי, כלומר להפר את כללי הגישה.

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

קרא את מדריך רפלקציה של Java כדי לקבל מעמד מקיף של רפלקציה API.

40. מהו הרכיב ב-Java?

הרכיב הוא טכניקת עיצוב ליישום יחס יש-לו במחלקות. אנו יכולים להשתמש ברכיב אובייקט לשימוש חוזר בקוד.

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

41. מה היתרון של הרכיב מעל ירושה?

אחת מהקריינות הטובות ביותר של תכנות ב-Java היא "העדפת קומפוזיציה מעל ירושה". חלק מהסיבות האפשריות הן:

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

ניתן לקרוא עוד על היתרונות של הקומפוזיציה מעל הירושה בקישור: java composition vs inheritance.

42. כיצד למיין אוסף של אובייקטים מותאמים אישית ב-Java?

אנו צריכים ליישם את ממשק Comparable כדי לתמוך במיון של אובייקטים מותאמים אישית באוסף. ממשק Comparable מכיל את השיטה compareTo(T obj) שמשמשת על ידי שיטות מיון ועל ידי ספק שיטת יישום זו, אנו יכולים לספק דרך ברירת מחדל למיון אוסף של אובייקטים מותאמים אישית.

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

43. מהו מחלקה פנימית ב-Java?

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

ניתן ליצור מחלקה פנימית מקומית או מחלקה פנימית אנונימית בתוך מחלקה. למידע נוסף ראה מחלקה פנימית ב-Java.

מהו כיתה מסתורית פנימית?

A local inner class without a name is known as an anonymous inner class. An anonymous class is defined and instantiated in a single statement. Anonymous inner class always extend a class or implement an interface.

כיוון שלכיתה אנונימית אין שם, אי אפשר להגדיר בנאי עבור כיתה אנונימית. כיתות פנימיות אנונימיות נגישות רק בנקודה בה הן מוגדרות.

מהו Classloader ב-Java?

Classloader ב-Java הוא התוכנית שטוענת תוכנית קוד בתורות לזכרון כאשר אנו רוצים לגשת לכיתה כלשהי. אנו יכולים ליצור את Classloader שלנו על ידי הרחבת ה-ClassLoader class והחלפת השיטה loadClass(String name). למידע נוסף בקרו ב- java classloader.

מהם סוגי ה-Classloaders השונים?

יש שלושה סוגי Class Loaders מובנים ב-Java.

  1. Bootstrap ClassLoader – זה טוען כיתות פנימיות ב-JDK, בדרך כלל טוען rt.jar וכיתות קריטיות נוספות.
  2. טען מחלקות מתיקיית הרחבות של JDK, רגילה לרוב להיות תיקיית $JAVA_HOME/lib/ext.
  3. טוען מחלקות מנתיב המחלקות הנוכחי שניתן להגדיר בזמן הפעלת התוכנית באמצעות האפשרויות שורת הפקודה -cp או -classpath.

47. מהו אופרטור הטרנארי ב-Java?

אופרטור הטרנארי ב-Java הוא האופרטור התנאי היחידי שמקבל שלושה אופרנדים. זהו שורת קוד בודדת המחליפה את ההצהרה if-then-else ומשמשת הרבה בתכנות ב-Java. ניתן להשתמש באופרטור טרנארי בתנאי if-else או אפילו בתנאים switch באמצעות אופרטורים טרנאריים מקוננים. דוגמה ניתן למצוא בעמוד אופרטור טרנארי ב-Java.

48. מה עושה המילה השמורה super?

המילה השמורה super ניתנת לשימוש כדי לגשת לשיטת המחלקה האב כאשר עשינו דריסה של השיטה במחלקה הילד.

ניתן להשתמש במילה השמורה super כדי לקרוא לבנאי של המחלקה האב בבנאי של המחלקה הילד, אך במקרה זה, יש להפעיל את הפקודה כאילו היא הפקודה הראשונה בשיטת הבנאי.

package com.journaldev.access;

public class SuperClass {

	public SuperClass(){
	}
	
	public SuperClass(int i){}
	
	public void test(){
		System.out.println("super class test method");
	}
}

שימוש במילה השמורה super ניתן לראות במימוש המחלקה הילד שלמטה.

package com.journaldev.access;

public class ChildClass extends SuperClass {

	public ChildClass(String str){
		//גישה לבנאי של מחלקת השורש עם המילה המפתחית super
		super();
		
		//גישה לשיטת המחלקה הילד
		test();
		
		//שימוש ב-super כדי לגשת לשיטת המחלקה העל
		super.test();
	}
	
	@Override
	public void test(){
		System.out.println("child class test method");
	}
}

49. מהו break ו continue בהצהרה?

ניתן להשתמש בהצהרת break כדי לסיים לולאת for, while או do-while. ניתן להשתמש ב break בהצהרת switch כדי לצאת ממקרה switch. ניתן לראות את דוגמת השימוש בהצהרת break ב-java break. ניתן להשתמש ב break עם התווית כדי לסיים את הלולאות המקוננות.

הצהרת continue מדלגת על האיטרציה הנוכחית של לולאת for, while או do-while. ניתן להשתמש בהצהרת continue עם התווית כדי לדלג על האיטרציה הנוכחית של הלולאה החיצונית.

50. מהו מילת המפתח this ב-Java?

מילת המפתח this מספקת הפניה לאובייקט הנוכחי ונהוגה בעיקר כדי לוודא שמשתני האובייקט משמשים, ולא המשתנים הלוקליים שיש להם את אותו השם.

//בנאי
public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

אנו יכולים גם להשתמש במילת המפתח הזו כדי לקרוא לבנאיים אחרים מתוך בנאי.

public Rectangle() {
    this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
    this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

51. מהו בנאי ברירת המחדל?

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

52. האם יש לנו אפשרות להשתמש ב try ללא חסימת catch?

כן, אנו יכולים להשתמש בהצהרת try-finally ולכן להימנע מחסימת catch.

53. מהו איסוף הזבל?

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

אנו יכולים להריץ את מנהל האשפה עם הקוד Runtime.getRuntime().gc() או להשתמש בשיטת יעוץ System.gc(). לניתוח מפורט של זיכרון ה-Heap ושל איסוף האשפה, אנא קראו את איסוף האשפה ב-Java.

54. מהו Serialization ו-Deserialization?

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

האובייקט צריך ליישם ממשק Serializable ואנו יכולים להשתמש ב-java.io.ObjectOutputStream כדי לכתוב אובייקטים לקובץ או לאובייקט OutputStream כלשהו. קראו עוד ב-Serialization ב-Java.

תהליך המרת נתוני הזרם שנוצרו דרך Serialization לאובייקט נקרא Deserialization. קראו עוד ב-Deserialization ב-Java.

כיצד להריץ קובץ JAR דרך פקודת הפתיחה?

ניתן להריץ קובץ JAR באמצעות פקודת java אך זה דורש קלטת Main-Class בקובץ המניפסט של ה-JAR. Main-Class הוא נקודת הכניסה של ה-JAR ומשמש על ידי פקודת java לביצוע המחלקה. למידע נוסף ראה ב-קובץ JAR של java.

מהו שימוש של מחלקת System?

מחלקת System של Java היא אחת מהמחלקות הבסיסיות. אחת מהדרכים הקלות ביותר לרשום מידע למטרת ניפוי שגיאות היא באמצעות השיטה System.out.print().

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

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

מהו מילת המפתח instanceof?

ניתן להשתמש במילת המפתח instanceof כדי לבדוק האם אובייקט שייך למחלקה או לא. עלינו להימנע משימוש בה ככל הניתן. שימוש דוגמא:

public static void main(String args[]){
	Object str = new String("abc");
		
	if(str instanceof String){
		System.out.println("String value:"+str);
	}
		
	if(str instanceof Integer){
		System.out.println("Integer value:"+str);
	}
}

כיוון ש- str הוא מסוג String בזמן ריצה, ההצהרה הראשונה בודקת אמת והשנייה בודקת שקר.

58. האם ניתן להשתמש במחרוזת עם switch case?

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

59. Java היא מועברת על ידי ערך או מועברת על ידי הפניה?

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

מה ההבדל בין זיכרון ההשקה והמחסנית?

ההבדל העיקרי בין זיכרון ההשקה והמחסנית הוא כדלקמן:

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

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

המהדר של Java מאוחסן ב־JDK, JRE או JVM?

משימת המהדר של Java היא להמיר תוכנית Java לבית קוד (Bytecode), ויש לנו את הקובץ הניתן להרצה javac לכך. לכן זה צריך להיות מאוחסן ב־JDK, אנו לא צריכים אותו ב־JRE ו־JVM הוא רק המפרטים.

62. מה יהיה הפלט של התוכניות הבאות?

הקשר: שיטה סטטית בתוך מחלקה

package com.journaldev.util;

public class Test {

	public static String toString(){
		System.out.println("Test toString called");
		return "";
	}
	
	public static void main(String args[]){
		System.out.println(toString());
	}
}

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

הקשר: קריאת שיטה סטטית

package com.journaldev.util;

public class Test {

	public static String foo(){
		System.out.println("Test foo called");
		return "";
	}
	
	public static void main(String args[]){
		Test obj = null;
		System.out.println(obj.foo());
	}
}

תשובה: וואו, זה מצב מוזר. ראינו NullPointerException כאשר אנו קוראים לשיטה על אובייקט שהוא NULL. אבל כאן התוכנית תעבוד ותדפיס "נקרא פו של מבחן".

הסיבה לכך היא אופטימיזציה של קוד מהמהדר של ג'אווה. כאשר הקוד בג'אווה מתרגם לבייט קוד, הוא מבין ש־foo() הוא שיטה סטטית וצריך להיות קרוא באמצעות המחלקה. לכן, הוא משנה את קריאת השיטה obj.foo() ל־Test.foo() ולכן אין NullPointerException.

I must admit that it’s a very tricky question and if you are interviewing someone, this will blow his mind off. ?

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

Source:
https://www.digitalocean.com/community/tutorials/core-java-interview-questions-and-answers