You're going to hit a moment where one variable needs to become another type. Maybe you've got an int that needs to act like a double, or a double that needs to squeeze into an int. That's type casting, and Java handles it in two very different ways.
Implicit Casting: Java Does the Work for You
This happens when you move from a smaller data type to a bigger one. Java sees no risk here, so it converts things automatically — no extra code needed from you.
int numInt = 100;
double numDouble = numInt; // Implicit casting from int to double
System.out.println(numDouble); // Output: 100.0
Nothing gets lost going from int to double. A whole number fits comfortably inside a decimal type, so Java just lets it happen.
Explicit Casting: Now You're in Control
Going the other direction is trickier. Squeezing a larger data type into a smaller one means you might lose information along the way, so Java won't do it silently. You have to say it out loud — literally, by putting the target type in parentheses.
double numDouble = 100.55;
int numInt = (int) numDouble; // Explicit casting from double to int
System.out.println(numInt); // Output: 100
Notice what happened there. The .55 didn't round — it just vanished. That's the tradeoff with narrowing conversions. You gain a smaller type, but you lose precision.
Seeing the Full Chain in Action
Casting doesn't stop at one step. You can widen a value across several types in a row, or narrow it all the way down. Here's what that looks like:
// Widening Conversion (Implicit Casting)
int intValue = 100;
long longValue = intValue; // int to long
float floatValue = longValue; // long to float
double doubleValue = floatValue; // float to double
// Narrowing Conversion (Explicit Casting)
double doubleNum = 100.55;
int intNum = (int) doubleNum; // double to int
short shortNum = (short) intNum; // int to short
byte byteNum = (byte) shortNum; // short to byte
Widening is smooth sailing — each step up just holds more room for the value. Narrowing is where you need to slow down. Each step down risks chopping off data you actually wanted to keep.
So here's the real takeaway: trust implicit casting to behave. Treat explicit casting with a little more respect. You're telling Java "I know what I'm doing," and Java will take you at your word — even if that word costs you some precision.