Sobes.tech
Middle

Jakie są różnice między interfejsami w Kotlinie i Javie?

sobes.tech AI

Odpowiedź od AI

Główne różnice:

  • Implementacja metod domyślnych: W Java 8 i nowszych wersjach można implementować metody z ciałem (metody domyślne) w interfejsach. W Kotlinie metody w interfejsach mają domyślne ciała. Słowo kluczowe default nie jest potrzebne.

  • Metody abstrakcyjne i otwarte: W Java wszystkie metody interfejsu są domyślnie abstrakcyjne. Aby mieć metodę z ciałem, trzeba użyć default. W Kotlinie metody z ciałem w interfejsach są domyślnie open i mogą być nadpisywane w klasach implementujących interfejs. Metody bez ciała są domyślnie abstract.

  • Stan (Właściwości): W Java interfejsy nie mogą zawierać pól, tylko stałe (final static). W Kotlinie interfejsy mogą deklarować właściwości abstrakcyjne, które muszą być zaimplementowane w klasach, lub właściwości z domyślnymi getterami/setterami (backstage fields nie przechowują danych).

  • Konstruktory: W Java interfejsy nie mogą zawierać konstruktorów. W Kotlinie interfejsy również nie mogą zawierać konstruktorów.

  • Modyfikatory widoczności: W Java metody interfejsu są domyślnie public. W Kotlinie metody interfejsu są domyślnie public open.

Cecha Kotlin Java
Implementacja metod Dozwolona (domyślnie) Dozwolona (z default)
Abstrakcyjność metod Bez ciała - abstract, z ciałem - open Bez ciała - abstract, z ciałem - default
Właściwości (Properties) Dozwolone (abstrakcyjne lub z dostępami) Nie dozwolone (tylko stałe)
Konstruktory Nie dozwolone Nie dozwolone
Modyfikator widoczności public open domyślnie public domyślnie

Przykład w Kotlinie:

interface MyInterface {
    val myProperty: String // Właściwość abstrakcyjna

    fun abstractMethod() // Metoda abstrakcyjna

    fun defaultMethod() {
        // Domyślna implementacja
        println("Domyślna implementacja w interfejsie Kotlin")
    }
}

Przykład w Javie:

interface MyInterfaceJava {
    // Brak właściwości, dozwolone tylko stałe
    // public static final String MY_CONSTANT = "wartość";

    void abstractMethod(); // Metoda abstrakcyjna (domyślnie publiczna i abstrakcyjna)

    default void defaultMethod() { // Metoda domyślna
        // Domyślna implementacja
        System.out.println("Domyślna implementacja w interfejsie Java");
    }
}