אתה עושה סלט.
כל שפת תכנות, אתה כותב את התוכנית כקובץ טקסט ולאחר מכן היא עוברת איזשהו תהליך בכדי שתוכל לרוץ. ברוב השפות התהליך מתבצע לפני ההרצה ויש מספר שפות שהתהליך הזה מתבצע תוך כדי הריצה. יש שפות שהתהליך מעביר אותן לשפת מכונה (כמו C++), לפני התהליך הזה הן היו טקסט ואחריו הן שפת מכונה (00111000) ויש שפות שהתהליך מעביר אותן ל"שפה אחרת" אשר אינה מובנת לאדם אך מובנת לתוכנה אחרת אשר כבר נמצאת בשפת מכונה. התוכנה הזאת קוראת את ה"שפה אחרת" ובהתאם נותנת פקודות למחשב. ב C++ אתה כותב טקסט ולאחר מכן מקמפל ומקשר אותו והתוצאה היא תוכנית בשפת מכונה. התוכנית הזאת היא native. ב java אתה כותב טקסט ולאחר מכן מקמפל אותו ומקשר אותו והתוצאה היא קבוץ byte code שזה שורת הוראות אשר תוכנה בשם Virtual Machine מסוגלת לקרוא ולפעול על פיהן, לכאורה להריץ את התוכנה הכתובה בbyte code, אבל את הbyte code הזה יכולה להריץ Virtual Machine שרצה על Windows או Virtual Machine שרצה על לינוקס ולכן הbyte code נקרא קוד שאיננו native, הוא לא מותאם למע' הפעלה+פלטפורמה, זאת או אחרת אלא מותאם לVirtual Machine שהיא תוכנית שנכתבה בשפה native עבור כל אחד מהסביבות שרוצים להריץ בהן byte code של java. -ועכשיו אני אבלבל אותך קצת: קוד של java ניתן להפוך לnative בעזרת כלים מסויימים שזה תפקידם, במקום להפוך אותו לbyte code הן הופכים את הקוד java לתוכנית native אך אז היא לא יכולה לרוץ על סביבות אחרות מכיוון שהיא לא רצה בעזרת Virtual Machine אלא ישירות על המחשב, בלי מתווכים, ולכן מבצעת פקודות המותאמות ספציפית לסביבה שעליה היא עובדת וגם בנוייה כתוכנית לסביבה זאת (כגון EXE לWINDOWS) בשל כך לא תוכל לרוץ על סביבות אחרות.