Java Academy · leksjon

Regler for metodeoverlasting

Forstå hvordan Java velger mellom overlastede metoder, og vanlige fallgruver knyttet til tvetydighet.

Leksjon 1 av 413 trinn

Regler for metodeoverlasting 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.

Regler for metodeoverlasting

Metodeoverlasting lar deg definere flere metoder med samme navn, men med ulike parameterlister. Java velger det beste treffet ved kompilering ved hjelp av presise regler for metodeoppløsning.

Hva er overlasting?

Overlastede metoder har samme navn, men forskjellig antall parametere, parametertyper eller parameterrekkefølge. Returtypen alene er IKKE tilstrekkelig for overlasting.

class Calculator {
    int add(int a, int b)     { return a + b; }
    double add(double a, double b) { return a + b; }
    int add(int a, int b, int c)   { return a + b + c; }

    // compile error — same signature, different return type only:
    // long add(int a, int b) { return a + b; }
}

Calculator calc = new Calculator();
System.out.println(calc.add(1, 2));       // 3 (int)
System.out.println(calc.add(1.5, 2.5));   // 4.0 (double)
System.out.println(calc.add(1, 2, 3));    // 6 (3-arg)

Oppløsning: det mest spesifikke treffet

Java velger den mest spesifikke aktuelle metoden. Widening, autoboxing og varargs prøves i prioritert rekkefølge.

static void print(int x)    { System.out.println("int: "    + x); }
static void print(long x)   { System.out.println("long: "   + x); }
static void print(Object x) { System.out.println("Object: " + x); }

print(42);       // int: 42 (exact match — most specific)
print(42L);      // long: 42 (exact match)
print(3.14);     // Object: 3.14 (no float match, widening then autoboxing)

Widening før autoboxing

Java foretrekker å utvide en primitiv type fremfor å gjøre den om til en wrapper med autoboxing. Dette kan gi overraskende resultater.

static void display(long n)    { System.out.println("long: " + n); }
static void display(Integer n) { System.out.println("Integer: " + n); }

int x = 100;
display(x); // long: 100 — widens int to long BEFORE autoboxing to Integer
// This surprises many developers!

static void show(Long n)    { System.out.println("Long"); }
static void show(Integer n) { System.out.println("Integer"); }

// show(100); // compile error — ambiguous! Neither is more specific

Tvetydighet med null-argumenter

Det kan bli tvetydig å sende null til overlastede metoder hvis flere metoder godtar referansetyper. Bruk en typekonvertering av null for å løse tvetydigheten.

static void handle(String s)  { System.out.println("String: " + s); }
static void handle(Integer i) { System.out.println("Integer: " + i); }
static void handle(Object o)  { System.out.println("Object"); }

handle((String) null);  // String: null (cast resolves ambiguity)
handle((Integer) null); // Integer: null
// handle(null);        // compile error: ambiguous (String vs Integer)

Overlasting med arv

Metodeoppløsningen tar hensyn til den deklarerte typen til referansevariabelen, ikke kjøretidstypen – dette avgjøres ved kompilering.

class Animal {}
class Dog extends Animal {}

static void greet(Animal a) { System.out.println("Animal"); }
static void greet(Dog d)    { System.out.println("Dog"); }

Animal a = new Dog(); // declared as Animal
greet(a);   // Animal — compile-time type is Animal!

Dog d = new Dog();
greet(d);   // Dog — compile-time type is Dog

Overlasting kontra overstyring

Overlasting avgjøres ved kompilering (statisk dispatch). Overstyring avgjøres ved kjøring (dynamisk dispatch) basert på den faktiske objekttypen.

class Base {
    void run() { System.out.println("Base.run"); }
}
class Sub extends Base {
    @Override
    void run() { System.out.println("Sub.run"); } // overriding

    void run(int speed) { System.out.println("Sub.run(" + speed + ")"); } // overloading
}

Base b = new Sub();
b.run();     // Sub.run — override (runtime dispatch)
// b.run(10); // compile error — Base doesn't have run(int)

Vanlige mønstre for overlasting

Vanlig bruk av overlasting i API-er er å tilby praktiske metoder som videredelegerer til en variant med alle parametere.

class Connection {
    void connect(String host, int port, int timeout) {
        System.out.println("Connecting to " + host + ":" + port + " timeout=" + timeout);
    }

    // Convenience overloads
    void connect(String host, int port) {
        connect(host, port, 30); // delegate with default timeout
    }

    void connect(String host) {
        connect(host, 5432); // delegate with default port
    }
}

new Connection().connect("db.example.com");
// Connecting to db.example.com:5432 timeout=30

Overlasting og generiske typer

Overlasting av generiske metoder krever omtanke – type erasure kan gjøre to tilsynelatende ulike signaturer identiske etter kompilering.

// Type erasure problem: both methods erase to the same signature!
// static void process(List<String> list) {} // compile error
// static void process(List<Integer> list) {} // duplicate after erasure

// Solutions:
// 1. Use different method names: processStrings / processIntegers
// 2. Use a generic method with bounded type:
static <T extends Number> void processNumbers(List<T> list) {
    list.forEach(n -> System.out.println(n.doubleValue()));
}
processNumbers(List.of(1, 2, 3));
processNumbers(List.of(1.5, 2.5));

I praksis: Overlastinger i builder-stil

Overlasting er vanlig i builder- og factory-API-er for å tilby fleksibel opprettelse av objekter.

class Notification {
    final String title, body;
    final String imageUrl;
    final boolean urgent;

    // Factory overloads for convenience
    static Notification simple(String title, String body) {
        return new Notification(title, body, null, false);
    }
    static Notification urgent(String title, String body) {
        return new Notification(title, body, null, true);
    }
    static Notification withImage(String title, String body, String url) {
        return new Notification(title, body, url, false);
    }
    Notification(String title, String body, String imageUrl, boolean urgent) {
        this.title = title; this.body = body;
        this.imageUrl = imageUrl; this.urgent = urgent;
    }
}

Fallgruver ved overlasting

Unngå disse vanlige feilene ved overlasting:

  • For mange overlastinger for samme operasjon – bruk heller en builder
  • Overlastinger som bare skiller seg i parameterrekkefølge – dette er forvirrende
  • Overraskende widening: en int kan bli valgt som long i stedet for Integer
// Confusing: order-based overloads
// void save(String name, int age)  {}
// void save(int age, String name)  {} // very confusing!

// Better: use a record/DTO
record UserData(String name, int age) {}
void save(UserData data) {}

// Surprising widening
static void m(long x)   { System.out.println("long"); }
static void m(Integer x){ System.out.println("Integer"); }
int v = 5;
m(v); // long! widening preferred over autoboxing

Hurtigsjekk

Hvis en metode er overlastet med både long- og Integer-parametere, hvilken velges når du sender inn et int-argument?

Oppsummering: Regler for metodeoverlasting

Viktige poenger:

  • Overlasting skiller seg etter antall, type eller rekkefølge på parametere – IKKE bare etter returtype
  • Java løser overlastede metoder ved kompilering ved hjelp av den deklarerte typen til argumentene
  • Utvidelse av en primitiv type foretrekkes fremfor autoboxing til en wrapperklasse
  • null-argumenter kan føre til tvetydighet – bruk casting for å løse det: handle((String) null)
  • Overlasting skjer ved kompilering, mens overstyring skjer ved kjøring – dette er ulike mekanismer
  • Bruk praktiske overlastede metoder som delegerer til en hovedmetode med alle parametere
Gratis å komme i gang

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 «Regler for metodeoverlasting» gratis?

Ja – hele teksten i «Regler for metodeoverlasting» 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 «Regler for metodeoverlasting»?

Forstå hvordan Java velger mellom overlastede metoder, og vanlige fallgruver knyttet til tvetydighet. 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 «Regler for metodeoverlasting»?

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

  1. Regler for metodeoverlasting
  2. Varargs-parametere
  3. Statiske felt og konstanter
  4. Hjelpeklasser og statiske fabrikkmetoder
← Tilbake til Java Academy