הטיפוס הדינמי והטיפוס הסטאטי

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

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

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

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

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

הטיפוס הסטאטי משקף למעשה ידע חלקי אודות הטיפוסים בתוכנית. משתנה מטיפוס סטאטי Number, למשל, אפשר לקשור לכל עצם ממחלקה שהיא "סוג של" Number, אבל אי אפשר בשום אופן לקשור לעצם ממחלקה שאינה ביחס כזה עם Number. הקומפיילר דואג שקשירה כזו לא תיווצר לעולם. הידע החלקי שחוקי הקשירה של הקומפיילר מאפשרים לנו (ולקומפיילר) לדעת שמזהה מטיפוס סטאטי מסויים תמיד קשור לעצם שהוא "סוג של" הטיפוס הסטאטי, או שאינו קשור כלל (ערכו null); זהו מידע חשוב, אבל חלקי, כי איננו יכולים לדעת מראש לאיזה טיפוס עצם בדיוק המזהה יהיה קשור. בזמן קומפילציה יש לנו ולקומפיילר ידע חלקי, ידע אודות הטיפוסים הסטאטיים. בזמן ריצה יש לנו ולסביבת הריצה של ג'אווה מידע מלא אודות הטיפוסים הדינמיים.

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