Enums and Inner Classes

This lesson covers enums and inner classes—special types of classes in Java.

Enums

Enums are used to define a fixed set of constants.

Defining an Enum

JAVA
public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

Using Enums

JAVA
public class EnumDemo {
    public static void main(String[] args) {
        Season season = Season.SPRING;
        
        switch (season) {
            case SPRING:
                System.out.println("Spring");
                break;
            case SUMMER:
                System.out.println("Summer");
                break;
            case AUTUMN:
                System.out.println("Autumn");
                break;
            case WINTER:
                System.out.println("Winter");
                break;
        }
    }
}

Enum Attributes and Methods

JAVA
public enum Season {
    SPRING("Spring", 1),
    SUMMER("Summer", 2),
    AUTUMN("Autumn", 3),
    WINTER("Winter", 4);
    
    private String name;
    private int order;
    
    // Constructor
    Season(String name, int order) {
        this.name = name;
        this.order = order;
    }
    
    // Getters
    public String getName() {
        return name;
    }
    
    public int getOrder() {
        return order;
    }
}

Common Enum Methods

Method Description Example
values() All enum values Season.values()
valueOf() String to enum Season.valueOf("SPRING")
ordinal() Enum index Season.SPRING.ordinal() → 0
name() Enum name Season.SPRING.name() → "SPRING"

Example: Enum Methods

JAVA
public class EnumMethodDemo {
    public static void main(String[] args) {
        // Iterate all enum values
        for (Season s : Season.values()) {
            System.out.println(s.ordinal() + ": " + s.getName());
        }
        
        // String to enum
        Season spring = Season.valueOf("SPRING");
        System.out.println(spring.getName());  // Spring
        
        // Compare enums
        System.out.println(Season.SPRING == Season.SPRING);  // true
        System.out.println(Season.SPRING.equals(Season.SPRING));  // true
    }
}
▶ Try it Yourself

Example: Weekday Enum

JAVA
public enum Weekday {
    MONDAY("Monday", true),
    TUESDAY("Tuesday", true),
    WEDNESDAY("Wednesday", true),
    THURSDAY("Thursday", true),
    FRIDAY("Friday", true),
    SATURDAY("Saturday", false),
    SUNDAY("Sunday", false);
    
    private String name;
    private boolean isWorkday;
    
    Weekday(String name, boolean isWorkday) {
        this.name = name;
        this.isWorkday = isWorkday;
    }
    
    public String getName() {
        return name;
    }
    
    public boolean isWorkday() {
        return isWorkday;
    }
}

public class WeekdayDemo {
    public static void main(String[] args) {
        for (Weekday day : Weekday.values()) {
            String type = day.isWorkday() ? "Weekday" : "Weekend";
            System.out.println(day.getName() + " - " + type);
        }
    }
}
▶ Try it Yourself

Inner Classes

Inner classes are defined inside another class.

Member Inner Class

JAVA
public class Outer {
    private int x = 10;
    
    // Member inner class
    public class Inner {
        public void show() {
            // Can access outer class's private members
            System.out.println("x = " + x);
        }
    }
    
    public void test() {
        Inner inner = new Inner();
        inner.show();
    }
}

public class InnerClassDemo {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.show();  // x = 10
    }
}

Static Inner Class

JAVA
public class Outer {
    private static int x = 10;
    private int y = 20;
    
    // Static inner class
    public static class StaticInner {
        public void show() {
            // Can only access outer class's static members
            System.out.println("x = " + x);
            // System.out.println("y = " + y);  // Compile error!
        }
    }
}

public class StaticInnerDemo {
    public static void main(String[] args) {
        // No need to create outer class object
        Outer.StaticInner inner = new Outer.StaticInner();
        inner.show();  // x = 10
    }
}

Local Inner Class

JAVA
public class Outer {
    public void method() {
        // Local inner class: defined in a method
        class LocalInner {
            public void show() {
                System.out.println("Local inner class");
            }
        }
        
        LocalInner inner = new LocalInner();
        inner.show();
    }
}

Anonymous Inner Class

JAVA
public interface Greeting {
    void greet(String name);
}

public class AnonymousDemo {
    public static void main(String[] args) {
        // Anonymous inner class
        Greeting hello = new Greeting() {
            @Override
            public void greet(String name) {
                System.out.println("Hello, " + name + "!");
            }
        };
        
        hello.greet("Alice");  // Hello, Alice!
        
        // Lambda shorthand (functional interface)
        Greeting hi = name -> System.out.println("Hi, " + name + "!");
        hi.greet("Bob");  // Hi, Bob!
    }
}

Example: Anonymous Inner Class for Event Handling

JAVA
public interface OnClickListener {
    void onClick(String button);
}

public class Button {
    private String text;
    private OnClickListener listener;
    
    public Button(String text) {
        this.text = text;
    }
    
    public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
    }
    
    public void click() {
        if (listener != null) {
            listener.onClick(text);
        }
    }
}

public class ButtonDemo {
    public static void main(String[] args) {
        Button btn = new Button("Submit");
        
        // Anonymous inner class
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(String button) {
                System.out.println(button + " was clicked");
            }
        });
        
        btn.click();  // Submit was clicked
    }
}
▶ Try it Yourself

Inner Class Comparison

Type Location Access Outer Class Creation
Member inner class Inside class All members outer.new Inner()
Static inner class Inside class Static members new Outer.Inner()
Local inner class Inside method All members + local final Create inside method
Anonymous inner class Anywhere Same as local new Interface(){}

❓ Frequently Asked Questions

Q When should I use enums?
A When defining a fixed set of constants, like seasons, weekdays, or states.
Q When should I use anonymous inner classes?
A For simple interface implementations, especially event callbacks. Java 8+ recommends Lambda for functional interfaces.
Q What are inner classes used for?
A Implementing callbacks, accessing outer class private members, organizing related classes.

📖 Summary

📝 Exercises

  1. Season enum: Define a Season enum with season name and temperature range
  2. State machine: Implement order states using enums (Pending, Paid, Shipped, Completed)
  3. Anonymous inner class: Use anonymous inner class to implement Comparator sorting

Next Lesson

In the next lesson, we'll learn about Exception Handling — how to handle errors in programs.

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏