Java Academy · Lektion

Statiske indlejrede klasser

Definér statiske indlejrede klasser som tilknyttede hjælpertyper uden reference til en omsluttende instans.

Lektion 1 af 413 trin

Statiske indlejrede klasser er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Statiske indlejrede klasser

En statisk indlejret klasse er defineret inde i en anden klasse med nøgleordet static. Den har ingen reference til instansen af den omsluttende klasse — den er blot logisk grupperet sammen med den.

Deklaration af en statisk indlejret klasse

Brug navnet på den ydre klasse til at få adgang til den indlejrede klasse udefra.

class LinkedList<T> {
    private Node<T> head;

    // Static nested class — no outer instance reference
    private static class Node<T> {
        T data;
        Node<T> next;
        Node(T data) { this.data = data; }
    }

    public void addFirst(T item) {
        Node<T> node = new Node<>(item);
        node.next = head;
        head = node;
    }
}

Adgang udefra

Referér til en offentlig statisk indlejret klasse som OuterClass.InnerClass.

class Builder {
    public static class Config {
        public final String host;
        public final int port;
        Config(String host, int port) {
            this.host = host; this.port = port;
        }
    }
}

Builder.Config config = new Builder.Config("localhost", 8080);
System.out.println(config.host + ":" + config.port); // localhost:8080

Statisk indlejret kontra indre

Den afgørende forskel er, at statiske indlejrede klasser IKKE har en implicit reference til den ydre instans. Indre (ikke-statiske) klasser HAR en sådan reference.

class Outer {
    private int x = 10;

    // Static nested: no access to x
    static class StaticNested {
        void doSomething() {
            // System.out.println(x); // compile error — no outer reference!
            System.out.println("Static nested");
        }
    }

    // Inner class: has access to x
    class Inner {
        void doSomething() {
            System.out.println(x); // 10 — can access outer fields
        }
    }
}

Builder-mønsteret med en statisk indlejret klasse

Det klassiske Builder-mønster bruger en statisk indlejret klasse, så den kaldende kode ikke behøver en ydre instans for at oprette en builder.

class Pizza {
    private final String size, crust;
    private final List<String> toppings;

    private Pizza(Builder b) {
        this.size = b.size; this.crust = b.crust; this.toppings = List.copyOf(b.toppings);
    }

    public static class Builder {
        private String size = "medium", crust = "thin";
        private List<String> toppings = new ArrayList<>();
        public Builder size(String s)    { this.size = s; return this; }
        public Builder crust(String c)   { this.crust = c; return this; }
        public Builder topping(String t) { this.toppings.add(t); return this; }
        public Pizza build()             { return new Pizza(this); }
    }
}

Entry i maps

Map.Entry er en velkendt statisk indlejret grænseflade, der bruges til at gennemløbe nøgleværdi-par.

import java.util.*;

Map<String, Integer> scores = Map.of("Alice", 95, "Bob", 87, "Carol", 92);

for (Map.Entry<String, Integer> entry : scores.entrySet()) {
    System.out.printf("%-10s: %d%n", entry.getKey(), entry.getValue());
}

// Modern: using var
for (var entry : scores.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

Test med en statisk indlejret klasse

I enhedstest kan en statisk indlejret klasse indeholde testopsætninger eller simulerede implementeringer med et område begrænset til testklassen.

class UserServiceTest {
    // Static nested fake/stub — no outer instance needed
    static class FakeUserRepository implements UserRepository {
        private final Map<Long, User> store = new HashMap<>();

        public void save(User u) { store.put(u.id(), u); }

        public Optional<User> findById(long id) {
            return Optional.ofNullable(store.get(id));
        }
    }

    // @Test methods use FakeUserRepository
    void testFindUser() {
        FakeUserRepository repo = new FakeUserRepository();
        // ...
    }
}

Statisk indlejret klasse til domænelogik

Gruppér relaterede typer ved hjælp af statiske indlejrede klasser for at opnå bedre organisering i domænemodeller.

class Order {
    private final long id;
    private final List<LineItem> items;

    // Static nested — logically belongs to Order, no outer reference needed
    public static class LineItem {
        public final String sku;
        public final int quantity;
        public final double unitPrice;

        public LineItem(String sku, int qty, double price) {
            this.sku = sku; this.quantity = qty; this.unitPrice = price;
        }

        public double total() { return quantity * unitPrice; }
    }

    // ...
}

Sammenligning: statisk indlejret kontra klasse på øverste niveau

Foretræk en statisk indlejret klasse, når en klasse kun bruges i sammenhæng med den ydre klasse. Brug en klasse på øverste niveau, når den har bredere anvendelse.

Statiske indlejrede klasser med generiske typer

Statiske indlejrede klasser indgår i generiske typer på samme måde som klasser på øverste niveau.

class Pair<A, B> {
    // Static nested with its own type params
    public static class Mutable<X, Y> {
        public X first;
        public Y second;
        public Mutable(X first, Y second) {
            this.first = first; this.second = second;
        }
    }

    public static <X, Y> Mutable<X, Y> mutableOf(X x, Y y) {
        return new Mutable<>(x, y);
    }
}
Pair.Mutable<String, Integer> p = Pair.mutableOf("Alice", 30);
System.out.println(p.first + " is " + p.second); // Alice is 30

Hukommelseseffektivitet

Statiske indlejrede klasser indeholder ikke en reference til den ydre instans. Det forhindrer, at det ydre objekt utilsigtet fastholdes i hukommelsen, hvilket kan medføre hukommelseslækager i strukturer med lang levetid.

Hurtigt tjek

Hvad adskiller en statisk indlejret klasse fra en indre (ikke-statisk) klasse?

Opsummering: Statiske indlejrede klasser

Vigtigste pointer:

  • Statiske indlejrede klasser grupperes med den ydre klasse, men har ingen reference til en ydre instans
  • Adgang udefra: OuterClass.NestedClass
  • En manglende implicit reference betyder, at den ydre instans ikke fastholdes utilsigtet i hukommelsen
  • Builder-mønsteret bruger ofte en statisk indlejret Builder-klasse
  • Map.Entry er en velkendt statisk indlejret grænseflade
  • Foretræk statisk indlejring, når den indre klasse ikke har brug for adgang til den ydre instans
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Statiske indlejrede klasser” gratis?

Ja — hele teksten til “Statiske indlejrede klasser” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Statiske indlejrede klasser”?

Definér statiske indlejrede klasser som tilknyttede hjælpertyper uden reference til en omsluttende instans. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Statiske indlejrede klasser”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Statiske indlejrede klasser
  2. Indre klasser og adgang til ydre klasser
  3. Lokale og anonyme klasser
  4. Valg af den rette indlejringsstrategi
← Tilbage til Java Academy