Inner class is associated with an instance of its enclosing class
It has direct access to that object’s methods and fields
Local Class
They are defined in a block which is typically method/for-loop/if-clause etc.
Local class can only access local variables that are declared final or effectively final
When a local class accesses a local variable or parameter of the enclosing block, it captures that variable or parameter
public class LocalClassExample { static String regularExpression = "[^0-9]"; final int numberLength = 10; // captured variable public static void validatePhoneNumber(String p1, String p2) { class PhoneNumber { String formattedPhoneNumber = null; PhoneNumber(String phoneNumber) { String currentNumber = phoneNumber.replaceAll( regularExpression, ""); if (currentNumber.length() == numberLength) formattedPhoneNumber = currentNumber; else formattedPhoneNumber = null; } public String getNumber() { return formattedPhoneNumber; } } PhoneNumber myNumber1 = new PhoneNumber(p1); PhoneNumber myNumber2 = new PhoneNumber(p2); if (myNumber1.getNumber() == null) System.out.println("First number is invalid"); else System.out.println("First number is " + myNumber1.getNumber()); if (myNumber2.getNumber() == null) System.out.println("Second number is invalid"); else System.out.println("Second number is " + myNumber2.getNumber()); } public static void main(String... args) { validatePhoneNumber("123-456-7890", "456-7890"); // First number is 1234567890 // Second number is invalid }}