אחרי שכתבתי מאמר בעבר על 50 שאלות מתקדמות בתכנות ב-Java, הקוראים שלנו אהבו אותו מאוד. לכן היום נבדוק שאלות ראיונות מעט מסובכות ב-Java.
שאלות ראיונות מעט מסובכות ב-Java
אלו שאלות תכנות, אך אל תניח שתוכל לנחש את הפלט ולהסביר אותו אלא אם יש לך הבנה עמוקה של Java.
1. Null כארגומנט
יש לנו פונקציות מעומלות ואנו מעבירים את הערך null. איזו פונקציה תיקרא ומה יהיה הפלט של התוכנית?
public class Test {
public static void main(String[] args) {
foo(null);
}
public static void foo(Object o) {
System.out.println("Object argument");
}
public static void foo(String s) {
System.out.println("String argument");
}
}
2. שימוש ב-"L" עבור long
האם תצליח לנחש את הפלט של ההצהרות הבאות?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
הסבר לשאלה מסובכת עם ארגומנט null
לפי תקן Java, במקרה של עומס, המהדר בוחר בפונקציה המדויקת ביותר. ברור שמחלקת String היא יותר מפורטת ממחלקת Object, ולכן יודפס "ארגומנט String". אבל, מה אם יש לנו שיטה נוספת במחלקה כמו בדוגמה שלמטה.
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
במקרה זה, מהדר Java יזרוק שגיאה "השיטה foo(String) אובדת במבנה Test". למחרוזת ול-StringBuffer אין מורשת הנגזרת. לכן אף אחת מהן אינה יותר מפורטת מהשנייה. שיטה היא יותר מפורטת משנייה אם כל קריאה שנתפסת על ידי השיטה הראשונה יכולה להיעביר לשנייה בלי שגיאת סוג זמן קומפילציה. אנו יכולים להעביר מחרוזת כארגומנט לאובייקט וכארגומנט String אך לא לשיטת ארגומנט StringBuffer.
הסבר עבור משתנה ארוך
פלט קטע הקוד יהיה:
31536000000
1471228928
אנו יוצרים באופן חמישי את המשתנה הראשון כלאורך על ידי הוספת הסיומת "L". לכן המהדר יטפל בו כמשתנה מספר שלם ארוך ויקצה אותו למשתנה הראשון. לגבי הפקודה השנייה, המהדר יבצע את החישוב ויטפל בו כבמשתנה שלם ב-32 ביט. מכיוון שהפלט נמצא מחוץ לטווח הערך המקסימלי של המספר השלם (2147483647), המהדר יחתוך את הביטים המשמעותיים ביותר ויטפל בו כבמשתנה. המספר הבינארי השווה ל-1000*60*60*24*365L = 011101010111101100010010110000000000 (36 ביטים). לאחר הסרת 4 הביטים המשמעותיים ביותר כדי להתאים למספר שלם ב-32 ביט, הערך החדש = 01010111101100010010110000000000 (32 ביטים). זה שווה ל-1471228928 ולכן זהו הפלט. לאחרונה יצרתי סדרת סרטונים ב-YouTube לתוכניות מסובכות ב-Java.
תוכל לבדוק עוד דוגמאות ב-Java במקור הקוד שלנו ב-מאגר ה-GitHub שלנו.
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions