Variable Scope
Overview
Variable Scope dictates where a variable can be accessed or modified within your code. Java uses strict Block Scope, meaning a variable's life is entirely defined by the curly braces {} it was created inside.
There are three main levels of scope in Java:
1. Class Level (Instance/Static Variables): Declared directly inside the class. They are accessible by all methods within that class.
2. Method Level (Local Variables): Declared inside a method. They only exist while that method is running and are completely invisible to other methods.
3. Block Level: Declared inside a loop or an if statement. They are destroyed the moment that specific block of code finishes executing.
Syntax
Understanding scope prevents 'Variable cannot be resolved to a symbol' errors. If you need a variable to survive outside of a loop or if-statement, you MUST declare it above the block.
public class ScopeExample {
// Class Scope: Accessible everywhere in this class
int globalScore = 100;
public void playLevel() {
// Method Scope: Only accessible inside playLevel()
int levelScore = 50;
if (levelScore > 0) {
// Block Scope: Only accessible inside this IF statement
int bonus = 10;
globalScore = globalScore + bonus; // Valid, globalScore is class level
}
// System.out.println(bonus); // ERROR! 'bonus' was destroyed when the IF block ended.
}
public void printScore() {
System.out.println(globalScore); // Valid
// System.out.println(levelScore); // ERROR! 'levelScore' belongs to playLevel()
}
}Common Pitfalls
- Variable Shadowing. If you declare a local variable inside a method with the EXACT same name as a Class variable, the local variable 'shadows' (hides) the class variable. Modifying it will only modify the local copy, leading to highly confusing bugs.
- Declaring the return variable inside a
tryblock. If you declare a variable inside a try-catch block, you cannot return it at the end of the method because its scope died at the closing brace of the try block. Declare it before the try block.
Interview Questions
As soon as the execution reaches the closing curly brace } of the block or method where it was declared, it is popped off the Call Stack and instantly destroyed.
You use the this keyword. For example, this.name = name; specifically targets the Class level variable on the left, and the local method parameter on the right.
Real-World Example
When iterating through thousands of database records in a for loop, you should declare temporary calculation variables INSIDE the loop block. This ensures the memory is instantly freed/recycled after each iteration, rather than accumulating garbage data.
for(Record record : records) {
// Temp variable dies every iteration, keeping memory clean
BigDecimal tempCalculation = record.getAmount().multiply(taxRate);
total = total.add(tempCalculation);
}Check Your Knowledge
Test your understanding of Variable Scope with these quick questions.