Java Academy · leksjon

Opp- og nedkonvertering og instanceof

Forstå oppkonvertering til en foreldretype, trygg nedkonvertering med instanceof og vanlige fallgruver som fører til ClassCastException.

Leksjon 3 av 38 trinn

Opp- og nedkonvertering og instanceof er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 3. 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 3 leksjoner.

Oppkasting og nedkasting

Oppkasting lagrer et barnobjekt i en referanse av foreldretypen og er alltid trygt. Nedkasting går motsatt vei og krever forsiktighet. Vi bruker instanceof for å kontrollere den faktiske typen under kjøring.

Kode: demonstrasjon av oppkasting

Oppkasting skjer implisitt og er trygt: En Dog kan behandles som en Animal. Du kan kalle metoder som er deklarert i Animal, og Dog-versjonen kjøres under kjøring.

public class Main {
  static class Animal {
    void speak() { System.out.println("Animal sound"); }
  }
  static class Dog extends Animal {
    void speak() { System.out.println("Woof"); }
    void fetch() { System.out.println("Fetch!"); }
  }

  public static void main(String[] args) {
    // Upcasting: Dog stored in an Animal reference (safe, automatic)
    Animal a = new Dog();
    a.speak();  // calls Dog's speak() due to dynamic binding

    // a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
    System.out.println("Upcasting hides Dog-only methods from the reference type.");
  }
}

Hvorfor nedkaste?

Du nedkaster når du trenger en metode som bare finnes i underklassen, for eksempel fetch(). Dette bør skje sjelden og etter grundig kontroll. Skriv helst kode mot foreldreklassen eller et grensesnitt når det er mulig.

Kode: trygg nedkasting

Bruk instanceof før du kaster. Hvis kontrollen mislykkes, hopper du over kastingen og velger en annen løsning. Slik unngår du ClassCastException.

public class Main {
  static class Animal { void speak() { System.out.println("Animal sound"); } }
  static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { void speak() { System.out.println("Meow"); } }

  public static void main(String[] args) {
    Animal a1 = new Dog();
    Animal a2 = new Cat();

    // Safe downcast using instanceof
    if (a1 instanceof Dog) {
      Dog d = (Dog) a1;
      d.fetch(); // OK
    }

    if (a2 instanceof Dog) {
      Dog d2 = (Dog) a2; // will not run
      d2.fetch();
    } else {
      System.out.println("a2 is not a Dog, skip casting.");
    }
  }
}

Vanlige fallgruver

Fallgruve: Kasting uten kontroll kan utløse ClassCastException. En annen fallgruve er å bruke nedkasting for mye i stedet for å utforme løsningen rundt grensesnitt. Hold kastingen nær stedet der du trenger den, og foretrekk polymorfisme.

Kode: feil kast kontra trygt kast

Du må aldri kaste blindt. Hvis du ikke er sikker på typen under kjøring, må du beskytte kastingen med instanceof og velge et trygt alternativ hvis typen ikke stemmer.

public class Main {
  static class Animal { void speak() { System.out.println("Animal"); } }
  static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { }

  public static void main(String[] args) {
    Animal a = new Cat();

    // Bad: direct cast (would throw at runtime)
    // Dog dBad = (Dog) a; // ClassCastException if uncommented

    // Good: check first
    if (a instanceof Dog) {
      Dog d = (Dog) a;
      d.fetch();
    } else {
      System.out.println("Not a Dog; skipping cast.");
    }
  }
}

Kontroll av nedkasting

Kort kontroll: Hvordan nedkaster du trygt en Animal-referanse til Dog?

Oppsummering

Oppsummering: Oppkasting er trygt og vanlig. Nedkasting krever instanceof for å unngå krasj. Utform helst koden rundt foreldretyper eller grensesnitt for å redusere behovet for kasting.

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 «Opp- og nedkonvertering og instanceof» gratis?

Ja – hele teksten i «Opp- og nedkonvertering og instanceof» 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 3 leksjoner.

Hva lærer jeg i «Opp- og nedkonvertering og instanceof»?

Forstå oppkonvertering til en foreldretype, trygg nedkonvertering med instanceof og vanlige fallgruver som fører til ClassCastException. 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 3 av 3.

Hvor lang tid tar leksjonen «Opp- og nedkonvertering og instanceof»?

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. Abstrakte klasser
  2. Grensesnitt (introduksjon og sammenligninger)
  3. Opp- og nedkonvertering og instanceof
← Tilbake til Java Academy