Statiske nestede klasser
Definer statiske nestede klasser som tilknyttede hjelpetyper uten referanse til en omsluttende instans.
Statiske nestede klasser er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Statiske nestede klasser
En statisk nestet klasse er definert inne i en annen klasse med nøkkelordet static. Den har ingen referanse til instansen av den omsluttende klassen – den er bare logisk gruppert sammen med den.
Deklarere en statisk nestet klasse
Bruk navnet på den ytre klassen for å få tilgang til den nestede klassen utenfra.
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;
}
}Tilgang utenfra
Referer til en offentlig statisk nestet 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:8080Statisk nestet klasse kontra indre klasse
Den viktigste forskjellen er at statiske nestede klasser IKKE har en implisitt referanse til den ytre instansen. Indre (ikke-statiske) klasser HAR en slik referanse.
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 statisk nestet klasse
Det klassiske Builder-mønsteret bruker en statisk nestet klasse, slik at kallere ikke trenger en ytre instans for å opprette 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 et velkjent statisk nestet grensesnitt som brukes til å iterere over nøkkel-verdi-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());
}Testing med statisk nestet klasse
I enhetstester kan en statisk nestet klasse inneholde testdata eller mock-implementasjoner som er avgrenset 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 nestet klasse for domenelogikk
Gruppér relaterte typer ved hjelp av statiske nestede klasser for bedre organisering i domenemodeller.
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 nestet klasse kontra toppnivåklasse
Foretrekk en statisk nestet klasse når en klasse bare brukes i konteksten til den ytre klassen. Bruk en toppnivåklasse når den har et bredere bruksområde.
Statiske nestede klasser med generiske typer
Statiske nestede klasser fungerer med generiske typer på samme måte som toppnivåklasser.
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 30Minneeffektivitet
Statiske nestede klasser holder ikke en referanse til den ytre instansen. Dette hindrer at det ytre objektet beholdes i minnet ved et uhell, noe som kan føre til minnelekkasjer i strukturer som lever lenge.
Hurtigsjekk
Hva skiller en statisk nestet klasse fra en indre (ikke-statisk) klasse?
Oppsummering: Statiske nestede klasser
Viktige poenger:
- Statiske nestede klasser grupperes med den ytre klassen, men har ingen referanse til en ytre instans
- Tilgang utenfra: OuterClass.NestedClass
- En manglende implisitt referanse hindrer at den ytre instansen beholdes i minnet ved et uhell
- Builder-mønsteret bruker ofte en statisk nestet Builder-klasse
- Map.Entry er et velkjent statisk nestet grensesnitt
- Foretrekk statisk nestet klasse når den indre klassen ikke trenger tilgang til den ytre instansen
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Statiske nestede klasser» gratis?
Ja – hele teksten i «Statiske nestede klasser» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Statiske nestede klasser»?
Definer statiske nestede klasser som tilknyttede hjelpetyper uten referanse til en omsluttende instans. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Statiske nestede klasser»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Statiske nestede klasser
- Indre klasser og tilgang til ytre klasser
- Lokale og anonyme klasser
- Velge riktig strategi for nøsting